ochess/src/game_tab/editor/EditorPanel.cpp
2022-02-23 18:11:55 +01:00

207 lines
No EOL
7 KiB
C++

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