From 64dec753e7a6594a8b68f7978773e80353d8e869 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Fri, 25 Feb 2022 11:13:35 +0100 Subject: Enable PGN save (slow for now so do not use it). --- src/base_tab/gamebase/GameBase.hpp | 6 ++++ src/base_tab/gamebase/PGNGameBase.cpp | 63 +++++++++++++++++++++++++++-------- src/base_tab/gamebase/PGNGameBase.hpp | 4 +++ 3 files changed, 60 insertions(+), 13 deletions(-) (limited to 'src/base_tab/gamebase') diff --git a/src/base_tab/gamebase/GameBase.hpp b/src/base_tab/gamebase/GameBase.hpp index 828248c..db58bcc 100644 --- a/src/base_tab/gamebase/GameBase.hpp +++ b/src/base_tab/gamebase/GameBase.hpp @@ -1,10 +1,16 @@ #pragma once #include "game_tab/Game.hpp" +#include +#include class GameBase { public: virtual Game *GetGame(std::uint32_t id) = 0; + virtual void Save(std::vector to_ignore, + std::vector new_games_bases, + std::vector new_games) = 0; + virtual Game *GetCurrentGame() = 0; virtual bool NextGame() = 0; virtual std::string GetTag(std::string tag) = 0; virtual void Reset() = 0; diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp index 8f9974d..69dcc4f 100644 --- a/src/base_tab/gamebase/PGNGameBase.cpp +++ b/src/base_tab/gamebase/PGNGameBase.cpp @@ -1,4 +1,5 @@ #include "PGNGameBase.hpp" +#include PGNGameBase::PGNGameBase(std::string pgn_file) : pgn(new pgnp::PGN()) { file = pgn_file; @@ -23,6 +24,22 @@ std::string PGNGameBase::GetTag(std::string tag) { return (""); } +Game *PGNGameBase::GetCurrentGame() { + 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)); + } + g->SetResult(pgn->GetResult()); + return (g); +} + void PGNGameBase::Reset() { delete pgn; pgn = new pgnp::PGN(); @@ -34,21 +51,41 @@ Game *PGNGameBase::GetGame(std::uint32_t id) { 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); + return (GetCurrentGame()); } curid++; } return (NULL); } + +void PGNGameBase::Save(std::vector to_ignore, + std::vector new_games_bases, + std::vector new_games) { + wxStandardPaths stdPaths = wxStandardPaths::Get(); + wxString tmp = stdPaths.GetTempDir() + "/save_pgn_tmp.pgn"; + wxFile new_pgn(tmp, wxFile::write); + + Reset(); + std::uint32_t id = 0; + while (NextGame()) { + if (std::find(to_ignore.begin(), to_ignore.end(), id) == to_ignore.end()) { + Game *g = GetCurrentGame(); + new_pgn.Write(g->GetPGN()); + new_pgn.Write("\n\n"); + delete g; + } + id++; + } + + // Now add new games + // new_games->Reset(); + // while (new_games->NextGame()) { + // Game *g = new_games->GetCurrentGame(); + // new_pgn.Write(g->GetPGN()); + // delete g; + // } + + new_pgn.Close(); + wxCopyFile(tmp, file); + wxRemoveFile(tmp); +} diff --git a/src/base_tab/gamebase/PGNGameBase.hpp b/src/base_tab/gamebase/PGNGameBase.hpp index 1ad58a1..7a1a63d 100644 --- a/src/base_tab/gamebase/PGNGameBase.hpp +++ b/src/base_tab/gamebase/PGNGameBase.hpp @@ -10,6 +10,10 @@ public: PGNGameBase(std::string pgn_file); Game *GetGame(std::uint32_t id); bool NextGame(); + Game *GetCurrentGame(); std::string GetTag(std::string tag); + void Save(std::vector to_ignore, + std::vector new_games_bases, + std::vector new_games); void Reset(); }; \ No newline at end of file -- cgit v1.2.3