#include "GameTabLeftPanel.hpp" #include GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) : TabGameLeftPanel(parent), game(game), repeat(false) { // Configure toolbal 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()); Bind(PLAY_MOVE_EVENT, &GameTabLeftPanel::OnPlay, this, wxID_ANY); Bind(wxEVT_BUTTON, &GameTabLeftPanel::OnSwap, this, SWAP_BTN); Bind(wxEVT_BUTTON, &GameTabLeftPanel::OnZoomIn, this, ZOOM_IN_BTN); Bind(wxEVT_BUTTON, &GameTabLeftPanel::OnZoomOut, this, ZOOM_OUT_BTN); Bind(wxEVT_KEY_DOWN, [p=this](wxKeyEvent &e){e.ResumePropagation(1);e.Skip();}); Bind(wxEVT_KEY_UP, [p=this](wxKeyEvent &e){e.ResumePropagation(1);e.Skip();}); } void GameTabLeftPanel::PreviousMove(bool isKeyDown) { if(isKeyDown){ game->Previous(); Notify(true,true); repeat=true; } else { repeat=false; } } void GameTabLeftPanel::NextMove(bool isKeyDown) { if(isKeyDown){ game->Next(); Notify(true,false); repeat=true; } else{ repeat=false; } } void GameTabLeftPanel::OnZoomIn(wxCommandEvent &event) { wxLogDebug("Clicked on zoom in"); board_canvas->Zoom(10); } void GameTabLeftPanel::OnZoomOut(wxCommandEvent &event) { wxLogDebug("Clicked on zoom out"); board_canvas->Zoom(-10); } void GameTabLeftPanel::OnSwap(wxCommandEvent &event) { wxLogDebug("Clicked on swap"); board_canvas->Swap(); } void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { wxLogDebug("Game tab received PLAY_MOVE_EVENT"); if (game->Play(event.GetString().ToStdString())) { NotifyEditor(); } Notify(); std::string fen = game->GetFen(); std::map captures; HalfMove *m = game->GetCurrentMove(); if (m != nullptr) { captures = m->GetLineCaptures(); } } void GameTabLeftPanel::Notify(bool animate, bool backward) { std::string fen = game->GetFen(); std::map captures; HalfMove *m = game->GetCurrentMove(); if (m != nullptr) { captures = m->GetLineCaptures(); } if(!animate){ if(m){ last_absolute_move=m->GetAbsoluteMove(); } board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures, game->GetTag("White"),game->GetTag("Black")); } else{ if(backward && last_absolute_move.size()>0){ std::string dst=last_absolute_move.substr(0,2); std::string src=last_absolute_move.substr(2,2); board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); if(m){ last_absolute_move=m->GetAbsoluteMove(); } } else if(!backward && m){ std::string new_absolute_move=m->GetAbsoluteMove(); if(last_absolute_move!=new_absolute_move){ last_absolute_move=new_absolute_move; std::string src=last_absolute_move.substr(0,2); std::string dst=last_absolute_move.substr(2,2); board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); } } // If m undefined if(!m){ last_absolute_move=""; } } fen_text_field->SetValue(game->GetFen()); } void GameTabLeftPanel::NotifyEditor() { wxCommandEvent previousEvent(GAME_CHANGE, GetId()); previousEvent.SetEventObject(this); ProcessEvent(previousEvent); } void GameTabLeftPanel::ApplyPreferences() { board_canvas->ApplyPreferences(); }