mirror of
https://gitlab.com/manzerbredes/ochess.git
synced 2025-04-18 03:42:02 +00:00
97 lines
2.9 KiB
C++
97 lines
2.9 KiB
C++
![]() |
#include "BoardPanel.hpp"
|
||
|
#include <wx/clipbrd.h>
|
||
|
|
||
|
BoardPanel::BoardPanel(wxFrame *parent, Game *game)
|
||
|
: wxPanel(parent), game(game) {
|
||
|
|
||
|
wxBoxSizer *board_panel_sizer = new wxBoxSizer(wxVERTICAL);
|
||
|
board_canvas = new BoardCanvas((wxFrame *)this);
|
||
|
board_panel_sizer->Add(board_canvas, 1, wxEXPAND);
|
||
|
|
||
|
// Left Panel buttons
|
||
|
wxBoxSizer *board_panel_button_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||
|
board_panel_button_sizer->Add(
|
||
|
new wxBitmapButton(this, SWAP_BTN, LoadPNG("swap")), 0);
|
||
|
board_panel_button_sizer->Add(
|
||
|
new wxBitmapButton(this, ZOOM_IN_BTN, LoadPNG("zoomin")), 0);
|
||
|
board_panel_button_sizer->Add(
|
||
|
new wxBitmapButton(this, ZOOM_OUT_BTN, LoadPNG("zoomout")), 0);
|
||
|
board_panel_button_sizer->Add(new wxButton(this, COPY_FEN_BTN, L"Copy FEN"),
|
||
|
0, wxEXPAND);
|
||
|
board_panel_sizer->Add(board_panel_button_sizer, 0);
|
||
|
this->SetSizer(board_panel_sizer);
|
||
|
|
||
|
Bind(PLAY_MOVE_EVENT, &BoardPanel::OnPlay, this, wxID_ANY);
|
||
|
Bind(PREVIOUS_MOVE_EVENT, &BoardPanel::OnPreviousMove, this, wxID_ANY);
|
||
|
Bind(NEXT_MOVE_EVENT, &BoardPanel::OnNextMove, this, wxID_ANY);
|
||
|
Bind(wxEVT_BUTTON, &BoardPanel::OnSwap, this, SWAP_BTN);
|
||
|
Bind(wxEVT_BUTTON, &BoardPanel::OnZoomIn, this, ZOOM_IN_BTN);
|
||
|
Bind(wxEVT_BUTTON, &BoardPanel::OnZoomOut, this, ZOOM_OUT_BTN);
|
||
|
Bind(wxEVT_BUTTON, &BoardPanel::OnCopyFEN, this, COPY_FEN_BTN);
|
||
|
}
|
||
|
|
||
|
void BoardPanel::OnPreviousMove(wxCommandEvent &event) {
|
||
|
game->Previous();
|
||
|
Notify();
|
||
|
NotifyEditor();
|
||
|
}
|
||
|
|
||
|
void BoardPanel::OnZoomIn(wxCommandEvent &event) {
|
||
|
wxLogDebug("Clicked on zoom in");
|
||
|
board_canvas->Zoom(10);
|
||
|
}
|
||
|
|
||
|
void BoardPanel::OnZoomOut(wxCommandEvent &event) {
|
||
|
wxLogDebug("Clicked on zoom out");
|
||
|
board_canvas->Zoom(-10);
|
||
|
}
|
||
|
|
||
|
void BoardPanel::OnSwap(wxCommandEvent &event) {
|
||
|
wxLogDebug("Clicked on swap");
|
||
|
board_canvas->Swap();
|
||
|
}
|
||
|
|
||
|
void BoardPanel::OnNextMove(wxCommandEvent &event) {
|
||
|
wxLogDebug("Game tab received NEXT_MOVE_EVENT");
|
||
|
game->Next();
|
||
|
Notify();
|
||
|
NotifyEditor();
|
||
|
}
|
||
|
|
||
|
void BoardPanel::OnPlay(wxCommandEvent &event) {
|
||
|
wxLogDebug("Game tab received PLAY_MOVE_EVENT");
|
||
|
if (game->Play(event.GetString().ToStdString())) {
|
||
|
NotifyEditor();
|
||
|
}
|
||
|
Notify();
|
||
|
}
|
||
|
|
||
|
void BoardPanel::OnCopyFEN(wxCommandEvent &event) {
|
||
|
wxLogDebug("Clicked on copy fen");
|
||
|
if (wxTheClipboard->Open()) {
|
||
|
wxTheClipboard->SetData(new wxTextDataObject(game->GetFen()));
|
||
|
wxTheClipboard->Close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void BoardPanel::Notify() {
|
||
|
std::string fen = game->GetFen();
|
||
|
std::map<char, std::uint8_t> captures;
|
||
|
HalfMove *m = game->GetCurrentMove();
|
||
|
if (m != NULL) {
|
||
|
captures = m->GetLineCaptures();
|
||
|
}
|
||
|
board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board,
|
||
|
game->IsBlackToPlay(), captures);
|
||
|
}
|
||
|
|
||
|
void BoardPanel::NotifyEditor() {
|
||
|
wxCommandEvent previousEvent(GAME_CHANGE, GetId());
|
||
|
previousEvent.SetEventObject(this);
|
||
|
ProcessEvent(previousEvent);
|
||
|
}
|
||
|
|
||
|
void BoardPanel::ApplyPreferences() {
|
||
|
board_canvas->ApplyPreferences();
|
||
|
}
|