diff options
Diffstat (limited to 'src/game_tab/right_panel/GameTabRightPanel.cpp')
| -rw-r--r-- | src/game_tab/right_panel/GameTabRightPanel.cpp | 193 |
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 |
