#pragma once #include "Theme.hpp" #include "ochess.hpp" #include #include #include #include #include #include // Local events wxDECLARE_EVENT(PLAY_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.35 #define SQUARE_NUM_PADDING 5 typedef std::tuple ClockTime; // Drawing buffer (ANIMATIONS) typedef struct AnimState { /// @brief Temporary buffer to reduce latency wxBitmap *buffer; /// @brief Should *buffer be used? bool reuseBuffer; /// @brief Current animated frame int frame; /// @brief Total number of frames for the animation int frames; /// @brief Animation durations (in ms) int duration,duration_fast; /// @brief Animation FPS std::uint8_t fps; /// @brief Current animated piece char piece_moved; /// @brief Starting point of the animated piece wxPoint src; /// @brief Translation vector of the animated piece wxPoint transVect; } AnimState; typedef struct GameState { std::string white, black; std::string board; std::map captures; bool is_black_turn; bool mat_black; bool mat_white; ClockTime black_time={-1,-1,-1}, white_time={-1,-1,-1}; } GameState; class BoardCanvas : public wxPanel { // *t is theme for board+pieces and // *t_captures is theme for captured pieces (scale down version of t) Theme *t, *t_captures; // Board to draw (char version) std::string board; std::string white_player,black_player; // Various canvas state variables 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; bool frozen,lock_square_size; // Current animation state AnimState adata; GameState gs; public: BoardCanvas(wxFrame *parent); BoardCanvas(wxFrame *parent,std::uint32_t square_width, bool frozen); ~BoardCanvas(); void ApplyPreferences(); void DrawBoard(wxDC &dc); void OnPaint(wxPaintEvent &event); void MouseEvent(wxMouseEvent &event); void Zoom(std::int32_t zoom); void Swap(); void OnResize(wxSizeEvent &e); void SetupBoard(const GameState &new_gs); void Animate(const GameState &new_gs, const std::string &src, const std::string &dst,bool faster); void SetClockTime(short hours, short min, short sec, bool IsBlack); };