#pragma once #include "Theme.hpp" #include "ochess.hpp" #include #include #include #include #include // Local events wxDECLARE_EVENT(PLAY_MOVE_EVENT, wxCommandEvent); // Foreign events wxDECLARE_EVENT(PREVIOUS_MOVE_EVENT, wxCommandEvent); wxDECLARE_EVENT(NEXT_MOVE_EVENT, wxCommandEvent); #define REFRESH_MOUSE_LOCATION() \ { \ const wxPoint pt = wxGetMousePosition(); \ mouseX = pt.x - this->GetScreenPosition().x; \ mouseY = pt.y - this->GetScreenPosition().y; \ } #define INIT_CURRENT_SQUARE() \ std::uint32_t file = 7 - (mouseX - boardX) / square_width; \ std::uint32_t rank = (mouseY - boardY) / square_width; \ if (!black_side) { \ file = 7 - file; \ rank = 7 - rank; \ } \ bool IsCurrentSquareValid = file >= 0 && file <= 7 && rank >= 0 && rank <= 7; #define MOUSE_ON(x, y, width, height) \ (mouseX >= (x) && mouseX <= ((x) + (width)) && mouseY >= (y) && \ mouseY <= ((y) + (height))) #define CAPTURE_FACTOR 0.5 typedef std::tuple ClockTime; class BoardCanvas : public wxPanel { Theme *t, *t_captures; std::string board; bool black_side, is_dragging, valid_drag, is_black_turn; std::uint32_t boardX, boardY, square_width, mouseX, mouseY, lastClickX, lastClickY; wxSize canvas_size; wxPoint active_square; std::map captures; ClockTime black_time, white_time; bool frozen,lock_square_size; public: BoardCanvas(wxFrame *parent); BoardCanvas(wxFrame *parent,std::uint32_t square_width, bool frozen); ~BoardCanvas(); void ApplyPreferences(); void DrawBoard(wxPaintDC &dc); void OnPaint(wxPaintEvent &event); void OnKeyEvent(wxKeyEvent &event); void MouseEvent(wxMouseEvent &event); void Zoom(std::int32_t zoom); void Swap(); void SetupBoard(std::string board, bool is_black_turn, std::map captures); void SetClockTime(short hours, short min, short sec, bool IsBlack); DECLARE_EVENT_TABLE() };