aboutsummaryrefslogtreecommitdiff
path: root/src/game_tab/editor/EditorPanel.cpp
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2022-02-23 18:11:55 +0100
committerLoic Guegan <manzerbredes@mailbox.org>2022-02-23 18:11:55 +0100
commitce941c146aea7925bded6b9d2a0d0559d3156ad3 (patch)
tree4c52e02600e3fd127bfb28b3e974d45541ec9e4e /src/game_tab/editor/EditorPanel.cpp
Create repository
Diffstat (limited to 'src/game_tab/editor/EditorPanel.cpp')
-rw-r--r--src/game_tab/editor/EditorPanel.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/game_tab/editor/EditorPanel.cpp b/src/game_tab/editor/EditorPanel.cpp
new file mode 100644
index 0000000..7abe09a
--- /dev/null
+++ b/src/game_tab/editor/EditorPanel.cpp
@@ -0,0 +1,207 @@
+#include "EditorPanel.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);
+
+EditorPanel::EditorPanel(wxFrame *parent, Game *game)
+ : wxPanel(parent), game(game), selected_item(-1) {
+
+ // ----- Init -----
+ wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+ wxNotebook *notebook = new wxNotebook(this, wxID_ANY);
+
+ //----- CGEditor Page -----
+ wxPanel *cgeditor_panel = new wxPanel(notebook, wxID_ANY);
+ wxBoxSizer *cgeditor_panel_sizer = new wxBoxSizer(wxVERTICAL);
+ editor_canvas = new EditorCanvas((wxFrame *)cgeditor_panel);
+ cgeditor_panel_sizer->Add(editor_canvas, 1, wxEXPAND);
+ // Comment box
+ wxStaticBox *commentBox =
+ new wxStaticBox(cgeditor_panel, wxID_ANY, "Move Comment");
+ wxBoxSizer *commentBoxSizer = new wxBoxSizer(wxVERTICAL);
+ comment_input = new wxTextCtrl(
+ commentBox, COMMENT_INPUT_BOX, wxEmptyString, // Use right ID
+ wxDefaultPosition, wxSize(0, 150), wxTE_MULTILINE);
+ commentBoxSizer->Add(comment_input, 0, wxEXPAND);
+ commentBox->SetSizer(commentBoxSizer);
+ cgeditor_panel_sizer->Add(commentBox, 0, wxEXPAND);
+ cgeditor_panel->SetSizer(cgeditor_panel_sizer);
+
+ //----- Tags Page -----
+ wxPanel *tag_panel = new wxPanel(notebook, wxID_ANY);
+ wxBoxSizer *tag_panel_sizer = new wxBoxSizer(wxVERTICAL);
+ wxPanel *tag_edit_panel = new wxPanel(tag_panel, wxID_ANY);
+ wxBoxSizer *tag_edit_panel_sizer = new wxBoxSizer(wxVERTICAL);
+ tagTextCtrl = new wxTextCtrl(tag_edit_panel, wxID_ANY);
+ tagTextCtrl->SetHint(wxString("Name"));
+ tag_edit_panel_sizer->Add(tagTextCtrl, 1, wxEXPAND);
+ valueTextCtrl = new wxTextCtrl(tag_edit_panel, wxID_ANY);
+ valueTextCtrl->SetHint(wxString("Value"));
+ tag_edit_panel_sizer->Add(valueTextCtrl, 1, wxEXPAND);
+ tag_edit_panel_sizer->Add(new wxButton(tag_edit_panel, UPDATE_BTN, L"Update"),
+ 1, wxEXPAND);
+ tag_edit_panel->SetSizer(tag_edit_panel_sizer);
+ tag_panel_sizer->Add(tag_edit_panel, 0, wxEXPAND);
+ tags_list = new wxListCtrl(tag_panel, wxID_ANY, wxDefaultPosition,
+ wxDefaultSize, wxLC_REPORT);
+ tags_list->InsertColumn(0, L"Name");
+ tags_list->InsertColumn(1, L"Value", wxLIST_FORMAT_LEFT, 500);
+ RefreshTagsList();
+ tag_panel_sizer->Add(tags_list, 1, wxEXPAND);
+ delete_button = new wxButton(tag_panel, DELETE_BTN, L"Delete");
+ delete_button->Enable(false);
+ tag_panel_sizer->Add(delete_button, 0, wxEXPAND);
+ tag_panel->SetSizer(tag_panel_sizer);
+
+ //----- Notebook -----
+ notebook->AddPage(cgeditor_panel, L"Editor");
+ notebook->AddPage(tag_panel, L"Tags");
+ sizer->Add(notebook, 1, wxEXPAND);
+
+ //----- Sizer -----
+ this->SetSizer(sizer);
+
+ // Bind events
+ this->Bind(wxEVT_TEXT, &EditorPanel::OnCommentChange, this,
+ COMMENT_INPUT_BOX);
+ this->Bind(GOTO_MOVE_EVENT, &EditorPanel::OnGotoMove, this, wxID_ANY);
+ this->Bind(DELETE_MOVE_EVENT, &EditorPanel::OnMoveDelete, this, wxID_ANY);
+ this->Bind(PROMOTE_MOVE_EVENT, &EditorPanel::OnMovePromote, this, wxID_ANY);
+ this->Bind(SET_AS_MAINLINE_EVENT, &EditorPanel::OnMoveSetAsMainline, this,
+ wxID_ANY);
+ this->Bind(NEXT_MOVE_EVENT, &EditorPanel::OnNextMove, this, wxID_ANY);
+ this->Bind(PREVIOUS_MOVE_EVENT, &EditorPanel::OnPreviousMove, this, wxID_ANY);
+ this->Bind(wxEVT_LIST_ITEM_SELECTED, &EditorPanel::OnTagSelected, this,
+ wxID_ANY);
+ this->Bind(wxEVT_LIST_ITEM_DESELECTED, &EditorPanel::OnTagDeselected, this,
+ wxID_ANY);
+ this->Bind(wxEVT_BUTTON, &EditorPanel::OnApply, this, UPDATE_BTN);
+ this->Bind(wxEVT_BUTTON, &EditorPanel::OnDelete, this, DELETE_BTN);
+}
+
+void EditorPanel::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 EditorPanel::OnTagDeselected(wxListEvent &event) {
+ selected_item = -1;
+ delete_button->Enable(false);
+}
+
+void EditorPanel::NotifyBoard() {
+ wxCommandEvent previousEvent(GAME_CHANGE, GetId());
+ previousEvent.SetEventObject(this);
+ ProcessEvent(previousEvent);
+}
+
+void EditorPanel::OnCommentChange(wxCommandEvent &event) {
+ wxLogDebug("EditorPanel: comment input change");
+ HalfMove *m = game->GetCurrentMove();
+ if (m != NULL) {
+ m->SetComment(event.GetString().ToStdString());
+ }
+ editor_canvas->Refresh();
+}
+
+void EditorPanel::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 EditorPanel::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 EditorPanel::OnGotoMove(wxCommandEvent &event) {
+ wxLogDebug("EditorPanel: received GOTO_MOVE_EVENT");
+ game->SetCurrent((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void EditorPanel::OnMoveDelete(wxCommandEvent &event) {
+ game->DeleteMove((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void EditorPanel::OnMovePromote(wxCommandEvent &event) {
+ wxLogDebug("EditorPanel: promote move called");
+ game->PromoteMove((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void EditorPanel::OnMoveSetAsMainline(wxCommandEvent &event) {
+ wxLogDebug("EditorPanel: set move as mainline called");
+ game->SetMoveAsMainline((HalfMove *)event.GetClientData());
+ NotifyBoard();
+ editor_canvas->Refresh();
+}
+
+void EditorPanel::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 EditorPanel::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 EditorPanel::OnPreviousMove(wxCommandEvent &event) {
+ game->Previous();
+ Notify();
+ NotifyBoard();
+}
+
+void EditorPanel::OnNextMove(wxCommandEvent &event) {
+ game->Next();
+ Notify();
+ NotifyBoard();
+} \ No newline at end of file