From c49b48df010c97553aec80491c8fb505e21bcbf1 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Fri, 23 Dec 2022 16:49:33 +0100 Subject: Improve db tab --- src/base_tab/BaseGameTab.cpp | 127 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/base_tab/BaseGameTab.cpp (limited to 'src/base_tab/BaseGameTab.cpp') diff --git a/src/base_tab/BaseGameTab.cpp b/src/base_tab/BaseGameTab.cpp new file mode 100644 index 0000000..79f28c1 --- /dev/null +++ b/src/base_tab/BaseGameTab.cpp @@ -0,0 +1,127 @@ +#include "BaseGameTab.hpp" +#include "AppendGameDialog.hpp" +#include + +BaseGameTab::BaseGameTab(wxFrame *parent, std::string base_file) + : TabBase_TabGames(parent), base_file(base_file), + base(NULL) { + + 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, 150); + 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"ECO", wxLIST_FORMAT_LEFT, 200); + + 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); + LoadFile(); +} + +void BaseGameTab::OnImport(wxCommandEvent &event) { + AppendGameDialog *dia = new AppendGameDialog(this, base); + dia->ShowModal(); + game_list->DeleteAllItems(); + deleted.clear(); + edited.clear(); + LoadFile(); +} + +void BaseGameTab::OnDelete(wxCommandEvent &event) { + long selected = -1; + + while ((selected = game_list->GetNextItem(selected, wxLIST_NEXT_ALL, + wxLIST_STATE_SELECTED)) != + wxNOT_FOUND) { + wxListItem listItem; + listItem.m_itemId = selected; // sets row + listItem.m_col = 0; // sets column + game_list->GetItem(listItem); // gets item + deleted.push_back(std::stoi(listItem.GetText().ToStdString())); + for (std::uint32_t &i : deleted) { + wxLogDebug("%d", i); + } + game_list->SetItemBackgroundColour(selected, *wxRED); + } +} + +void BaseGameTab::OnSave(wxCommandEvent &event) { + std::vector> new_games_bases; + std::vector> new_games; + new_games.insert( + new_games.end(), edited.begin(), + edited.end()); // Add edited game (since they are also deleted) + base->Save(deleted, new_games_bases, new_games); + game_list->DeleteAllItems(); + edited.clear(); + deleted.clear(); + LoadFile(); +} + +void BaseGameTab::OnOpenGame(wxListEvent &event) { + wxLogDebug("Open!"); + long id = std::stoi(event.GetItem().GetText().ToStdString()); + std::shared_ptr *g = new std::shared_ptr(base->GetGame(id)); + if (g != NULL) { + edited.push_back(*g); + deleted.push_back(id); + game_list->SetItemBackgroundColour(event.GetIndex(), *wxGREEN); + wxCommandEvent newGameEvent(NEW_GAME_EVENT, GetId()); + newGameEvent.SetEventObject(this); + newGameEvent.SetClientData(g); + ProcessEvent(newGameEvent); + } +} + +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) { + 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")); + game_list->SetItem(index, 6, base->GetTag("ECO")); + id++; + } + } + + wxCommandEvent event(REFRESH_TAB_TITLE, GetId()); + event.SetEventObject(this); + ProcessEvent(event); +} -- cgit v1.2.3