mirror of
https://gitlab.com/manzerbredes/ochess.git
synced 2025-04-07 02:26:29 +02:00
Improve pgn save performance
This commit is contained in:
parent
64dec753e7
commit
c6f648cfb4
8 changed files with 48 additions and 24 deletions
|
@ -2,7 +2,7 @@
|
||||||
#include <wx/filename.h>
|
#include <wx/filename.h>
|
||||||
|
|
||||||
BaseTab::BaseTab(wxFrame *parent, std::string base_file)
|
BaseTab::BaseTab(wxFrame *parent, std::string base_file)
|
||||||
: BasePanelBF(parent), TabInfos(TabInfos::BASE), base(NULL) {
|
: BasePanelBF(parent), base_file(base_file), TabInfos(TabInfos::BASE), base(NULL) {
|
||||||
|
|
||||||
game_list->InsertColumn(0, L"id", wxLIST_FORMAT_LEFT, 50);
|
game_list->InsertColumn(0, L"id", wxLIST_FORMAT_LEFT, 50);
|
||||||
game_list->InsertColumn(1, L"White", wxLIST_FORMAT_LEFT, 200);
|
game_list->InsertColumn(1, L"White", wxLIST_FORMAT_LEFT, 200);
|
||||||
|
@ -16,7 +16,7 @@ BaseTab::BaseTab(wxFrame *parent, std::string base_file)
|
||||||
this->Bind(wxEVT_BUTTON, &BaseTab::OnSave, this, ID_SAVE_BUTTON);
|
this->Bind(wxEVT_BUTTON, &BaseTab::OnSave, this, ID_SAVE_BUTTON);
|
||||||
this->Bind(wxEVT_LIST_ITEM_ACTIVATED, &BaseTab::OnOpenGame, this, wxID_ANY);
|
this->Bind(wxEVT_LIST_ITEM_ACTIVATED, &BaseTab::OnOpenGame, this, wxID_ANY);
|
||||||
current_base->SetLabel(base_file);
|
current_base->SetLabel(base_file);
|
||||||
LoadFile(base_file);
|
LoadFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseTab::OnDelete(wxCommandEvent &event) {
|
void BaseTab::OnDelete(wxCommandEvent &event) {
|
||||||
|
@ -39,8 +39,9 @@ void BaseTab::OnSave(wxCommandEvent &event) {
|
||||||
std::vector<GameBase *> new_games_bases;
|
std::vector<GameBase *> new_games_bases;
|
||||||
std::vector<Game *> new_games;
|
std::vector<Game *> new_games;
|
||||||
base->Save(deleted, new_games_bases, new_games);
|
base->Save(deleted, new_games_bases, new_games);
|
||||||
game_list->ClearAll();
|
game_list->DeleteAllItems();
|
||||||
deleted.clear();
|
deleted.clear();
|
||||||
|
LoadFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseTab::OnOpenGame(wxListEvent &event) {
|
void BaseTab::OnOpenGame(wxListEvent &event) {
|
||||||
|
@ -57,11 +58,11 @@ void BaseTab::OnOpenGame(wxListEvent &event) {
|
||||||
|
|
||||||
void BaseTab::ApplyPreferences() {}
|
void BaseTab::ApplyPreferences() {}
|
||||||
|
|
||||||
void BaseTab::LoadFile(std::string path) {
|
void BaseTab::LoadFile() {
|
||||||
wxFileName file(path);
|
wxFileName file(base_file);
|
||||||
wxString ext = file.GetExt().Lower();
|
wxString ext = file.GetExt().Lower();
|
||||||
if (ext == "pgn") {
|
if (ext == "pgn") {
|
||||||
base = new PGNGameBase(path);
|
base = new PGNGameBase(base_file);
|
||||||
SetLabel(file.GetName() + "(PGN)");
|
SetLabel(file.GetName() + "(PGN)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,12 @@ wxDECLARE_EVENT(REFRESH_TAB_TITLE, wxCommandEvent);
|
||||||
class BaseTab : public BasePanelBF, public TabInfos {
|
class BaseTab : public BasePanelBF, public TabInfos {
|
||||||
GameBase *base;
|
GameBase *base;
|
||||||
std::vector<std::uint32_t> deleted;
|
std::vector<std::uint32_t> deleted;
|
||||||
|
std::string base_file;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BaseTab(wxFrame *parent, std::string base_file);
|
BaseTab(wxFrame *parent, std::string base_file);
|
||||||
void ApplyPreferences();
|
void ApplyPreferences();
|
||||||
void LoadFile(std::string path);
|
void LoadFile();
|
||||||
void OnDelete(wxCommandEvent &event);
|
void OnDelete(wxCommandEvent &event);
|
||||||
void OnSave(wxCommandEvent &event);
|
void OnSave(wxCommandEvent &event);
|
||||||
void OnOpenGame(wxListEvent &event);
|
void OnOpenGame(wxListEvent &event);
|
||||||
|
|
|
@ -31,7 +31,8 @@ Game *PGNGameBase::GetCurrentGame() {
|
||||||
if (pgn->HasTag("FEN")) {
|
if (pgn->HasTag("FEN")) {
|
||||||
fen = pgn->GetTagValue("FEN");
|
fen = pgn->GetTagValue("FEN");
|
||||||
}
|
}
|
||||||
HalfMove *m = new HalfMove(pgnp_moves, fen);
|
HalfMove *m = new HalfMove(pgnp_moves);
|
||||||
|
m->SetFen(fen);
|
||||||
Game *g = new Game(m, fen);
|
Game *g = new Game(m, fen);
|
||||||
for (std::string &s : pgn->GetTagList()) {
|
for (std::string &s : pgn->GetTagList()) {
|
||||||
g->SetTag(s, pgn->GetTagValue(s));
|
g->SetTag(s, pgn->GetTagValue(s));
|
||||||
|
|
|
@ -144,3 +144,9 @@ std::string Game::GetPGN() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::SetResult(std::string result) { this->result = result; }
|
void Game::SetResult(std::string result) { this->result = result; }
|
||||||
|
|
||||||
|
void Game::BuildAndVerify() {
|
||||||
|
if (moves != NULL) {
|
||||||
|
moves->BuildAndVerify(GetFen());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -37,4 +37,5 @@ public:
|
||||||
std::vector<std::string> ListTags();
|
std::vector<std::string> ListTags();
|
||||||
std::string GetPGN();
|
std::string GetPGN();
|
||||||
void SetResult(std::string result);
|
void SetResult(std::string result);
|
||||||
|
void BuildAndVerify();
|
||||||
};
|
};
|
|
@ -10,6 +10,7 @@ GameTab::GameTab(wxFrame *parent, Game *game)
|
||||||
splitter->SetMinimumPaneSize(100);
|
splitter->SetMinimumPaneSize(100);
|
||||||
|
|
||||||
// Panels
|
// Panels
|
||||||
|
game->BuildAndVerify();
|
||||||
board_panel = new BoardPanel((wxFrame *)splitter, game);
|
board_panel = new BoardPanel((wxFrame *)splitter, game);
|
||||||
editor_panel = new EditorPanel((wxFrame *)splitter, game);
|
editor_panel = new EditorPanel((wxFrame *)splitter, game);
|
||||||
splitter->SplitVertically(board_panel, editor_panel);
|
splitter->SplitVertically(board_panel, editor_panel);
|
||||||
|
|
|
@ -115,27 +115,16 @@ void HalfMove::SetAsMainline() {
|
||||||
|
|
||||||
HalfMove *HalfMove::GetMainline() { return (mainline); }
|
HalfMove *HalfMove::GetMainline() { return (mainline); }
|
||||||
|
|
||||||
HalfMove::HalfMove(pgnp::HalfMove *m, std::string initial_fen) : capture(' ') {
|
HalfMove::HalfMove(pgnp::HalfMove *m) : capture(' ') {
|
||||||
chessarbiter::ChessArbiter arbiter;
|
|
||||||
arbiter.Setup(initial_fen);
|
|
||||||
bool work = arbiter.Play(arbiter.ParseSAN(m->move));
|
|
||||||
if (!work) {
|
|
||||||
wxLogDebug("Bug! %s", m->move);
|
|
||||||
}
|
|
||||||
char capture = arbiter.GetCapture();
|
|
||||||
if (capture != ' ') {
|
|
||||||
this->capture = capture;
|
|
||||||
}
|
|
||||||
this->fen = arbiter.GetFEN();
|
|
||||||
this->move = m->move;
|
this->move = m->move;
|
||||||
this->IsBlack = m->isBlack;
|
this->IsBlack = m->isBlack;
|
||||||
this->SetComment(m->comment);
|
this->SetComment(m->comment);
|
||||||
this->Number = m->count;
|
this->Number = m->count;
|
||||||
if (m->MainLine != NULL) {
|
if (m->MainLine != NULL) {
|
||||||
this->SetMainline(new HalfMove(m->MainLine, arbiter.GetFEN()));
|
this->SetMainline(new HalfMove(m->MainLine));
|
||||||
}
|
}
|
||||||
for (pgnp::HalfMove *v : m->variations) {
|
for (pgnp::HalfMove *v : m->variations) {
|
||||||
this->AddVariation(new HalfMove(v, initial_fen));
|
this->AddVariation(new HalfMove(v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,3 +205,25 @@ std::string HalfMove::GetPGN(bool needDots) {
|
||||||
|
|
||||||
return (part);
|
return (part);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HalfMove::BuildAndVerify(HalfMove *m, std::string fen) {
|
||||||
|
arbiter.Setup(fen);
|
||||||
|
bool work = arbiter.Play(arbiter.ParseSAN(m->move));
|
||||||
|
if (!work) {
|
||||||
|
wxLogDebug("Bug! %s", m->move);
|
||||||
|
}
|
||||||
|
char capture = arbiter.GetCapture();
|
||||||
|
if (capture != ' ') {
|
||||||
|
m->capture = capture;
|
||||||
|
}
|
||||||
|
m->fen = arbiter.GetFEN();
|
||||||
|
if (m->mainline != NULL) {
|
||||||
|
BuildAndVerify(m->mainline, arbiter.GetFEN());
|
||||||
|
}
|
||||||
|
for (HalfMove *v : m->variations) {
|
||||||
|
BuildAndVerify(v,fen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void HalfMove::BuildAndVerify(std::string initial_fen) {
|
||||||
|
BuildAndVerify(this, initial_fen);
|
||||||
|
}
|
|
@ -16,15 +16,17 @@
|
||||||
class HalfMove : public cgeditor::CGEHalfMove {
|
class HalfMove : public cgeditor::CGEHalfMove {
|
||||||
HalfMove *parent = NULL;
|
HalfMove *parent = NULL;
|
||||||
HalfMove *mainline = NULL;
|
HalfMove *mainline = NULL;
|
||||||
|
chessarbiter::ChessArbiter arbiter;
|
||||||
std::vector<HalfMove *> variations;
|
std::vector<HalfMove *> variations;
|
||||||
std::string fen;
|
std::string fen;
|
||||||
char capture;
|
char capture;
|
||||||
std::string GetPGN(bool needDots);
|
std::string GetPGN(bool needDots);
|
||||||
|
void BuildAndVerify(HalfMove *m, std::string fen);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HalfMove(std::string move);
|
HalfMove(std::string move);
|
||||||
HalfMove(std::string move, std::string fen);
|
HalfMove(std::string move, std::string fen);
|
||||||
HalfMove(pgnp::HalfMove *m, std::string initial_fen);
|
HalfMove(pgnp::HalfMove *m);
|
||||||
|
|
||||||
~HalfMove();
|
~HalfMove();
|
||||||
/// @brief Add variation to current move
|
/// @brief Add variation to current move
|
||||||
|
@ -53,5 +55,5 @@ public:
|
||||||
void SetFen(std::string fen);
|
void SetFen(std::string fen);
|
||||||
void SetCapture(char c);
|
void SetCapture(char c);
|
||||||
std::string GetPGN();
|
std::string GetPGN();
|
||||||
|
void BuildAndVerify(std::string initial_fen);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue