#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(); }