#include "GameTabLeftPanel.hpp" #include <wx/clipbrd.h> GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr<Game> game) : TabGameLeftPanel(parent), game(game), repeat(false) { // Configure toolbar (note that toolbar events are processed into the GameTab class) game_toolbar->AddTool(0, wxT("Save As"), wxArtProvider::GetBitmap(wxART_FILE_SAVE, wxART_TOOLBAR)); game_toolbar->AddTool(1, wxT("Duplicate Game"), wxArtProvider::GetBitmap(wxART_COPY, wxART_TOOLBAR)); // Add board board_canvas = new BoardCanvas((wxFrame *)this); main_sizer->Insert(1, board_canvas, 1, wxEXPAND); // Configure buttons swap_button->SetBitmapLabel(LoadPNG("swap")); zoomin_button->SetBitmapLabel(LoadPNG("zoomin")); zoomout_button->SetBitmapLabel(LoadPNG("zoomout")); // Configure FEN field fen_text_field->SetFont(wxFont(*wxNORMAL_FONT).Bold().Larger()); last_move=game->GetCurrentMove(); // Bind events: Bind(PLAY_MOVE_EVENT, &GameTabLeftPanel::OnPlay, this, wxID_ANY); Bind(wxEVT_BUTTON, [bc=board_canvas](wxCommandEvent &event){bc->Zoom(10);}, ZOOM_IN_BTN); Bind(wxEVT_BUTTON, [bc=board_canvas](wxCommandEvent &event){bc->Zoom(-10);}, ZOOM_OUT_BTN); Bind(wxEVT_BUTTON, [bc=board_canvas](wxCommandEvent &event){bc->Swap();}, SWAP_BTN); Bind(wxEVT_KEY_UP, [p=this](wxKeyEvent &e){p->repeat=false;}); Bind(wxEVT_KEY_DOWN, [p=this](wxKeyEvent &e){ if(e.GetKeyCode() == WXK_RIGHT){ p->game->Next(); p->Notify(true,false); p->repeat=true; } else if(e.GetKeyCode() == WXK_LEFT){ p->game->Previous(); p->Notify(true,true); p->repeat=true; } // Notify other classes wxCommandEvent event(GAME_CHANGE, p->GetId()); event.SetEventObject(p); p->ProcessEvent(event); }); Bind(wxEVT_MOUSEWHEEL, [p=this](wxMouseEvent& e){ if(e.GetWheelRotation()<0){ p->game->Next(); p->Notify(true,false); }else { p->game->Previous(); p->Notify(true,true); } // Notify other classes wxCommandEvent event(GAME_CHANGE, p->GetId()); event.SetEventObject(p); p->ProcessEvent(event); }); } void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { wxLogDebug("Game tab received PLAY_MOVE_EVENT"); if (game->Play(event.GetString().ToStdString())) { // Notify other classes wxCommandEvent event(GAME_CHANGE, GetId()); event.SetEventObject(this); ProcessEvent(event); } // Refresh board canvas: Notify(); } void GameTabLeftPanel::Notify(bool animate, bool backward) { wxLogDebug("Called!"); // Update fen and captures std::string fen = game->GetFen(); std::map<char, std::uint8_t> captures; HalfMove *m = game->GetCurrentMove(); std::string src,dst; animate=false; backward=false; if (m != nullptr) { captures = m->GetLineCaptures(); // Check if we should animate if(m->GetParent()==last_move){ wxLogDebug("Animate animate next"); std::string absolute_move= m->GetAbsoluteMove(); animate=true; src=absolute_move.substr(0,2); dst=absolute_move.substr(2,2); } else if (m->GetMainline()==last_move){ wxLogDebug("Animate Previous"); std::string absolute_move= last_move->GetAbsoluteMove(); animate=true; backward=true; src=absolute_move.substr(2,2); dst=absolute_move.substr(0,2); } else { std::string absolute_move= last_move->GetAbsoluteMove(); wxLogDebug("Animate Previous"); for(auto v: m->GetVariations()){ if(v==last_move){ animate=true; backward=true; src=absolute_move.substr(2,2); dst=absolute_move.substr(0,2); } } } }else if(last_move!=nullptr) { if(last_move->GetParent()==nullptr){ wxLogDebug("Animate Previous"); std::string absolute_move= last_move->GetAbsoluteMove(); animate=true; backward=true; src=absolute_move.substr(2,2); dst=absolute_move.substr(0,2); } } // Update board canvas: if(!animate){ board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures, game->GetTag("White"),game->GetTag("Black")); } else{ board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); } last_move=m; // Update fen field: fen_text_field->SetValue(game->GetFen()); } void GameTabLeftPanel::ApplyPreferences() { board_canvas->ApplyPreferences(); }