diff --git a/src/base_tab/BasePanelBF.cpp b/src/base_tab/BasePanelBF.cpp index 4c25cf9..96ced01 100644 --- a/src/base_tab/BasePanelBF.cpp +++ b/src/base_tab/BasePanelBF.cpp @@ -24,7 +24,7 @@ BasePanelBF::BasePanelBF( wxWindow* parent, wxWindowID id, const wxPoint& pos, c save_button = new wxButton( this, ID_SAVE_BUTTON, wxT("Save"), wxDefaultPosition, wxDefaultSize, 0 ); top_sizer->Add( save_button, 0, wxALL, 5 ); - export_button = new wxButton( this, wxID_ANY, wxT("Export"), wxDefaultPosition, wxDefaultSize, 0 ); + export_button = new wxButton( this, ID_EXPORT_BUTTON, wxT("Export"), wxDefaultPosition, wxDefaultSize, 0 ); top_sizer->Add( export_button, 0, wxALL, 5 ); diff --git a/src/base_tab/BasePanelBF.h b/src/base_tab/BasePanelBF.h index 167ce99..1b74915 100644 --- a/src/base_tab/BasePanelBF.h +++ b/src/base_tab/BasePanelBF.h @@ -28,7 +28,8 @@ /////////////////////////////////////////////////////////////////////////// #define ID_SAVE_BUTTON 1000 -#define ID_DELETE_BUTTON 1001 +#define ID_EXPORT_BUTTON 1001 +#define ID_DELETE_BUTTON 1002 /////////////////////////////////////////////////////////////////////////////// /// Class BasePanelBF diff --git a/src/base_tab/BaseTab.cpp b/src/base_tab/BaseTab.cpp index 9234a47..f7cf48f 100644 --- a/src/base_tab/BaseTab.cpp +++ b/src/base_tab/BaseTab.cpp @@ -15,6 +15,7 @@ BaseTab::BaseTab(wxFrame *parent, std::string base_file) this->Bind(wxEVT_BUTTON, &BaseTab::OnDelete, this, ID_DELETE_BUTTON); this->Bind(wxEVT_BUTTON, &BaseTab::OnSave, this, ID_SAVE_BUTTON); + this->Bind(wxEVT_BUTTON, &BaseTab::OnExport, this, ID_EXPORT_BUTTON); this->Bind(wxEVT_LIST_ITEM_ACTIVATED, &BaseTab::OnOpenGame, this, wxID_ANY); current_base->SetLabel(base_file); LoadFile(); @@ -65,6 +66,23 @@ void BaseTab::OnOpenGame(wxListEvent &event) { void BaseTab::ApplyPreferences() {} +void BaseTab::OnExport(wxCommandEvent &event) { + wxFileDialog openFileDialog(this, _("Export database"), "", "", + "Database files (*.pgn)|*.pgn", + wxFD_SAVE | wxFD_OVERWRITE_PROMPT); + if (openFileDialog.ShowModal() != wxID_CANCEL) { + std::string path = openFileDialog.GetPath().ToStdString(); + wxFileName file(base_file); + wxString ext = file.GetExt().Lower(); + GameBase *base; + if (ext == "pgn") { + base = new PGNGameBase(path); + base->Save(this->base); + delete base; + } + } +} + void BaseTab::LoadFile() { wxFileName file(base_file); wxString ext = file.GetExt().Lower(); diff --git a/src/base_tab/BaseTab.hpp b/src/base_tab/BaseTab.hpp index cd3aff0..f58e182 100644 --- a/src/base_tab/BaseTab.hpp +++ b/src/base_tab/BaseTab.hpp @@ -20,5 +20,6 @@ public: void LoadFile(); void OnDelete(wxCommandEvent &event); void OnSave(wxCommandEvent &event); + void OnExport(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 db58bcc..cf87a9c 100644 --- a/src/base_tab/gamebase/GameBase.hpp +++ b/src/base_tab/gamebase/GameBase.hpp @@ -14,4 +14,5 @@ public: virtual bool NextGame() = 0; virtual std::string GetTag(std::string tag) = 0; virtual void Reset() = 0; + virtual void Save(GameBase *base) = 0; }; \ No newline at end of file diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp index bd83abc..dc6341c 100644 --- a/src/base_tab/gamebase/PGNGameBase.cpp +++ b/src/base_tab/gamebase/PGNGameBase.cpp @@ -68,11 +68,16 @@ void PGNGameBase::Save(std::vector to_ignore, Reset(); std::uint32_t id = 0; + bool several = false; while (NextGame()) { if (std::find(to_ignore.begin(), to_ignore.end(), id) == to_ignore.end()) { + if (several) { + new_pgn.Write("\n\n"); + } else { + several = true; + } Game *g = GetCurrentGame(); new_pgn.Write(g->GetPGN()); - new_pgn.Write("\n\n"); delete g; } id++; @@ -80,18 +85,34 @@ void PGNGameBase::Save(std::vector to_ignore, // Now add new games for (Game *g : new_games) { + if (several) { + new_pgn.Write("\n\n"); + } else { + several = true; + } new_pgn.Write(g->GetPGN()); - new_pgn.Write("\n\n"); } - // 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); } + +void PGNGameBase::Save(GameBase *base) { + wxFile new_pgn(file, wxFile::write); + + base->Reset(); + bool several = false; + while (base->NextGame()) { + if (several) { + new_pgn.Write("\n\n"); + } else { + several = true; + } + Game *g = base->GetCurrentGame(); + new_pgn.Write(g->GetPGN()); + delete g; + } + + new_pgn.Close(); +} diff --git a/src/base_tab/gamebase/PGNGameBase.hpp b/src/base_tab/gamebase/PGNGameBase.hpp index 7a1a63d..e153701 100644 --- a/src/base_tab/gamebase/PGNGameBase.hpp +++ b/src/base_tab/gamebase/PGNGameBase.hpp @@ -16,4 +16,5 @@ public: std::vector new_games_bases, std::vector new_games); void Reset(); + void Save(GameBase *base); }; \ No newline at end of file diff --git a/src/ochess.hpp b/src/ochess.hpp index 3869d99..33e9f22 100644 --- a/src/ochess.hpp +++ b/src/ochess.hpp @@ -50,7 +50,7 @@ void Abort(std::string msg); */ class TabInfos { public: - typedef enum Type { GAME, BASE,NONE } Type; + typedef enum Type { GAME, BASE, NONE } Type; Type type; TabInfos(Type type_) : type(type_) {} virtual void ApplyPreferences() = 0; diff --git a/tools/wxframebuilder/BasePanel.fbp b/tools/wxframebuilder/BasePanel.fbp index 63ce0fe..c7ab989 100644 --- a/tools/wxframebuilder/BasePanel.fbp +++ b/tools/wxframebuilder/BasePanel.fbp @@ -164,7 +164,7 @@ 0 0 - ID_SAVE_BTN + ID_SAVE_BUTTON Save 0 @@ -237,7 +237,7 @@ 0 0 - wxID_ANY + ID_EXPORT_BUTTON Export 0