aboutsummaryrefslogtreecommitdiff
path: root/src/game_tab/right_panel/GameTabRightPanel.cpp
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2022-02-28 13:44:27 +0100
committerLoic Guegan <manzerbredes@mailbox.org>2022-02-28 13:44:27 +0100
commitbf485fa577a76731f9eac97de3b0a647cd492e49 (patch)
tree731d9ec91070406124044e75b4b27949e5d230c0 /src/game_tab/right_panel/GameTabRightPanel.cpp
parent7178f18ab88bcc93bfbf2019adf53d2f60d8fa20 (diff)
Refactoring game tab
Diffstat (limited to 'src/game_tab/right_panel/GameTabRightPanel.cpp')
-rw-r--r--src/game_tab/right_panel/GameTabRightPanel.cpp193
1 files changed, 193 insertions, 0 deletions
diff --git a/src/game_tab/right_panel/GameTabRightPanel.cpp b/src/game_tab/right_panel/GameTabRightPanel.cpp
new file mode 100644
index 0000000..f7c9b1b
--- /dev/null
+++ b/src/game_tab/right_panel/GameTabRightPanel.cpp
@@ -0,0 +1,193 @@
+#include "GameTabRightPanel.hpp"
+#include "LiveEngineDialog.hpp"
+
+wxDEFINE_EVENT(GOTO_MOVE_EVENT, wxCommandEvent);
+wxDEFINE_EVENT(DELETE_MOVE_EVENT, wxCommandEvent);
+wxDEFINE_EVENT(PROMOTE_MOVE_EVENT, wxCommandEvent);
+wxDEFINE_EVENT(SET_AS_MAINLINE_EVENT, wxCommandEvent);
+wxDEFINE_EVENT(PREVIOUS_MOVE_EVENT, wxCommandEvent);
+wxDEFINE_EVENT(NEXT_MOVE_EVENT, wxCommandEvent);
+
+GameTabRightPanel::GameTabRightPanel(wxFrame *parent, Game *game)
+ : TabGameRightPanel(parent), game(game), selected_item(-1) {
+ editor_canvas = new EditorCanvas((wxFrame *)editor_page);
+ editor_canvas_sizer->Add(editor_canvas, 1, wxEXPAND);
+ tags_list->InsertColumn(0, L"Name", wxLIST_FORMAT_LEFT, 200);
+ tags_list->InsertColumn(1, L"Value", wxLIST_FORMAT_LEFT, 500);
+ tagTextCtrl->SetHint("Tag");
+ valueTextCtrl->SetHint("Value");
+
+ /*LiveEngineDialog *diag=new LiveEngineDialog(this, "Stockfish");
+ diag->SetFEN("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
+
+ diag->Show();*/
+ RefreshTagsList();
+
+ // Bind events
+ this->Bind(wxEVT_TEXT, &GameTabRightPanel::OnCommentChange, this,
+ COMMENT_INPUT_BOX);
+ this->Bind(GOTO_MOVE_EVENT, &GameTabRightPanel::OnGotoMove, this, wxID_ANY);
+ this->Bind(DELETE_MOVE_EVENT, &GameTabRightPanel::OnMoveDelete, this, wxID_ANY);
+ this->Bind(PROMOTE_MOVE_EVENT, &GameTabRightPanel::OnMovePromote, this, wxID_ANY);
+ this->Bind(SET_AS_MAINLINE_EVENT, &GameTabRightPanel::OnMoveSetAsMainline, this,
+ wxID_ANY);
+ this->Bind(NEXT_MOVE_EVENT, &GameTabRightPanel::OnNextMove, this, wxID_ANY);
+ this->Bind(PREVIOUS_MOVE_EVENT, &GameTabRightPanel::OnPreviousMove, this, wxID_ANY);
+ this->Bind(wxEVT_LIST_ITEM_SELECTED, &GameTabRightPanel::OnTagSelected, this,
+ wxID_ANY);
+ this->Bind(wxEVT_LIST_ITEM_DESELECTED, &GameTabRightPanel::OnTagDeselected, this,
+ wxID_ANY);
+ this->Bind(wxEVT_BUTTON, &GameTabRightPanel::OnApply, this, UPDATE_BTN);
+ this->Bind(wxEVT_BUTTON, &GameTabRightPanel::OnDelete, this, DELETE_BTN);
+ this->Bind(wxEVT_BUTTON, &GameTabRightPanel::OnLiveAnalysis, this,
+ LIVE_ANALYSIS_GAME_BUTTON);
+
+ ApplyPreferences();
+}
+
+void GameTabRightPanel::OnLiveAnalysis(wxCommandEvent &event) {
+ int selection = engine_list->GetSelection();
+ if (selection != wxNOT_FOUND) {
+ LiveEngineDialog *diag = new LiveEngineDialog(this, engine_list->GetString(selection).ToStdString());
+ diag->SetFEN("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
+ diag->Show();
+ }
+}
+
+void GameTabRightPanel::OnTagSelected(wxListEvent &event) {
+ wxListItem item = event.GetItem();
+ std::string key = item.GetText().ToStdString();
+ tagTextCtrl->ChangeValue(key);
+ item.SetColumn(1);
+ tags_list->GetItem(item);
+ valueTextCtrl->ChangeValue(item.GetText().ToStdString());
+ selected_item = item.GetId();
+ delete_button->Enable(true);
+}
+
+void GameTabRightPanel::OnTagDeselected(wxListEvent &event) {
+ selected_item = -1;
+ delete_button->Enable(false);
+}
+
+void GameTabRightPanel::NotifyBoard() {
+ wxCommandEvent previousEvent(GAME_CHANGE, GetId());
+ previousEvent.SetEventObject(this);
+ ProcessEvent(previousEvent);
+}
+
+void GameTabRightPanel::OnCommentChange(wxCommandEvent &event) {
+ wxLogDebug("GameTabRightPanel: comment input change");
+ HalfMove *m = game->GetCurrentMove();
+ if (m != NULL) {
+ m->SetComment(event.GetString().ToStdString());
+ }
+ editor_canvas->Refresh();
+}
+
+void GameTabRightPanel::OnApply(wxCommandEvent &event) {
+ std::string key = tagTextCtrl->GetValue().ToStdString();
+ if (key == "FEN") {
+ SHOW_DIALOG_ERROR("Editing the FEN tag is forbidden");
+ return;
+ }
+ if (key.size() > 0) {
+ std::string value = valueTextCtrl->GetValue().ToStdString();
+ game->SetTag(key, value);
+ RefreshTagsList();
+ wxCommandEvent event(REFRESH_TAB_TITLE, GetId());
+ event.SetEventObject(this);
+ ProcessEvent(event);
+ }
+}
+
+void GameTabRightPanel::OnDelete(wxCommandEvent &event) {
+ if (selected_item >= 0) {
+ wxListItem item;
+ item.SetColumn(0);
+ item.SetId(selected_item);
+ tags_list->GetItem(item);
+ std::string key = item.GetText().ToStdString();
+ if (key != "FEN") {
+ game->DeleteTag(key);
+ selected_item = -1;
+ RefreshTagsList();
+ } else {
+ SHOW_DIALOG_ERROR("Deleting the FEN tag is forbidden.");
+ }
+ }
+}
+
+void GameTabRightPanel::OnGotoMove(wxCommandEvent &event) {
+ wxLogDebug("GameTabRightPanel: received GOTO_MOVE_EVENT");
+ game->SetCurrent((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void GameTabRightPanel::OnMoveDelete(wxCommandEvent &event) {
+ game->DeleteMove((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void GameTabRightPanel::OnMovePromote(wxCommandEvent &event) {
+ wxLogDebug("GameTabRightPanel: promote move called");
+ game->PromoteMove((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void GameTabRightPanel::OnMoveSetAsMainline(wxCommandEvent &event) {
+ wxLogDebug("GameTabRightPanel: set move as mainline called");
+ game->SetMoveAsMainline((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void GameTabRightPanel::Notify() {
+ HalfMove *m = game->GetCurrentMove();
+ if (m != NULL) {
+ comment_input->ChangeValue(
+ m->GetComment()); // ChangeValue do not raise events
+ }
+ editor_canvas->SetMoves(game->GetMoves(), m);
+}
+
+void GameTabRightPanel::ApplyPreferences() {
+ engine_list->Clear();
+ CONFIG_OPEN(conf);
+ conf->SetPath("engines/");
+ wxString engine_name;
+ long index;
+ if (conf->GetFirstGroup(engine_name, index)) {
+ do {
+ engine_list->Append(engine_name);
+ } while (conf->GetNextGroup(engine_name, index));
+ }
+
+ CONFIG_CLOSE(conf);
+}
+
+void GameTabRightPanel::RefreshTagsList() {
+ tags_list->DeleteAllItems();
+ for (std::string s : game->ListTags()) {
+ long index = tags_list->InsertItem(0, s);
+ tags_list->SetItem(index, 1, game->GetTag(s));
+ if (s == "FEN") {
+ tags_list->SetItemBackgroundColour(index, wxColour(200, 200, 200));
+ }
+ }
+}
+
+void GameTabRightPanel::OnPreviousMove(wxCommandEvent &event) {
+ game->Previous();
+ Notify();
+ NotifyBoard();
+}
+
+void GameTabRightPanel::OnNextMove(wxCommandEvent &event) {
+ game->Next();
+ Notify();
+ NotifyBoard();
+} \ No newline at end of file