From f99a7b699a6169003fc8b56f652de44c2e834ca5 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Thu, 24 Feb 2022 15:22:56 +0100 Subject: [PATCH] Improve BaseTab pgn loading --- src/base_tab/BasePanelBF.cpp | 2 +- src/base_tab/BaseTab.cpp | 44 +++++++++++++------ src/base_tab/BaseTab.hpp | 5 ++- src/base_tab/gamebase/GameBase.hpp | 5 ++- src/base_tab/gamebase/PGNGameBase.cpp | 63 +++++++++++++++++---------- src/base_tab/gamebase/PGNGameBase.hpp | 14 +++--- tools/wxframebuilder/BasePanel.fbp | 2 +- 7 files changed, 87 insertions(+), 48 deletions(-) diff --git a/src/base_tab/BasePanelBF.cpp b/src/base_tab/BasePanelBF.cpp index 59dd152..e7a5dfb 100644 --- a/src/base_tab/BasePanelBF.cpp +++ b/src/base_tab/BasePanelBF.cpp @@ -33,7 +33,7 @@ BasePanelBF::BasePanelBF( wxWindow* parent, wxWindowID id, const wxPoint& pos, c main_sizer->Add( top_sizer, 0, wxEXPAND, 5 ); - game_list = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxLC_ICON|wxLC_REPORT ); + game_list = new wxListCtrl( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxLC_REPORT ); main_sizer->Add( game_list, 1, wxALL|wxEXPAND, 5 ); wxBoxSizer* bottom_sizer; diff --git a/src/base_tab/BaseTab.cpp b/src/base_tab/BaseTab.cpp index 9be9274..f1fd107 100644 --- a/src/base_tab/BaseTab.cpp +++ b/src/base_tab/BaseTab.cpp @@ -4,19 +4,29 @@ BaseTab::BaseTab(wxFrame *parent) : BasePanelBF(parent), TabInfos(TabInfos::BASE), base(NULL) { - wxListItem col0; - col0.SetId(0); - col0.SetText(_("White")); - col0.SetWidth(200); - game_list->InsertColumn(0, col0); + game_list->InsertColumn(0, L"id", wxLIST_FORMAT_LEFT, 50); + game_list->InsertColumn(1, L"White", wxLIST_FORMAT_LEFT, 200); + game_list->InsertColumn(2, L"Black", wxLIST_FORMAT_LEFT, 200); + game_list->InsertColumn(3, L"Event", wxLIST_FORMAT_LEFT, 200); + game_list->InsertColumn(4, L"Round", wxLIST_FORMAT_LEFT, 100); + game_list->InsertColumn(5, L"Result", wxLIST_FORMAT_LEFT, 200); + game_list->InsertColumn(6, L"Result", wxLIST_FORMAT_LEFT, 200); - wxListItem col1; - col1.SetId(1); - col1.SetText(_("Black")); - col1.SetWidth(200); - game_list->InsertColumn(1, col1); + this->Bind(wxEVT_BUTTON, &BaseTab::OnBim, this, wxID_ANY); + this->Bind(wxEVT_LIST_ITEM_ACTIVATED, &BaseTab::OnOpenGame, this, wxID_ANY); +} - //LoadFile("/home/loic/test.pgn"); +void BaseTab::OnBim(wxCommandEvent &event) { + //LoadFile("/home/loic/hartwig.pgn"); +} + +void BaseTab::OnOpenGame(wxListEvent &event) { + wxLogDebug("Open!"); + long id=std::stoi(event.GetItem().GetText().ToStdString()); + Game *g = base->GetGame(id); + if (g != NULL) { + wxLogDebug("Open game: %s", g->GetTag("White")); + } } void BaseTab::ApplyPreferences() {} @@ -29,9 +39,15 @@ void BaseTab::LoadFile(std::string path) { } if (base != NULL) { - while (base->HasNextGame()) { - Game *g = base->GetNextGame(); - long itemIndex = game_list->InsertItem(0, g->GetTag("White")); // want this for col. 1 + long id = 0; + while (base->NextGame()) { + long index = game_list->InsertItem(0, std::to_string(id)); // want this for col. 1 + game_list->SetItem(index, 1, base->GetTag("White")); + game_list->SetItem(index, 2, base->GetTag("Black")); + game_list->SetItem(index, 3, base->GetTag("Event")); + game_list->SetItem(index, 4, base->GetTag("Round")); + game_list->SetItem(index, 5, base->GetTag("Result")); + id++; } } } \ No newline at end of file diff --git a/src/base_tab/BaseTab.hpp b/src/base_tab/BaseTab.hpp index 30d839a..5a71cd7 100644 --- a/src/base_tab/BaseTab.hpp +++ b/src/base_tab/BaseTab.hpp @@ -1,13 +1,16 @@ -#include "ochess.hpp" #include "BasePanelBF.h" #include "gamebase/GameBase.hpp" #include "gamebase/PGNGameBase.hpp" +#include "ochess.hpp" class BaseTab : public BasePanelBF, public TabInfos { GameBase *base; + public: BaseTab(wxFrame *parent); void ApplyPreferences(); void LoadFile(std::string path); + void OnBim(wxCommandEvent &event); + void OnOpenGame(wxListEvent &event); }; \ No newline at end of file diff --git a/src/base_tab/gamebase/GameBase.hpp b/src/base_tab/gamebase/GameBase.hpp index 9982a7d..828248c 100644 --- a/src/base_tab/gamebase/GameBase.hpp +++ b/src/base_tab/gamebase/GameBase.hpp @@ -4,7 +4,8 @@ class GameBase { public: - virtual bool HasNextGame() = 0; virtual Game *GetGame(std::uint32_t id) = 0; - virtual Game *GetNextGame() = 0; + virtual bool NextGame() = 0; + virtual std::string GetTag(std::string tag) = 0; + virtual void Reset() = 0; }; \ No newline at end of file diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp index 39775d1..08c8803 100644 --- a/src/base_tab/gamebase/PGNGameBase.cpp +++ b/src/base_tab/gamebase/PGNGameBase.cpp @@ -1,35 +1,54 @@ #include "PGNGameBase.hpp" -PGNGameBase::PGNGameBase(std::string pgn_file) - : pgn(new pgnp::PGN()), hasNextGame(false) { +PGNGameBase::PGNGameBase(std::string pgn_file) : pgn(new pgnp::PGN()) { + file = pgn_file; pgn->FromFile(pgn_file); - ParseNextGame(); } -bool PGNGameBase::HasNextGame() { return (hasNextGame); } - -void PGNGameBase::ParseNextGame() { +bool PGNGameBase::NextGame() { + bool game_found = false; try { pgn->ParseNextGame(); - hasNextGame = true; + game_found = true; } catch (...) { - hasNextGame = false; + game_found = false; } + return (game_found); } -Game *PGNGameBase::GetNextGame() { - pgnp::HalfMove *pgnp_moves = new pgnp::HalfMove(); - pgn->GetMoves(pgnp_moves); - std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; - if (pgn->HasTag("FEN")) { - fen = pgn->GetTagValue("FEN"); +std::string PGNGameBase::GetTag(std::string tag) { + if (pgn->HasTag(tag)) { + return (pgn->GetTagValue(tag)); } - HalfMove *m = new HalfMove(pgnp_moves, fen); - Game *g = new Game(m, fen); - for (std::string &s : pgn->GetTagList()) { - g->SetTag(s, pgn->GetTagValue(s)); - } - - ParseNextGame(); - return (g); + return (""); +} + +void PGNGameBase::Reset() { + delete pgn; + pgn = new pgnp::PGN(); + pgn->FromFile(file); +} + +Game *PGNGameBase::GetGame(std::uint32_t id) { + Reset(); + std::uint32_t curid = 0; + while(NextGame()) { + if (id == curid) { + pgnp::HalfMove *pgnp_moves = new pgnp::HalfMove(); + pgn->GetMoves(pgnp_moves); + std::string fen = + "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; + if (pgn->HasTag("FEN")) { + fen = pgn->GetTagValue("FEN"); + } + HalfMove *m = new HalfMove(pgnp_moves, fen); + Game *g = new Game(m, fen); + for (std::string &s : pgn->GetTagList()) { + g->SetTag(s, pgn->GetTagValue(s)); + } + return (g); + } + curid++; + } + return (NULL); } diff --git a/src/base_tab/gamebase/PGNGameBase.hpp b/src/base_tab/gamebase/PGNGameBase.hpp index b58bdca..1ad58a1 100644 --- a/src/base_tab/gamebase/PGNGameBase.hpp +++ b/src/base_tab/gamebase/PGNGameBase.hpp @@ -2,14 +2,14 @@ #include "pgnp.hpp" class PGNGameBase : public GameBase { - pgnp::PGN *pgn; - bool hasNextGame; + pgnp::PGN *pgn; + bool hasNextGame; + std::string file; - void ParseNextGame(); public: PGNGameBase(std::string pgn_file); - - bool HasNextGame(); - Game *GetGame(std::uint32_t id) { return (new Game()); }; - Game *GetNextGame(); + Game *GetGame(std::uint32_t id); + bool NextGame(); + std::string GetTag(std::string tag); + void Reset(); }; \ No newline at end of file diff --git a/tools/wxframebuilder/BasePanel.fbp b/tools/wxframebuilder/BasePanel.fbp index ca01e99..619984a 100644 --- a/tools/wxframebuilder/BasePanel.fbp +++ b/tools/wxframebuilder/BasePanel.fbp @@ -388,7 +388,7 @@ Resizable 1 -1,-1 - wxLC_ICON + wxLC_REPORT ; ; forward_declare 0