#include "BaseGameTab.hpp" #include "AppendGameDialog.hpp" #include wxDEFINE_EVENT(OPEN_GAME_EVENT, wxCommandEvent); BaseGameTab::BaseGameTab(wxFrame *parent, std::string base_file, TabInfos *main_tab) : TabBase_TabGames(parent), base_file(base_file), base(NULL),main_tab(main_tab) { glm=new GameListManager(game_list); this->Bind(wxEVT_BUTTON, &BaseGameTab::OnDelete, this, ID_DELETE_BUTTON); this->Bind(wxEVT_BUTTON, &BaseGameTab::OnSave, this, ID_SAVE_BUTTON); this->Bind(wxEVT_BUTTON, &BaseGameTab::OnExport, this, ID_EXPORT_BUTTON); this->Bind(wxEVT_LIST_ITEM_ACTIVATED, &BaseGameTab::OnOpenGame, this, wxID_ANY); this->Bind(wxEVT_BUTTON, &BaseGameTab::OnImport, this, ID_IMPORT_BUTTON); current_base->SetLabel(base_file); search_terms->SetHint("e.g: Paul Morphy"); LoadFile(); } void BaseGameTab::OnImport(wxCommandEvent &event) { AppendGameDialog *dia = new AppendGameDialog(this, base); dia->ShowModal(); glm->Clear(); deleted.clear(); edited.clear(); LoadFile(); } void BaseGameTab::OnDelete(wxCommandEvent &event) { for(auto i: glm->GetSelectedItems()){ deleted.push_back(glm->GetItemGameId(i)); glm->MarkItemAsDeleted(i); } } void BaseGameTab::OnSave(wxCommandEvent &event) { std::vector> new_games_bases; // Build edited games vector std::vector> edited_games; for (auto itr = edited.begin(); itr != edited.end(); itr++) { edited_games.push_back(itr->second); } // Combine new_games and edited games std::vector> new_games; new_games.insert( new_games.end(), edited_games.begin(), edited_games.end()); // Add edited game (since they are also deleted) base->Save(deleted, new_games_bases, new_games); // Close all opened games in this database wxCommandEvent closeLinkedTabEvent(CLOSE_LINKED_TAB, GetId()); closeLinkedTabEvent.SetClientData(main_tab); ProcessEvent(closeLinkedTabEvent); glm->Clear(); edited.clear(); deleted.clear(); LoadFile(); } void BaseGameTab::OnOpenGame(wxListEvent &event) { long id = std::stoi(event.GetItem().GetText().ToStdString()); std::shared_ptr *g = new std::shared_ptr(base->GetGame(id)); if (g != NULL) { if(edited.find(id) != edited.end()){ // TODO: Focus on the game tab and if close reopen it wxLogDebug("Already opened!"); } else { wxLogDebug("Open game"); edited[id]=*g; deleted.push_back(id); glm->MarkItemAsOpen(event.GetIndex()); wxCommandEvent openGameEvent(OPEN_GAME_EVENT, GetId()); openGameEvent.SetEventObject(this); openGameEvent.SetClientData(g); ProcessEvent(openGameEvent); } } } void BaseGameTab::ApplyPreferences() {} void BaseGameTab::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->Export(this->base); delete base; } } } void BaseGameTab::LoadFile() { wxFileName file(base_file); wxString ext = file.GetExt().Lower(); if (ext == "pgn") { base = std::shared_ptr(new PGNGameBase(base_file)); SetLabel(file.GetName() + "(PGN)"); } if (base != NULL) { while (base->NextGame()) { glm->AddGame( base->GetTag("White"), base->GetTag("Black"), base->GetTag("Event"), base->GetTag("Round"), base->GetTag("Result"), base->GetTag("ECO")); } } wxCommandEvent event(REFRESH_TAB_TITLE, GetId()); event.SetEventObject(this); ProcessEvent(event); }