ochess/src/game_tab/GameTab.cpp
2022-12-29 10:08:22 +01:00

69 lines
2 KiB
C++

#include "GameTab.hpp"
#include <wx/clipbrd.h>
wxDEFINE_EVENT(GAME_CHANGE, wxCommandEvent);
GameTab::GameTab(wxFrame *parent, std::shared_ptr<Game> game)
: wxPanel(parent), game(game), TabInfos(TabInfos::GAME) {
// Splitter
wxSplitterWindow *splitter = new wxSplitterWindow(this, wxID_ANY);
splitter->SetSashGravity(0.8);
// Panels
game->BuildAndVerify();
board_panel = new GameTabLeftPanel((wxFrame *)splitter, game);
editor_panel = new GameTabRightPanel((wxFrame *)splitter, game);
splitter->SplitVertically(board_panel, editor_panel);
// Setup splitter
wxBoxSizer *topSizer = new wxBoxSizer(wxHORIZONTAL);
topSizer->Add(splitter, 1, wxEXPAND);
SetSizerAndFit(topSizer);
// Refresh panels
wxCommandEvent event(REFRESH_TAB_TITLE, GetId());
event.SetEventObject(this);
OnRefreshTabTitle(event);
board_panel->Notify();
editor_panel->Notify();
Bind(REFRESH_TAB_TITLE, &GameTab::OnRefreshTabTitle, this, wxID_ANY);
Bind(GAME_CHANGE, &GameTab::OnGameChange, this, wxID_ANY);
splitter->Bind(wxEVT_KEY_DOWN, [p=this,bp=board_panel,ed=editor_panel](wxKeyEvent &e){
if(e.GetKeyCode() == WXK_RIGHT){
bp->NextMove(true);
} else if(e.GetKeyCode() == WXK_LEFT){
bp->PreviousMove(true);
}
ed->Notify();
});
splitter->Bind(wxEVT_KEY_UP, [p=this,bp=board_panel,ed=editor_panel](wxKeyEvent &e){
if(e.GetKeyCode() == WXK_RIGHT){
bp->NextMove(false);
} else if(e.GetKeyCode() == WXK_LEFT){
bp->PreviousMove(false);
}
ed->Notify();
});
}
void GameTab::OnGameChange(wxCommandEvent &event) {
board_panel->Notify();
editor_panel->Notify();
}
void GameTab::OnRefreshTabTitle(wxCommandEvent &event) {
std::string white = game->GetTag("White");
std::string black = game->GetTag("Black");
if (white.size() == 0 && black.size() == 0) {
SetLabel("New Game");
} else {
SetLabel(white + "-" + black);
}
event.SetEventObject(this);
event.Skip();
}
void GameTab::ApplyPreferences() {
board_panel->ApplyPreferences();
editor_panel->ApplyPreferences();
}