From 679c735596168228ad0df4e42a3768c61c809a40 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 14:12:57 +0100 Subject: Improve game tab --- src/game_tab/GameTab.cpp | 1 + src/game_tab/left_panel/GameTabLeftPanel.cpp | 16 ++++++- src/game_tab/left_panel/board/BoardCanvas.cpp | 9 +--- src/game_tab/left_panel/board/BoardCanvas.hpp | 6 --- src/game_tab/right_panel/GameTabRightPanel.cpp | 54 +----------------------- src/game_tab/right_panel/GameTabRightPanel.hpp | 7 --- src/game_tab/right_panel/editor/EditorCanvas.cpp | 40 ++++-------------- src/game_tab/right_panel/editor/EditorCanvas.hpp | 12 ++---- 8 files changed, 31 insertions(+), 114 deletions(-) diff --git a/src/game_tab/GameTab.cpp b/src/game_tab/GameTab.cpp index 20196f3..8205788 100644 --- a/src/game_tab/GameTab.cpp +++ b/src/game_tab/GameTab.cpp @@ -57,6 +57,7 @@ void GameTab::OnGameChange(wxCommandEvent &event) { else { editor_panel->Notify(); board_panel->Notify(); + RefreshTabTitle(); } } diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index 50919c0..b1bf516 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -72,14 +72,28 @@ void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { } void GameTabLeftPanel::Notify(bool animate, bool backward) { + wxLogDebug("Called!"); // Update fen and captures std::string fen = game->GetFen(); std::map captures; HalfMove *m = game->GetCurrentMove(); + //animate=false; + //backward=false; if (m != nullptr) { captures = m->GetLineCaptures(); + /*HalfMove *parent=m->GetParent(); + if(!parent){ + animate=true; + } + if(last_absolute_move == parent->GetAbsoluteMove()){ + wxLogDebug("Next true!"); + animate=true; + } else if(m->GetAbsoluteMove() == last_absolute_move){ + animate=true; + backward=true; + }*/ } - + // Update board canvas: if(!animate){ if(m){ diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 7f2c38d..1a85176 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -75,10 +75,6 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) { adata.src.y + adata.frame*(adata.transVect.y/adata.frames), false); // end drawing adata.frame++; - if(adata.frame>=adata.frames){ - adata.reuseBuffer=false; - SetupBoard(adata.final_board, adata.final_is_black_turn, adata.final_captures,white_player,black_player); - } } } @@ -116,10 +112,6 @@ void BoardCanvas::SetupBoard(std::string board, bool is_black_turn, } void BoardCanvas::Animate(const std::string &board, bool is_black_turn, std::map captures, std::string src, std::string dst,bool faster){ - adata.final_board=board; - adata.final_is_black_turn=is_black_turn; - adata.final_captures=captures; - std::uint8_t pfile = src[0]-'a'; std::uint8_t prank = src[1]-'1'; adata.piece_moved = this->board[pfile + 8 * (7-prank)]; // Piece to move @@ -172,6 +164,7 @@ void BoardCanvas::Animate(const std::string &board, bool is_black_turn, std::map } adata.duration=faster ? duration_backup : duration_backup; adata.reuseBuffer=false; + SetupBoard(board, is_black_turn, captures,white_player,black_player); } void BoardCanvas::DrawBoard(wxDC &dc) { diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp index 30f0d06..b26526f 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.hpp +++ b/src/game_tab/left_panel/board/BoardCanvas.hpp @@ -50,12 +50,6 @@ typedef struct AnimState { int duration,duration_fast; /// @brief Animation FPS std::uint8_t fps; - /// @brief Board to draw at the end of the animation - std::string final_board; - /// @brief Which player is to move at the end of the animation - bool final_is_black_turn; - /// @brief Final state of captured pieces at the end of the animation - std::map final_captures; /// @brief Current animated piece char piece_moved; /// @brief Starting point of the animated piece diff --git a/src/game_tab/right_panel/GameTabRightPanel.cpp b/src/game_tab/right_panel/GameTabRightPanel.cpp index c88202b..3a46f59 100644 --- a/src/game_tab/right_panel/GameTabRightPanel.cpp +++ b/src/game_tab/right_panel/GameTabRightPanel.cpp @@ -10,7 +10,7 @@ wxDEFINE_EVENT(NEXT_MOVE_EVENT, wxCommandEvent); GameTabRightPanel::GameTabRightPanel(wxFrame *parent, std::shared_ptr game) : TabGameRightPanel(parent), game(game), selected_item(-1), live_engine(nullptr) { - editor_canvas = new EditorCanvas((wxFrame *)editor_page); + editor_canvas = new EditorCanvas((wxFrame *)editor_page,game); editor_canvas_sizer->Add(editor_canvas, 1, wxEXPAND); tags_list->InsertColumn(0, L"Name", wxLIST_FORMAT_LEFT, 200); tags_list->InsertColumn(1, L"Value", wxLIST_FORMAT_LEFT, 500); @@ -22,16 +22,6 @@ GameTabRightPanel::GameTabRightPanel(wxFrame *parent, std::shared_ptr game // Bind events this->Bind(wxEVT_TEXT, &GameTabRightPanel::OnCommentChange, this, COMMENT_INPUT_BOX); - this->Bind(GOTO_MOVE_EVENT, &GameTabRightPanel::OnGotoMove, this, wxID_ANY); - this->Bind(DELETE_MOVE_EVENT, &GameTabRightPanel::OnMoveDelete, this, - wxID_ANY); - this->Bind(PROMOTE_MOVE_EVENT, &GameTabRightPanel::OnMovePromote, this, - wxID_ANY); - this->Bind(SET_AS_MAINLINE_EVENT, &GameTabRightPanel::OnMoveSetAsMainline, - this, wxID_ANY); - /*this->Bind(NEXT_MOVE_EVENT, &GameTabRightPanel::OnNextMove, this, wxID_ANY); - this->Bind(PREVIOUS_MOVE_EVENT, &GameTabRightPanel::OnPreviousMove, this, - wxID_ANY);*/ this->Bind(wxEVT_LIST_ITEM_SELECTED, &GameTabRightPanel::OnTagSelected, this, wxID_ANY); this->Bind(wxEVT_LIST_ITEM_DESELECTED, &GameTabRightPanel::OnTagDeselected, @@ -90,12 +80,6 @@ void GameTabRightPanel::OnTagDeselected(wxListEvent &event) { delete_button->Enable(false); } -void GameTabRightPanel::NotifyBoard() { - wxCommandEvent previousEvent(GAME_CHANGE, GetId()); - previousEvent.SetEventObject(this); - ProcessEvent(previousEvent); -} - void GameTabRightPanel::OnLiveEngineClose(wxCloseEvent &e) { live_engine = nullptr; e.Skip(); @@ -143,29 +127,6 @@ void GameTabRightPanel::OnDelete(wxCommandEvent &event) { } } -void GameTabRightPanel::OnGotoMove(wxCommandEvent &event) { - wxLogDebug("GameTabRightPanel: received GOTO_MOVE_EVENT"); - game->SetCurrent((HalfMove *)event.GetClientData()); - Notify(); -} - -void GameTabRightPanel::OnMoveDelete(wxCommandEvent &event) { - game->DeleteMove((HalfMove *)event.GetClientData()); - Notify(); -} - -void GameTabRightPanel::OnMovePromote(wxCommandEvent &event) { - wxLogDebug("GameTabRightPanel: promote move called"); - game->PromoteMove((HalfMove *)event.GetClientData()); - Notify(); -} - -void GameTabRightPanel::OnMoveSetAsMainline(wxCommandEvent &event) { - wxLogDebug("GameTabRightPanel: set move as mainline called"); - game->SetMoveAsMainline((HalfMove *)event.GetClientData()); - Notify(); -} - void GameTabRightPanel::Notify() { HalfMove *m = game->GetCurrentMove(); if (m != nullptr) { @@ -177,7 +138,6 @@ void GameTabRightPanel::Notify() { if (live_engine != nullptr) { live_engine->SetFEN(game->GetFen()); } - NotifyBoard(); } void GameTabRightPanel::ApplyPreferences() { @@ -206,18 +166,6 @@ void GameTabRightPanel::RefreshTagsList() { } } -void GameTabRightPanel::OnPreviousMove(wxCommandEvent &event) { - game->Previous(); - Notify(); - NotifyBoard(); -} - -void GameTabRightPanel::OnNextMove(wxCommandEvent &event) { - game->Next(); - Notify(); - NotifyBoard(); -} - std::string GameTabRightPanel::GetNagFromStr(std::string str){ // TODO: Bind more NAG! if(str=="!") diff --git a/src/game_tab/right_panel/GameTabRightPanel.hpp b/src/game_tab/right_panel/GameTabRightPanel.hpp index 0a353b6..aa28f17 100644 --- a/src/game_tab/right_panel/GameTabRightPanel.hpp +++ b/src/game_tab/right_panel/GameTabRightPanel.hpp @@ -23,20 +23,13 @@ class GameTabRightPanel : public TabGameRightPanel { public: GameTabRightPanel(wxFrame *parent, std::shared_ptr game); - void NotifyBoard(); void Notify(); void OnCommentChange(wxCommandEvent &event); - void OnGotoMove(wxCommandEvent &event); - void OnMoveDelete(wxCommandEvent &event); - void OnMovePromote(wxCommandEvent &event); - void OnMoveSetAsMainline(wxCommandEvent &event); void RefreshTagsList(); void OnTagSelected(wxListEvent &event); void OnTagDeselected(wxListEvent &event); void OnApply(wxCommandEvent &event); void OnDelete(wxCommandEvent &event); - void OnPreviousMove(wxCommandEvent &event); - void OnNextMove(wxCommandEvent &event); void OnLiveAnalysis(wxCommandEvent &event); void ApplyPreferences(); void OnLiveEngineClose(wxCloseEvent &e); diff --git a/src/game_tab/right_panel/editor/EditorCanvas.cpp b/src/game_tab/right_panel/editor/EditorCanvas.cpp index ae0c096..8a1c745 100644 --- a/src/game_tab/right_panel/editor/EditorCanvas.cpp +++ b/src/game_tab/right_panel/editor/EditorCanvas.cpp @@ -1,7 +1,7 @@ #include "EditorCanvas.hpp" -EditorCanvas::EditorCanvas(wxFrame *parent) - : wxPanel(parent), NeedRedraw(false) { +EditorCanvas::EditorCanvas(wxFrame *parent, std::shared_ptr game) + : wxPanel(parent), game(game), NeedRedraw(false) { hide_icon = LoadPNG("hide", wxSize(CGEditor::status.MoveIconWidth, CGEditor::status.MoveIconWidth)); t.ResizePieces(CGEditor::status.MoveIconWidth); @@ -173,28 +173,18 @@ void EditorCanvas::DrawElement(const cgeditor::Element &e) { } } void EditorCanvas::HandleEvent(const cgeditor::Event &e) { - wxLogDebug("Editor event!"); if (e.type == cgeditor::Event::Goto) { - wxCommandEvent event(GOTO_MOVE_EVENT, GetId()); - event.SetEventObject(this); - event.SetClientData(e.move); - ProcessEvent(event); + game->SetCurrent((HalfMove *)e.move); } else if (e.type == cgeditor::Event::Delete) { - wxCommandEvent event(DELETE_MOVE_EVENT, GetId()); - event.SetEventObject(this); - event.SetClientData(e.move); - ProcessEvent(event); + game->DeleteMove((HalfMove *)e.move); } else if (e.type == cgeditor::Event::Promote) { - wxCommandEvent event(PROMOTE_MOVE_EVENT, GetId()); - event.SetEventObject(this); - event.SetClientData(e.move); - ProcessEvent(event); + game->PromoteMove((HalfMove *)e.move); } else if (e.type == cgeditor::Event::SetAsMainline) { - wxCommandEvent event(SET_AS_MAINLINE_EVENT, GetId()); - event.SetEventObject(this); - event.SetClientData(e.move); - ProcessEvent(event); + game->SetMoveAsMainline((HalfMove *)e.move); } + wxCommandEvent event(GAME_CHANGE, GetId()); + event.SetEventObject(this); + ProcessEvent(event); } void EditorCanvas::MouseEvent(wxMouseEvent &event) { @@ -234,17 +224,5 @@ void EditorCanvas::SetMoves(HalfMove *moves, HalfMove *current) { Refresh(); } -void EditorCanvas::OnKeyEvent(wxKeyEvent &event) { - /*if (event.GetKeyCode() == WXK_LEFT) { - wxCommandEvent previousEvent(PREVIOUS_MOVE_EVENT, GetId()); - previousEvent.SetEventObject(this); - ProcessEvent(previousEvent); - } else if (event.GetKeyCode() == WXK_RIGHT) { - wxCommandEvent nextEvent(NEXT_MOVE_EVENT, GetId()); - nextEvent.SetEventObject(this); - ProcessEvent(nextEvent); - }*/ -} - wxBEGIN_EVENT_TABLE(EditorCanvas, wxPanel) EVT_PAINT(EditorCanvas::OnPaint) EVT_MOUSE_EVENTS(EditorCanvas::MouseEvent) wxEND_EVENT_TABLE() diff --git a/src/game_tab/right_panel/editor/EditorCanvas.hpp b/src/game_tab/right_panel/editor/EditorCanvas.hpp index 05d6258..7ee56d3 100644 --- a/src/game_tab/right_panel/editor/EditorCanvas.hpp +++ b/src/game_tab/right_panel/editor/EditorCanvas.hpp @@ -4,14 +4,10 @@ #include "CGEditor.hpp" #include "ochess.hpp" #include "../../left_panel/board/Theme.hpp" +#include "game_tab/Game.hpp" // Foreign events -wxDECLARE_EVENT(GOTO_MOVE_EVENT, wxCommandEvent); -wxDECLARE_EVENT(PREVIOUS_MOVE_EVENT, wxCommandEvent); -wxDECLARE_EVENT(NEXT_MOVE_EVENT, wxCommandEvent); -wxDECLARE_EVENT(DELETE_MOVE_EVENT, wxCommandEvent); -wxDECLARE_EVENT(PROMOTE_MOVE_EVENT, wxCommandEvent); -wxDECLARE_EVENT(SET_AS_MAINLINE_EVENT, wxCommandEvent); +wxDECLARE_EVENT(GAME_CHANGE, wxCommandEvent); class EditorCanvas : public wxPanel, public cgeditor::CGEditor { wxPaintDC *dc; @@ -20,6 +16,7 @@ class EditorCanvas : public wxPanel, public cgeditor::CGEditor { wxBitmap hide_icon; Theme t; wxFont default_font; + std::shared_ptr game; wxColour color_scrollbar_bg; wxColour color_scrollbar; @@ -29,13 +26,12 @@ class EditorCanvas : public wxPanel, public cgeditor::CGEditor { wxColour color_menu_item_bg; public: - EditorCanvas(wxFrame *parent); + EditorCanvas(wxFrame *parent, std::shared_ptr game); void OnPaint(wxPaintEvent &event); void MouseEvent(wxMouseEvent &event); void DrawElement(const cgeditor::Element &e); void HandleEvent(const cgeditor::Event &e); void SetMoves(HalfMove *moves, HalfMove *current); - void OnKeyEvent(wxKeyEvent &event); DECLARE_EVENT_TABLE() }; -- cgit v1.2.3 From 0cb695a22bf7371511893963a4896167d8c16ae1 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 14:35:20 +0100 Subject: Update animation trigger --- src/game_tab/left_panel/GameTabLeftPanel.cpp | 64 +++++++++++++--------------- src/game_tab/left_panel/GameTabLeftPanel.hpp | 1 + 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index b1bf516..2553d30 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -22,6 +22,8 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) // Configure FEN field fen_text_field->SetFont(wxFont(*wxNORMAL_FONT).Bold().Larger()); + last_move=game->GetCurrentMove(); + // Bind events: Bind(PLAY_MOVE_EVENT, &GameTabLeftPanel::OnPlay, this, wxID_ANY); Bind(wxEVT_BUTTON, [bc=board_canvas](wxCommandEvent &event){bc->Zoom(10);}, ZOOM_IN_BTN); @@ -77,58 +79,50 @@ void GameTabLeftPanel::Notify(bool animate, bool backward) { std::string fen = game->GetFen(); std::map captures; HalfMove *m = game->GetCurrentMove(); - //animate=false; - //backward=false; + std::string src,dst; + animate=false; + backward=false; if (m != nullptr) { captures = m->GetLineCaptures(); - /*HalfMove *parent=m->GetParent(); - if(!parent){ - animate=true; - } - if(last_absolute_move == parent->GetAbsoluteMove()){ - wxLogDebug("Next true!"); + std::string absolute_move= m->GetAbsoluteMove(); + // Check if we should animate + if(m->GetParent()==last_move){ + wxLogDebug("Animate animate next"); animate=true; - } else if(m->GetAbsoluteMove() == last_absolute_move){ + src=absolute_move.substr(0,2); + dst=absolute_move.substr(2,2); + } else if (m->GetMainline()==last_move){ + wxLogDebug("Animate Previous"); animate=true; backward=true; - }*/ + src=absolute_move.substr(2,2); + dst=absolute_move.substr(0,2); + } else { + wxLogDebug("Animate Previous"); + for(auto v: m->GetVariations()){ + if(v==last_move){ + animate=true; + backward=true; + src=absolute_move.substr(2,2); + dst=absolute_move.substr(0,2); + } + } + } } // Update board canvas: 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, + board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); - } - } - // If m undefined - if(!m){ - last_absolute_move=""; - } } + last_move=m; + // Update fen field: fen_text_field->SetValue(game->GetFen()); } diff --git a/src/game_tab/left_panel/GameTabLeftPanel.hpp b/src/game_tab/left_panel/GameTabLeftPanel.hpp index b22d6fc..e2fd7bc 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.hpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.hpp @@ -13,6 +13,7 @@ class GameTabLeftPanel : public TabGameLeftPanel { BoardCanvas *board_canvas; std::string last_absolute_move; bool repeat; + HalfMove *last_move; public: GameTabLeftPanel(wxFrame *parent, std::shared_ptr game); -- cgit v1.2.3 From 0c64a5f9567b23fde5480975bf393d46f3203786 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 14:46:04 +0100 Subject: Update animation trigger --- src/game_tab/left_panel/GameTabLeftPanel.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index 2553d30..8b44e28 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -84,20 +84,22 @@ void GameTabLeftPanel::Notify(bool animate, bool backward) { backward=false; if (m != nullptr) { captures = m->GetLineCaptures(); - std::string absolute_move= m->GetAbsoluteMove(); // Check if we should animate if(m->GetParent()==last_move){ - wxLogDebug("Animate animate next"); - animate=true; - src=absolute_move.substr(0,2); - dst=absolute_move.substr(2,2); + wxLogDebug("Animate animate next"); + std::string absolute_move= m->GetAbsoluteMove(); + animate=true; + src=absolute_move.substr(0,2); + dst=absolute_move.substr(2,2); } else if (m->GetMainline()==last_move){ wxLogDebug("Animate Previous"); + std::string absolute_move= last_move->GetAbsoluteMove(); animate=true; backward=true; src=absolute_move.substr(2,2); dst=absolute_move.substr(0,2); } else { + std::string absolute_move= last_move->GetAbsoluteMove(); wxLogDebug("Animate Previous"); for(auto v: m->GetVariations()){ if(v==last_move){ @@ -108,6 +110,15 @@ void GameTabLeftPanel::Notify(bool animate, bool backward) { } } } + }else if(last_move!=nullptr) { + if(last_move->GetParent()==nullptr){ + wxLogDebug("Animate Previous"); + std::string absolute_move= last_move->GetAbsoluteMove(); + animate=true; + backward=true; + src=absolute_move.substr(2,2); + dst=absolute_move.substr(0,2); + } } // Update board canvas: @@ -115,7 +126,7 @@ void GameTabLeftPanel::Notify(bool animate, bool backward) { board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures, game->GetTag("White"),game->GetTag("Black")); - } +} else{ board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); -- cgit v1.2.3 From ea76a42c6bb6c4432cb6a85e4388421c3ffd96f2 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 14:48:46 +0100 Subject: Update --- src/game_tab/left_panel/board/BoardCanvas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 1a85176..ba6519f 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -16,7 +16,7 @@ BoardCanvas::BoardCanvas(wxFrame *parent) ApplyPreferences(); // The following should be called when using an EVT_PAINT handler SetBackgroundStyle(wxBG_STYLE_PAINT); - adata.duration=200; + adata.duration=5000; adata.duration_fast=80; adata.fps=30; // Let GameTableLeftPanel process keyboard events: -- cgit v1.2.3 From f0e6f0b665527e027938d421bf5567d669b285c7 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 16:09:23 +0100 Subject: Update --- src/game_tab/left_panel/board/BoardCanvas.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index ba6519f..29eac3e 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -22,6 +22,9 @@ BoardCanvas::BoardCanvas(wxFrame *parent) // Let GameTableLeftPanel process keyboard events: 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();}); + Bind(wxEVT_PAINT, &BoardCanvas::OnPaint, this); + //Bind(wxEVT_IDLE, [p=this](wxIdleEvent& event){p->Refresh();p->Update();}); + } BoardCanvas::~BoardCanvas() { @@ -44,6 +47,7 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) { wxBufferedPaintDC dc(this); dc.SetBackground(*wxWHITE_BRUSH); dc.Clear(); + wxLogDebug("lll"); if(!adata.reuseBuffer){ // Setting up required attributes @@ -73,6 +77,7 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) { dc.DrawBitmap(*t->Get(adata.piece_moved), adata.src.x + adata.frame*(adata.transVect.x/adata.frames), adata.src.y + adata.frame*(adata.transVect.y/adata.frames), false); + wxLogDebug("Here: %d",(int)adata.src.y + adata.frame*(adata.transVect.y/adata.frames)); // end drawing adata.frame++; } @@ -404,6 +409,6 @@ void BoardCanvas::SetClockTime(short hours, short min, short sec, } } -wxBEGIN_EVENT_TABLE(BoardCanvas, wxPanel) EVT_PAINT(BoardCanvas::OnPaint) +wxBEGIN_EVENT_TABLE(BoardCanvas, wxPanel) EVT_MOUSE_EVENTS(BoardCanvas::MouseEvent) wxEND_EVENT_TABLE() -- cgit v1.2.3 From 88430eec2951290633875b0f036a33bbc6ee60a2 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 17:30:55 +0100 Subject: Improve editor drawing loop --- libs/cgeditor | 2 +- src/game_tab/right_panel/editor/EditorCanvas.cpp | 15 +++++++++++---- src/game_tab/right_panel/editor/EditorCanvas.hpp | 1 - 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/libs/cgeditor b/libs/cgeditor index 3271972..31c332d 160000 --- a/libs/cgeditor +++ b/libs/cgeditor @@ -1 +1 @@ -Subproject commit 3271972f9eef3069bf80de8be4c057102fff1138 +Subproject commit 31c332da9ab426daa73b68772d0ef9c1b0744a50 diff --git a/src/game_tab/right_panel/editor/EditorCanvas.cpp b/src/game_tab/right_panel/editor/EditorCanvas.cpp index 8a1c745..3856102 100644 --- a/src/game_tab/right_panel/editor/EditorCanvas.cpp +++ b/src/game_tab/right_panel/editor/EditorCanvas.cpp @@ -1,7 +1,7 @@ #include "EditorCanvas.hpp" EditorCanvas::EditorCanvas(wxFrame *parent, std::shared_ptr game) - : wxPanel(parent), game(game), NeedRedraw(false) { + : wxPanel(parent), game(game) { hide_icon = LoadPNG("hide", wxSize(CGEditor::status.MoveIconWidth, CGEditor::status.MoveIconWidth)); t.ResizePieces(CGEditor::status.MoveIconWidth); @@ -210,10 +210,17 @@ void EditorCanvas::MouseEvent(wxMouseEvent &event) { Refresh(); } - // Should another draw of CGEditor be made? - if (NeedRedraw) { + // Handle editor events + Update(); + bool need_redraw=false; + for(auto event: status.Events){ + HandleEvent(event); + need_redraw=true; + } + if(need_redraw){ + status.Events.clear(); Refresh(); - NeedRedraw = false; + Update(); } } diff --git a/src/game_tab/right_panel/editor/EditorCanvas.hpp b/src/game_tab/right_panel/editor/EditorCanvas.hpp index 7ee56d3..740a6a1 100644 --- a/src/game_tab/right_panel/editor/EditorCanvas.hpp +++ b/src/game_tab/right_panel/editor/EditorCanvas.hpp @@ -11,7 +11,6 @@ wxDECLARE_EVENT(GAME_CHANGE, wxCommandEvent); class EditorCanvas : public wxPanel, public cgeditor::CGEditor { wxPaintDC *dc; - bool NeedRedraw; wxPoint Middle(cgeditor::Element e); wxBitmap hide_icon; Theme t; -- cgit v1.2.3 From 4e85af5e08b86fb32d6698836f3a227bc6f086b3 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 18:18:27 +0100 Subject: Update Game tab --- src/game_tab/GameTab.cpp | 2 +- src/game_tab/HalfMove.cpp | 12 ++++++ src/game_tab/HalfMove.hpp | 2 + src/game_tab/left_panel/GameTabLeftPanel.cpp | 62 +++++----------------------- src/game_tab/left_panel/GameTabLeftPanel.hpp | 2 +- 5 files changed, 27 insertions(+), 53 deletions(-) diff --git a/src/game_tab/GameTab.cpp b/src/game_tab/GameTab.cpp index 8205788..32534fd 100644 --- a/src/game_tab/GameTab.cpp +++ b/src/game_tab/GameTab.cpp @@ -21,7 +21,7 @@ GameTab::GameTab(wxFrame *parent, std::shared_ptr game) // Refresh panels RefreshTabTitle(); - board_panel->Notify(false, false); + board_panel->Notify(); editor_panel->Notify(); board_panel->Bind(wxEVT_TOOL,&GameTab::OnToolClick,this); diff --git a/src/game_tab/HalfMove.cpp b/src/game_tab/HalfMove.cpp index 7f19480..a78eb0d 100644 --- a/src/game_tab/HalfMove.cpp +++ b/src/game_tab/HalfMove.cpp @@ -177,6 +177,18 @@ void HalfMove::Promote() { } } +bool HalfMove::HasChild(HalfMove *m){ + if(m!=mainline){ + for(auto var: variations){ + if(m== var){ + return(true); + } + } + return false; + } + return true; +} + bool HalfMove::IsVariation() { HalfMove *m = this; HalfMove *p = HalfMove::parent; diff --git a/src/game_tab/HalfMove.hpp b/src/game_tab/HalfMove.hpp index 3d5177e..7bc8b22 100644 --- a/src/game_tab/HalfMove.hpp +++ b/src/game_tab/HalfMove.hpp @@ -45,6 +45,8 @@ public: void Promote(); /// @brief Check if current half move is within a variation bool IsVariation(); + /// @brief Return true if current moves has m as mainline or variation + bool HasChild(HalfMove *m); /// @brief Get the root of a variation HalfMove *GetRoot(); /// @brief Get parent of the current move diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index 8b44e28..e986653 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -21,7 +21,6 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) // Configure FEN field fen_text_field->SetFont(wxFont(*wxNORMAL_FONT).Bold().Larger()); - last_move=game->GetCurrentMove(); // Bind events: @@ -33,11 +32,11 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) Bind(wxEVT_KEY_DOWN, [p=this](wxKeyEvent &e){ if(e.GetKeyCode() == WXK_RIGHT){ p->game->Next(); - p->Notify(true,false); + p->Notify(); p->repeat=true; } else if(e.GetKeyCode() == WXK_LEFT){ p->game->Previous(); - p->Notify(true,true); + p->Notify(); p->repeat=true; } // Notify other classes @@ -48,10 +47,10 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) Bind(wxEVT_MOUSEWHEEL, [p=this](wxMouseEvent& e){ if(e.GetWheelRotation()<0){ p->game->Next(); - p->Notify(true,false); + p->Notify(); }else { p->game->Previous(); - p->Notify(true,true); + p->Notify(); } // Notify other classes wxCommandEvent event(GAME_CHANGE, p->GetId()); @@ -69,71 +68,32 @@ void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { event.SetEventObject(this); ProcessEvent(event); } - // Refresh board canvas: - Notify(); } -void GameTabLeftPanel::Notify(bool animate, bool backward) { +void GameTabLeftPanel::Notify(bool skip_animation) { wxLogDebug("Called!"); // Update fen and captures std::string fen = game->GetFen(); std::map captures; + bool animate=false; HalfMove *m = game->GetCurrentMove(); std::string src,dst; - animate=false; - backward=false; - if (m != nullptr) { + if (m) captures = m->GetLineCaptures(); - // Check if we should animate - if(m->GetParent()==last_move){ - wxLogDebug("Animate animate next"); - std::string absolute_move= m->GetAbsoluteMove(); - animate=true; - src=absolute_move.substr(0,2); - dst=absolute_move.substr(2,2); - } else if (m->GetMainline()==last_move){ - wxLogDebug("Animate Previous"); - std::string absolute_move= last_move->GetAbsoluteMove(); - animate=true; - backward=true; - src=absolute_move.substr(2,2); - dst=absolute_move.substr(0,2); - } else { - std::string absolute_move= last_move->GetAbsoluteMove(); - wxLogDebug("Animate Previous"); - for(auto v: m->GetVariations()){ - if(v==last_move){ - animate=true; - backward=true; - src=absolute_move.substr(2,2); - dst=absolute_move.substr(0,2); - } - } - } - }else if(last_move!=nullptr) { - if(last_move->GetParent()==nullptr){ - wxLogDebug("Animate Previous"); - std::string absolute_move= last_move->GetAbsoluteMove(); - animate=true; - backward=true; - src=absolute_move.substr(2,2); - dst=absolute_move.substr(0,2); - } - } + // Update board canvas: - if(!animate){ + if(!skip_animation || animate){ board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures, game->GetTag("White"),game->GetTag("Black")); -} + } else{ board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); } - + // Update last move last_move=m; - // Update fen field: fen_text_field->SetValue(game->GetFen()); } diff --git a/src/game_tab/left_panel/GameTabLeftPanel.hpp b/src/game_tab/left_panel/GameTabLeftPanel.hpp index e2fd7bc..5073e9c 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.hpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.hpp @@ -17,7 +17,7 @@ class GameTabLeftPanel : public TabGameLeftPanel { public: GameTabLeftPanel(wxFrame *parent, std::shared_ptr game); - void Notify(bool animate=false,bool backward=false); + void Notify(bool skip_animation=false); void OnPlay(wxCommandEvent &event); void OnGotoMove(wxCommandEvent &event); void OnRefreshBoard(wxCommandEvent &event); -- cgit v1.2.3 From bbf3282839eb9efe57b1451763ef0859198c33af Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 19:05:15 +0100 Subject: Update Game tab --- src/game_tab/Game.hpp | 2 ++ src/game_tab/HalfMove.cpp | 12 ------------ src/game_tab/HalfMove.hpp | 2 -- src/game_tab/left_panel/GameTabLeftPanel.cpp | 9 ++++----- src/game_tab/left_panel/GameTabLeftPanel.hpp | 5 ++--- 5 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/game_tab/Game.hpp b/src/game_tab/Game.hpp index 25284ee..9398056 100644 --- a/src/game_tab/Game.hpp +++ b/src/game_tab/Game.hpp @@ -5,6 +5,8 @@ #include "ochess.hpp" #include +#define UNPACK_ABSOLUTE_MOVE(MOVE,SRC,DST) {(SRC)=(MOVE).substr(0,2);(DST)=(MOVE).substr(2,2);} + class Game { std::string board; std::string initial_fen; diff --git a/src/game_tab/HalfMove.cpp b/src/game_tab/HalfMove.cpp index a78eb0d..7f19480 100644 --- a/src/game_tab/HalfMove.cpp +++ b/src/game_tab/HalfMove.cpp @@ -177,18 +177,6 @@ void HalfMove::Promote() { } } -bool HalfMove::HasChild(HalfMove *m){ - if(m!=mainline){ - for(auto var: variations){ - if(m== var){ - return(true); - } - } - return false; - } - return true; -} - bool HalfMove::IsVariation() { HalfMove *m = this; HalfMove *p = HalfMove::parent; diff --git a/src/game_tab/HalfMove.hpp b/src/game_tab/HalfMove.hpp index 7bc8b22..3d5177e 100644 --- a/src/game_tab/HalfMove.hpp +++ b/src/game_tab/HalfMove.hpp @@ -45,8 +45,6 @@ public: void Promote(); /// @brief Check if current half move is within a variation bool IsVariation(); - /// @brief Return true if current moves has m as mainline or variation - bool HasChild(HalfMove *m); /// @brief Get the root of a variation HalfMove *GetRoot(); /// @brief Get parent of the current move diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index e986653..1142e99 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -21,7 +21,6 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) // Configure FEN field fen_text_field->SetFont(wxFont(*wxNORMAL_FONT).Bold().Larger()); - last_move=game->GetCurrentMove(); // Bind events: Bind(PLAY_MOVE_EVENT, &GameTabLeftPanel::OnPlay, this, wxID_ANY); @@ -68,6 +67,7 @@ void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { event.SetEventObject(this); ProcessEvent(event); } + Notify(true); } void GameTabLeftPanel::Notify(bool skip_animation) { @@ -78,12 +78,13 @@ void GameTabLeftPanel::Notify(bool skip_animation) { bool animate=false; HalfMove *m = game->GetCurrentMove(); std::string src,dst; - if (m) + if (m){ captures = m->GetLineCaptures(); + } // Update board canvas: - if(!skip_animation || animate){ + if(skip_animation || !animate){ board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures, game->GetTag("White"),game->GetTag("Black")); @@ -92,8 +93,6 @@ void GameTabLeftPanel::Notify(bool skip_animation) { board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); } - // Update last move - last_move=m; // Update fen field: fen_text_field->SetValue(game->GetFen()); } diff --git a/src/game_tab/left_panel/GameTabLeftPanel.hpp b/src/game_tab/left_panel/GameTabLeftPanel.hpp index 5073e9c..359b815 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.hpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.hpp @@ -11,10 +11,9 @@ wxDECLARE_EVENT(GAME_CHANGE, wxCommandEvent); class GameTabLeftPanel : public TabGameLeftPanel { std::shared_ptr game; BoardCanvas *board_canvas; - std::string last_absolute_move; bool repeat; - HalfMove *last_move; - + std::string last_absolute_move; + public: GameTabLeftPanel(wxFrame *parent, std::shared_ptr game); void Notify(bool skip_animation=false); -- cgit v1.2.3 From dcf6c01e54c5306fac464706cff81e75ee8f05bf Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 19:13:34 +0100 Subject: Update Game tab --- src/game_tab/HalfMove.cpp | 15 +++++++++++++++ src/game_tab/HalfMove.hpp | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/game_tab/HalfMove.cpp b/src/game_tab/HalfMove.cpp index 7f19480..01621e2 100644 --- a/src/game_tab/HalfMove.cpp +++ b/src/game_tab/HalfMove.cpp @@ -177,6 +177,21 @@ void HalfMove::Promote() { } } +bool HalfMove::HasParent(HalfMove*m){ + return m==parent; +} + +bool HalfMove::HasChild(HalfMove*m){ + if(mainline==m){ + return true; + } + for(auto var: variations){ + if(var == m) + return true; + } + return false; +} + bool HalfMove::IsVariation() { HalfMove *m = this; HalfMove *p = HalfMove::parent; diff --git a/src/game_tab/HalfMove.hpp b/src/game_tab/HalfMove.hpp index 3d5177e..08a190b 100644 --- a/src/game_tab/HalfMove.hpp +++ b/src/game_tab/HalfMove.hpp @@ -46,6 +46,8 @@ public: /// @brief Check if current half move is within a variation bool IsVariation(); /// @brief Get the root of a variation + bool HasParent(HalfMove*m); + bool HasChild(HalfMove*m); HalfMove *GetRoot(); /// @brief Get parent of the current move HalfMove *GetParent(); -- cgit v1.2.3 From 29d5850b2f44ad520fc89324a110a721ac08841b Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 20:21:23 +0100 Subject: Improve board canvas --- src/game_tab/Game.cpp | 6 ++++++ src/game_tab/Game.hpp | 1 + src/game_tab/left_panel/GameTabLeftPanel.cpp | 23 +++++++++++++++++++++-- src/game_tab/left_panel/GameTabLeftPanel.hpp | 4 ++-- src/game_tab/left_panel/board/BoardCanvas.cpp | 26 +++++++++++++++----------- src/game_tab/left_panel/board/BoardCanvas.hpp | 1 + src/game_tab/left_panel/board/Theme.cpp | 5 ++++- src/game_tab/left_panel/board/Theme.hpp | 2 +- 8 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/game_tab/Game.cpp b/src/game_tab/Game.cpp index fdc754a..8ab67cb 100644 --- a/src/game_tab/Game.cpp +++ b/src/game_tab/Game.cpp @@ -142,6 +142,12 @@ void Game::Next() { } } +HalfMove *Game::GetNextMove(){ + if(current!=nullptr) + return current->GetMainline(); + return moves; +} + void Game::SetCurrent(HalfMove *m) { current = m; } std::string Game::GetFen() { diff --git a/src/game_tab/Game.hpp b/src/game_tab/Game.hpp index 9398056..e0337ce 100644 --- a/src/game_tab/Game.hpp +++ b/src/game_tab/Game.hpp @@ -27,6 +27,7 @@ public: void SetTag(std::string tagname, std::string value); void DeleteTag(std::string tagname); HalfMove *GetCurrentMove(); + HalfMove *GetNextMove(); HalfMove *GetMoves(); std::string GetFen(); std::string GetResult(); diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index 1142e99..fd89791 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -21,6 +21,7 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) // Configure FEN field fen_text_field->SetFont(wxFont(*wxNORMAL_FONT).Bold().Larger()); + last_move=game->GetCurrentMove(); // Bind events: Bind(PLAY_MOVE_EVENT, &GameTabLeftPanel::OnPlay, this, wxID_ANY); @@ -62,12 +63,12 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { wxLogDebug("Game tab received PLAY_MOVE_EVENT"); if (game->Play(event.GetString().ToStdString())) { + Notify(true); // Notify other classes wxCommandEvent event(GAME_CHANGE, GetId()); event.SetEventObject(this); ProcessEvent(event); } - Notify(true); } void GameTabLeftPanel::Notify(bool skip_animation) { @@ -78,10 +79,26 @@ void GameTabLeftPanel::Notify(bool skip_animation) { bool animate=false; HalfMove *m = game->GetCurrentMove(); std::string src,dst; + + // Update capture and check if we should to animations during moves change: if (m){ captures = m->GetLineCaptures(); + if(m->HasParent(last_move)){ + UNPACK_ABSOLUTE_MOVE(m->GetAbsoluteMove(),src,dst); + animate=true; + }else if(m->HasChild(last_move)){ + // Accessing last_move here is safe since it is still + // in the tree of moves (since HasChild found it so not deleted) + UNPACK_ABSOLUTE_MOVE(last_move->GetAbsoluteMove(),dst,src); + animate=true; + } + } else if(game->GetNextMove()){ // First move animation + HalfMove *next=game->GetNextMove(); + if(next==last_move){ + UNPACK_ABSOLUTE_MOVE(game->GetNextMove()->GetAbsoluteMove(),dst,src); + animate=true; + } } - // Update board canvas: if(skip_animation || !animate){ @@ -93,6 +110,8 @@ void GameTabLeftPanel::Notify(bool skip_animation) { board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, game->IsBlackToPlay(), captures,src,dst,repeat); } + // Update last move + last_move=m; // Update fen field: fen_text_field->SetValue(game->GetFen()); } diff --git a/src/game_tab/left_panel/GameTabLeftPanel.hpp b/src/game_tab/left_panel/GameTabLeftPanel.hpp index 359b815..56297d8 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.hpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.hpp @@ -12,8 +12,8 @@ class GameTabLeftPanel : public TabGameLeftPanel { std::shared_ptr game; BoardCanvas *board_canvas; bool repeat; - std::string last_absolute_move; - + HalfMove *last_move; + public: GameTabLeftPanel(wxFrame *parent, std::shared_ptr game); void Notify(bool skip_animation=false); diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 29eac3e..5297250 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -19,12 +19,22 @@ BoardCanvas::BoardCanvas(wxFrame *parent) adata.duration=5000; adata.duration_fast=80; adata.fps=30; + adata.buffer=new wxBitmap(500,500,32); // Let GameTableLeftPanel process keyboard events: 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();}); Bind(wxEVT_PAINT, &BoardCanvas::OnPaint, this); - //Bind(wxEVT_IDLE, [p=this](wxIdleEvent& event){p->Refresh();p->Update();}); + Bind(wxEVT_SIZE, &BoardCanvas::OnResize, this); +} +void BoardCanvas::OnResize(wxSizeEvent &e){ + wxSize size=e.GetSize(); + if(size.x>100 && size.y>100){ + // Setup buffer (use for animations) + if(adata.buffer!=nullptr) + free(adata.buffer); + adata.buffer=new wxBitmap(size.x,size.y,32); + } } BoardCanvas::~BoardCanvas() { @@ -46,8 +56,6 @@ BoardCanvas::BoardCanvas(wxFrame *parent, std::uint32_t square_width, void BoardCanvas::OnPaint(wxPaintEvent &event) { wxBufferedPaintDC dc(this); dc.SetBackground(*wxWHITE_BRUSH); - dc.Clear(); - wxLogDebug("lll"); if(!adata.reuseBuffer){ // Setting up required attributes @@ -60,12 +68,8 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) { boardX = 0; if (boardY > canvas_size.y) boardY = 0; - - // Setup buffer (later use for animations) - if(adata.buffer!=nullptr) - free(adata.buffer); - adata.buffer=new wxBitmap(canvas_size.x,canvas_size.y,32); wxMemoryDC memDC(*adata.buffer); + memDC.Clear(); DrawBoard(memDC); dc.Blit(0,0,canvas_size.x,canvas_size.y,(wxDC*)&memDC,0,0); } @@ -77,8 +81,7 @@ void BoardCanvas::OnPaint(wxPaintEvent &event) { dc.DrawBitmap(*t->Get(adata.piece_moved), adata.src.x + adata.frame*(adata.transVect.x/adata.frames), adata.src.y + adata.frame*(adata.transVect.y/adata.frames), false); - wxLogDebug("Here: %d",(int)adata.src.y + adata.frame*(adata.transVect.y/adata.frames)); - // end drawing + // End drawing adata.frame++; } } @@ -390,7 +393,8 @@ void BoardCanvas::MouseEvent(wxMouseEvent &event) { } void BoardCanvas::Zoom(std::int32_t zoom) { - t->Zoom(zoom); + if(!t->Zoom(zoom)) + return; t_captures->ResizePieces(t->GetPiecesSizes() * CAPTURE_FACTOR); Refresh(); } diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp index b26526f..76aa60f 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.hpp +++ b/src/game_tab/left_panel/board/BoardCanvas.hpp @@ -89,6 +89,7 @@ public: void MouseEvent(wxMouseEvent &event); void Zoom(std::int32_t zoom); void Swap(); + void OnResize(wxSizeEvent &e); void SetupBoard(std::string board, bool is_black_turn, std::map captures, std::string white_player, std::string black_player); diff --git a/src/game_tab/left_panel/board/Theme.cpp b/src/game_tab/left_panel/board/Theme.cpp index 6ecbafc..0c05fa1 100644 --- a/src/game_tab/left_panel/board/Theme.cpp +++ b/src/game_tab/left_panel/board/Theme.cpp @@ -130,10 +130,13 @@ void Theme::ResizeSquares(std::uint32_t width) { skin_scaled['3']->SetMask(RoundedMask(width, 3)); } -void Theme::Zoom(int amount) { +bool Theme::Zoom(int amount) { double width = skin_scaled['s']->GetWidth() + amount; + if(width<=20) + return false; ResizeSquares(std::max(width, 1.0)); ResizePieces(std::max(width * PIECE_SIZE_FACTOR, 1.0)); + return true; } void Theme::SetSquareRadius(std::uint8_t radius) { diff --git a/src/game_tab/left_panel/board/Theme.hpp b/src/game_tab/left_panel/board/Theme.hpp index 88036d8..b896d09 100644 --- a/src/game_tab/left_panel/board/Theme.hpp +++ b/src/game_tab/left_panel/board/Theme.hpp @@ -29,7 +29,7 @@ public: void ResizeSquaresAndPieces(std::uint32_t width); void SetSquareRadius(std::uint8_t radius); std::uint8_t GetSquareRadius(); - void Zoom(int amount); + bool Zoom(int amount); double GetPiecesSizes(); double GetSquaresSizes(); -- cgit v1.2.3 From dd24427d81d04765cbe3426b511b1ad05952d087 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Sun, 1 Jan 2023 20:28:39 +0100 Subject: Debug drawing canvas --- src/game_tab/left_panel/board/BoardCanvas.cpp | 2 +- src/game_tab/left_panel/board/Theme.cpp | 2 ++ src/game_tab/right_panel/editor/EditorCanvas.cpp | 6 +++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 5297250..0e44979 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -16,7 +16,7 @@ BoardCanvas::BoardCanvas(wxFrame *parent) ApplyPreferences(); // The following should be called when using an EVT_PAINT handler SetBackgroundStyle(wxBG_STYLE_PAINT); - adata.duration=5000; + adata.duration=200; adata.duration_fast=80; adata.fps=30; adata.buffer=new wxBitmap(500,500,32); diff --git a/src/game_tab/left_panel/board/Theme.cpp b/src/game_tab/left_panel/board/Theme.cpp index 0c05fa1..6c662dc 100644 --- a/src/game_tab/left_panel/board/Theme.cpp +++ b/src/game_tab/left_panel/board/Theme.cpp @@ -134,6 +134,8 @@ bool Theme::Zoom(int amount) { double width = skin_scaled['s']->GetWidth() + amount; if(width<=20) return false; + if(width>=180) + return false; ResizeSquares(std::max(width, 1.0)); ResizePieces(std::max(width * PIECE_SIZE_FACTOR, 1.0)); return true; diff --git a/src/game_tab/right_panel/editor/EditorCanvas.cpp b/src/game_tab/right_panel/editor/EditorCanvas.cpp index 3856102..5a0afd0 100644 --- a/src/game_tab/right_panel/editor/EditorCanvas.cpp +++ b/src/game_tab/right_panel/editor/EditorCanvas.cpp @@ -14,13 +14,17 @@ EditorCanvas::EditorCanvas(wxFrame *parent, std::shared_ptr game) color_comments_bg=wxColour(255, 255, 204); color_current_move_bg=wxColour(216, 216, 216); color_menu_item_bg=wxColour(216, 216, 216); - + // The following should be called when using an EVT_PAINT handler + SetBackgroundStyle(wxBG_STYLE_PAINT); + 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 EditorCanvas::OnPaint(wxPaintEvent &event) { wxPaintDC current_dc(this); + current_dc.SetBackground(*wxWHITE_BRUSH); + current_dc.Clear(); dc = ¤t_dc; // Refresh canvas size -- cgit v1.2.3 From 4f2c68de6013bab307b299cfd6158225475a3fc6 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 2 Jan 2023 08:15:51 +0100 Subject: Update CGEditor+debug --- libs/cgeditor | 2 +- src/game_tab/left_panel/GameTabLeftPanel.cpp | 2 +- src/game_tab/right_panel/editor/EditorCanvas.cpp | 8 +------- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/libs/cgeditor b/libs/cgeditor index 31c332d..5e18d43 160000 --- a/libs/cgeditor +++ b/libs/cgeditor @@ -1 +1 @@ -Subproject commit 31c332da9ab426daa73b68772d0ef9c1b0744a50 +Subproject commit 5e18d43a6ba4fd378178418de6b2ca7a67d64c21 diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index fd89791..fa97f6f 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -63,12 +63,12 @@ GameTabLeftPanel::GameTabLeftPanel(wxFrame *parent, std::shared_ptr game) void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { wxLogDebug("Game tab received PLAY_MOVE_EVENT"); if (game->Play(event.GetString().ToStdString())) { - Notify(true); // Notify other classes wxCommandEvent event(GAME_CHANGE, GetId()); event.SetEventObject(this); ProcessEvent(event); } + Notify(true); // Redraw event is move failed! Otherwise piece not resets to it initial position after dragging } void GameTabLeftPanel::Notify(bool skip_animation) { diff --git a/src/game_tab/right_panel/editor/EditorCanvas.cpp b/src/game_tab/right_panel/editor/EditorCanvas.cpp index 5a0afd0..19d81ec 100644 --- a/src/game_tab/right_panel/editor/EditorCanvas.cpp +++ b/src/game_tab/right_panel/editor/EditorCanvas.cpp @@ -216,13 +216,7 @@ void EditorCanvas::MouseEvent(wxMouseEvent &event) { // Handle editor events Update(); - bool need_redraw=false; - for(auto event: status.Events){ - HandleEvent(event); - need_redraw=true; - } - if(need_redraw){ - status.Events.clear(); + if(ProcessEvents()){ Refresh(); Update(); } -- cgit v1.2.3 From 98edb4253c0d131b855bee882530fa2b28906fc2 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 2 Jan 2023 08:28:59 +0100 Subject: Debug BoardCanvas --- src/game_tab/left_panel/board/BoardCanvas.cpp | 12 ++++++++---- src/game_tab/left_panel/board/BoardCanvas.hpp | 1 - 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 0e44979..6581934 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -25,6 +25,11 @@ BoardCanvas::BoardCanvas(wxFrame *parent) Bind(wxEVT_KEY_UP, [p=this](wxKeyEvent &e){e.ResumePropagation(1);e.Skip();}); Bind(wxEVT_PAINT, &BoardCanvas::OnPaint, this); Bind(wxEVT_SIZE, &BoardCanvas::OnResize, this); + + // Mouse events: + Bind(wxEVT_MOTION, &BoardCanvas::MouseEvent, this); + Bind(wxEVT_LEFT_DOWN, &BoardCanvas::MouseEvent, this); + Bind(wxEVT_LEFT_UP, &BoardCanvas::MouseEvent, this); } void BoardCanvas::OnResize(wxSizeEvent &e){ @@ -367,6 +372,9 @@ void BoardCanvas::MouseEvent(wxMouseEvent &event) { ((char)('a' + file)) + std::to_string(rank + 1); event.SetString(move); ProcessEvent(event); + } else { + // If square not valid just redraw (place piece back to its square) + Refresh(); } } if (event.LeftDown()) { @@ -412,7 +420,3 @@ void BoardCanvas::SetClockTime(short hours, short min, short sec, white_time = std::make_tuple(hours, min, sec); } } - -wxBEGIN_EVENT_TABLE(BoardCanvas, wxPanel) - EVT_MOUSE_EVENTS(BoardCanvas::MouseEvent) - wxEND_EVENT_TABLE() diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp index 76aa60f..9a00262 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.hpp +++ b/src/game_tab/left_panel/board/BoardCanvas.hpp @@ -95,5 +95,4 @@ public: std::string white_player, std::string black_player); void Animate(const std::string &board, bool is_black_turn, std::map captures, std::string src, std::string dst,bool faster); void SetClockTime(short hours, short min, short sec, bool IsBlack); - DECLARE_EVENT_TABLE() }; -- cgit v1.2.3 From 3e40032109886786e469796dced8523d60b90ee4 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 2 Jan 2023 10:12:20 +0100 Subject: Simplify absolute moves --- src/game_tab/Game.hpp | 2 -- src/game_tab/HalfMove.cpp | 22 +++++++++++++++++----- src/game_tab/HalfMove.hpp | 7 +++---- src/game_tab/left_panel/GameTabLeftPanel.cpp | 10 ++++------ 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/game_tab/Game.hpp b/src/game_tab/Game.hpp index e0337ce..bc00c5a 100644 --- a/src/game_tab/Game.hpp +++ b/src/game_tab/Game.hpp @@ -5,8 +5,6 @@ #include "ochess.hpp" #include -#define UNPACK_ABSOLUTE_MOVE(MOVE,SRC,DST) {(SRC)=(MOVE).substr(0,2);(DST)=(MOVE).substr(2,2);} - class Game { std::string board; std::string initial_fen; diff --git a/src/game_tab/HalfMove.cpp b/src/game_tab/HalfMove.cpp index 01621e2..ae63527 100644 --- a/src/game_tab/HalfMove.cpp +++ b/src/game_tab/HalfMove.cpp @@ -1,13 +1,13 @@ #include "HalfMove.hpp" HalfMove::HalfMove(std::string move_absolute,std::string move_san) : capture(' ') { - this->move_absolute=move_absolute; + SetAbsoluteMove(move_absolute); this->move = move_san; fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; } HalfMove::HalfMove(std::string move_absolute, std::string move_san, std::string fen) : fen(fen), capture(' ') { - this->move_absolute=move_absolute; + SetAbsoluteMove(move_absolute); this->move = move_san; } @@ -21,7 +21,8 @@ HalfMove::~HalfMove() { } HalfMove::HalfMove(HalfMove *m){ - move_absolute=m->move_absolute; + src=m->src; + dst=m->dst; move=m->move; fen=m->fen; capture=m->capture; @@ -137,6 +138,11 @@ void HalfMove::SetAsMainline() { HalfMove *HalfMove::GetMainline() { return (mainline); } +void HalfMove::SetAbsoluteMove(const std::string &move_absolute){ + this->src=move_absolute.substr(0,2); + this->dst=move_absolute.substr(2,2); +} + HalfMove::HalfMove(pgnp::HalfMove *m) : capture(' ') { this->move = m->move; this->nag = m->NAG; @@ -151,6 +157,11 @@ HalfMove::HalfMove(pgnp::HalfMove *m) : capture(' ') { } } +void HalfMove::GetAbsoluteMove(std::string &src,std::string &dst){ + src=this->src; + dst=this->dst; +} + void HalfMove::SetFen(std::string fen) { this->fen = fen; } void HalfMove::Promote() { @@ -213,8 +224,9 @@ bool HalfMove::IsABlackMove() { return (IsBlack); } void HalfMove::BuildAndVerify(HalfMove *m, std::string fen) { arbiter.Setup(fen); - m->move_absolute=arbiter.ParseSAN(m->move); - bool work = arbiter.Play(m->move_absolute,arbiter.ParseSANPromotion(m->move)); + std::string move_absolute=arbiter.ParseSAN(m->move); + m->SetAbsoluteMove(move_absolute); + bool work = arbiter.Play(move_absolute,arbiter.ParseSANPromotion(m->move)); if (!work) { wxLogDebug("Bug! %s", m->move); } diff --git a/src/game_tab/HalfMove.hpp b/src/game_tab/HalfMove.hpp index 08a190b..9775c3e 100644 --- a/src/game_tab/HalfMove.hpp +++ b/src/game_tab/HalfMove.hpp @@ -21,11 +21,9 @@ class HalfMove : public cgeditor::CGEHalfMove { std::string fen; char capture; void BuildAndVerify(HalfMove *m, std::string fen); - std::string move_absolute; + std::string src,dst; public: - - HalfMove(HalfMove *m); HalfMove(std::string move_absolute,std::string move_san); HalfMove(std::string move_absolute,std::string move_san, std::string fen); @@ -62,7 +60,8 @@ public: void SetFen(std::string fen); void SetCapture(char c); bool IsABlackMove(); - std::string GetAbsoluteMove(){return move_absolute;}; + void GetAbsoluteMove(std::string &src,std::string &dst); + void SetAbsoluteMove(const std::string &move_absolute); /** * @brief Build current move diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index fa97f6f..4aaddb4 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -72,34 +72,32 @@ void GameTabLeftPanel::OnPlay(wxCommandEvent &event) { } void GameTabLeftPanel::Notify(bool skip_animation) { - wxLogDebug("Called!"); // Update fen and captures std::string fen = game->GetFen(); std::map captures; bool animate=false; HalfMove *m = game->GetCurrentMove(); std::string src,dst; - // Update capture and check if we should to animations during moves change: if (m){ captures = m->GetLineCaptures(); if(m->HasParent(last_move)){ - UNPACK_ABSOLUTE_MOVE(m->GetAbsoluteMove(),src,dst); + m->GetAbsoluteMove(src,dst); animate=true; }else if(m->HasChild(last_move)){ // Accessing last_move here is safe since it is still // in the tree of moves (since HasChild found it so not deleted) - UNPACK_ABSOLUTE_MOVE(last_move->GetAbsoluteMove(),dst,src); + last_move->GetAbsoluteMove(dst,src); animate=true; } } else if(game->GetNextMove()){ // First move animation HalfMove *next=game->GetNextMove(); if(next==last_move){ - UNPACK_ABSOLUTE_MOVE(game->GetNextMove()->GetAbsoluteMove(),dst,src); + game->GetNextMove()->GetAbsoluteMove(dst,src); animate=true; } } - + // Update board canvas: if(skip_animation || !animate){ board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board, -- cgit v1.2.3 From 73f7be6c0366fd4334e70d68f0376c64357edd80 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 2 Jan 2023 10:56:27 +0100 Subject: Add mat icon --- src/binres/binres.cpp | 2 + src/binres/binres.hpp | 1 + src/binres/mat.png | Bin 0 -> 1833 bytes src/binres/mat_png.hpp | 155 ++++++++++++++++++++++++++ src/game_tab/left_panel/board/BoardCanvas.cpp | 8 ++ src/game_tab/left_panel/board/BoardCanvas.hpp | 10 ++ src/game_tab/left_panel/board/Theme.cpp | 10 +- src/game_tab/left_panel/board/Theme.hpp | 1 + 8 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 src/binres/mat.png create mode 100644 src/binres/mat_png.hpp diff --git a/src/binres/binres.cpp b/src/binres/binres.cpp index 963a714..14a2077 100644 --- a/src/binres/binres.cpp +++ b/src/binres/binres.cpp @@ -19,6 +19,8 @@ wxBitmap LoadPNG(std::string icon) { return (wxBITMAP_PNG(chesscom_8bits)); } else if (icon == "hide") { return (wxBITMAP_PNG(hide)); + } else if (icon == "mat") { + return (wxBITMAP_PNG(mat)); } return (wxNullBitmap); } \ No newline at end of file diff --git a/src/binres/binres.hpp b/src/binres/binres.hpp index 6db39fd..8551932 100644 --- a/src/binres/binres.hpp +++ b/src/binres/binres.hpp @@ -7,6 +7,7 @@ #include "cburnett_png.hpp" #include "chesscom_8bits_png.hpp" #include "hide_png.hpp" +#include "mat_png.hpp" wxBitmap LoadPNG(std::string icon, wxSize size); wxBitmap LoadPNG(std::string icon); \ No newline at end of file diff --git a/src/binres/mat.png b/src/binres/mat.png new file mode 100644 index 0000000..54b4b9c Binary files /dev/null and b/src/binres/mat.png differ diff --git a/src/binres/mat_png.hpp b/src/binres/mat_png.hpp new file mode 100644 index 0000000..c00391c --- /dev/null +++ b/src/binres/mat_png.hpp @@ -0,0 +1,155 @@ +static unsigned char mat_png[] = { +0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, +0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, +0x08, 0x06, 0x00, 0x00, 0x00, 0x1e, 0x3f, 0x88, 0xb1, 0x00, 0x00, 0x00, +0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0f, 0x33, 0x00, 0x00, 0x0f, +0x33, 0x01, 0x61, 0xf4, 0x31, 0x43, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, +0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x77, +0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63, 0x61, 0x70, 0x65, 0x2e, +0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00, 0x00, 0x06, 0xb6, 0x49, +0x44, 0x41, 0x54, 0x68, 0x81, 0xd5, 0x5a, 0x6b, 0x4c, 0x1c, 0x55, 0x14, +0xfe, 0xce, 0x9d, 0xd9, 0xa5, 0xb2, 0x50, 0xd0, 0x82, 0xd5, 0x1f, 0x0a, +0xb5, 0x04, 0xdc, 0x56, 0xbb, 0x50, 0x8d, 0x68, 0xb1, 0x65, 0x60, 0x11, +0xc5, 0x3f, 0xda, 0xc4, 0x47, 0xac, 0xb6, 0xc6, 0x47, 0x2d, 0x1a, 0x5f, +0x31, 0x1a, 0x8d, 0xbf, 0x7c, 0x5b, 0x63, 0x7f, 0x18, 0x63, 0x7d, 0x44, +0x8d, 0x89, 0xd8, 0x26, 0x86, 0x68, 0x8c, 0x1a, 0xa3, 0xd0, 0x5d, 0x96, +0xad, 0x4d, 0xd5, 0xca, 0xa3, 0xad, 0x62, 0xa8, 0xf4, 0x45, 0x8d, 0x54, +0x28, 0xb6, 0xb5, 0x05, 0x5d, 0xba, 0x33, 0xc7, 0x1f, 0xad, 0xc8, 0x30, +0x77, 0x76, 0x67, 0x76, 0x16, 0x1b, 0xbf, 0x7f, 0xfb, 0xcd, 0xd9, 0x73, +0xcf, 0x77, 0xe7, 0xdc, 0xb9, 0xf7, 0x9e, 0x7b, 0x89, 0x99, 0x91, 0x0d, +0x44, 0xa3, 0xd1, 0x12, 0x21, 0x50, 0x07, 0xf0, 0xa5, 0x04, 0x54, 0x00, +0x5c, 0x0a, 0xd0, 0x1c, 0x00, 0x79, 0xa7, 0x4c, 0x8e, 0x03, 0x3c, 0x0a, +0xd0, 0x5e, 0x06, 0x76, 0x09, 0x60, 0x9b, 0x92, 0xe4, 0x8e, 0x9a, 0x86, +0x86, 0xc1, 0x6c, 0xb4, 0x4f, 0x5e, 0x84, 0xc4, 0xe3, 0x6d, 0xf3, 0x58, +0x57, 0x56, 0x42, 0xe0, 0x56, 0x30, 0xca, 0x33, 0x74, 0xd3, 0x0f, 0xc2, +0x06, 0x66, 0xa5, 0x45, 0xd3, 0xb4, 0x7d, 0x99, 0xc6, 0x92, 0x91, 0x90, +0xcd, 0x91, 0xc8, 0x22, 0x43, 0xf0, 0xa3, 0x20, 0x5a, 0x01, 0x40, 0xc9, +0xb4, 0x71, 0x13, 0x18, 0x06, 0x08, 0x5f, 0x80, 0xf0, 0x4c, 0x6d, 0x6d, +0x78, 0x9b, 0xdb, 0xbf, 0xbb, 0x12, 0x12, 0x89, 0x44, 0xe6, 0xaa, 0x82, +0x5f, 0x06, 0xd1, 0x6d, 0x00, 0xc8, 0x6d, 0x63, 0x2e, 0xd0, 0x9a, 0xd4, +0xf1, 0x40, 0x38, 0x1c, 0xfe, 0xcd, 0xe9, 0x1f, 0x1c, 0x0b, 0xe9, 0xec, +0x8c, 0xde, 0x02, 0xe6, 0xd7, 0x01, 0x14, 0x66, 0x1a, 0x9d, 0x4b, 0x1c, +0x26, 0xe0, 0xde, 0x65, 0x5a, 0xf8, 0x43, 0x27, 0xc6, 0x69, 0x85, 0xf4, +0xb5, 0xb6, 0xfa, 0x47, 0x8a, 0xe6, 0xbc, 0x06, 0xe2, 0xd5, 0x59, 0x09, +0xcf, 0x25, 0x08, 0xfc, 0x66, 0xd1, 0xc8, 0xe1, 0x87, 0x16, 0xdc, 0x78, +0xe3, 0x44, 0x4a, 0xbb, 0x54, 0x42, 0xda, 0xda, 0xda, 0x02, 0xb3, 0xfc, +0xca, 0x47, 0x0c, 0x5c, 0x9d, 0xf5, 0x08, 0xdd, 0x80, 0x10, 0x9d, 0x35, +0x3e, 0xb1, 0xbc, 0xba, 0xa9, 0xe9, 0x0f, 0x5b, 0x13, 0x3b, 0x21, 0x5b, +0xb6, 0x6c, 0xc9, 0xd7, 0x4f, 0xfc, 0xd9, 0xce, 0xa0, 0xea, 0x19, 0x0b, +0xd0, 0x1d, 0xbe, 0x61, 0x28, 0x57, 0x69, 0x9a, 0x76, 0x5c, 0xf6, 0x50, +0x2a, 0xa4, 0xaf, 0xb5, 0xd5, 0x7f, 0xa8, 0xf8, 0xac, 0x4f, 0x33, 0x7d, +0x13, 0x87, 0x46, 0x47, 0x31, 0x31, 0x61, 0xce, 0x84, 0xb3, 0x8b, 0x8b, +0xa1, 0xaa, 0xaa, 0x89, 0x63, 0x66, 0x0c, 0x1d, 0x3c, 0x68, 0xe2, 0x7c, +0xaa, 0x8a, 0xe2, 0xe2, 0x62, 0xb9, 0x63, 0x42, 0x74, 0x7c, 0x7c, 0xe2, +0xda, 0xa6, 0xa6, 0xa6, 0xc4, 0xf4, 0x47, 0xaa, 0xcc, 0x7e, 0xa4, 0x68, +0xce, 0x6b, 0x00, 0x67, 0x9c, 0x4e, 0xcd, 0x6b, 0xee, 0xc3, 0xa1, 0xd1, +0xd1, 0xc9, 0xdf, 0x7e, 0xbf, 0x1f, 0x9f, 0x7f, 0xf6, 0x89, 0xc5, 0x6e, +0xef, 0xde, 0x7d, 0xb8, 0xf3, 0x2e, 0xf3, 0xd0, 0xbb, 0xf2, 0xca, 0x1a, +0x3c, 0xf7, 0xec, 0xd3, 0x72, 0xc7, 0x8c, 0xfa, 0xc0, 0x19, 0xbe, 0x57, +0x00, 0xdc, 0x3b, 0xfd, 0x91, 0x98, 0x4e, 0xc4, 0x3b, 0x36, 0xdd, 0xe4, +0x65, 0x60, 0x0f, 0x0e, 0x1e, 0x30, 0x89, 0x00, 0x80, 0x85, 0x0b, 0x17, +0xc0, 0xef, 0xf7, 0x5b, 0x6c, 0x7b, 0x7a, 0x7b, 0x2d, 0x5c, 0x65, 0x65, +0x28, 0xa5, 0x7f, 0x06, 0x35, 0xc7, 0x63, 0x91, 0x5b, 0xa7, 0xf3, 0x26, +0x21, 0x91, 0x48, 0x64, 0x2e, 0x13, 0xbd, 0xe5, 0x2c, 0x64, 0x39, 0x7a, +0x25, 0xc1, 0x85, 0x42, 0x8b, 0x6c, 0x6c, 0xb7, 0x5b, 0xb8, 0xaa, 0xaa, +0xca, 0xb4, 0x6d, 0x30, 0xb0, 0x7e, 0xf3, 0xe6, 0xaf, 0xce, 0x9d, 0xca, +0x99, 0x84, 0xa8, 0x0a, 0xd6, 0xc1, 0xe3, 0x3c, 0xd1, 0xbb, 0x7d, 0x87, +0x85, 0xab, 0x0c, 0x59, 0x7b, 0x99, 0x99, 0xb1, 0x63, 0xc7, 0x4e, 0x13, +0x37, 0x3b, 0x3f, 0x1f, 0xf3, 0x4a, 0xe7, 0x39, 0x69, 0xa6, 0x40, 0xd7, +0xd5, 0x17, 0xa7, 0x12, 0x93, 0x42, 0x36, 0x47, 0xa3, 0x8b, 0x01, 0x58, +0x5e, 0x99, 0x5b, 0xec, 0x98, 0x26, 0xc4, 0xe7, 0xf3, 0x21, 0x18, 0xbc, +0xd0, 0x62, 0xb7, 0x67, 0xcf, 0x1e, 0x1c, 0x3d, 0x7a, 0xd4, 0xc4, 0x55, +0x56, 0x86, 0x20, 0x84, 0xb3, 0x05, 0x03, 0x01, 0xab, 0x3a, 0x3a, 0x3a, +0x26, 0x7b, 0x68, 0x52, 0x08, 0x0b, 0x7e, 0x12, 0x1e, 0x97, 0x1d, 0x07, +0x0e, 0xc8, 0xc7, 0x47, 0x4e, 0x4e, 0x8e, 0xc5, 0xb6, 0xa7, 0x47, 0x36, +0x3e, 0xd2, 0xa7, 0xd5, 0x14, 0x90, 0x38, 0x19, 0x33, 0x80, 0x53, 0x42, +0xe2, 0xf1, 0xb6, 0x79, 0xcc, 0x58, 0xee, 0xc6, 0x8b, 0x0c, 0x3d, 0x92, +0x9c, 0x97, 0xa5, 0x95, 0x9d, 0xad, 0x93, 0xf1, 0x61, 0x82, 0xc1, 0x37, +0x44, 0xa3, 0xd1, 0x12, 0xe0, 0x9f, 0x37, 0x62, 0xa8, 0xab, 0x40, 0xd6, +0x2f, 0x98, 0x5b, 0x6c, 0x97, 0x8d, 0x0f, 0xc9, 0x57, 0xc8, 0x30, 0x18, +0x3b, 0x77, 0xfe, 0x60, 0xe2, 0x66, 0xcf, 0x9e, 0x8d, 0x92, 0x92, 0x12, +0x77, 0x0d, 0x12, 0x84, 0x2a, 0x70, 0x1b, 0x70, 0x6a, 0x42, 0xec, 0xec, +0x8c, 0xf4, 0x3b, 0xd9, 0x4f, 0x0c, 0x0c, 0xec, 0xc6, 0x07, 0x1b, 0x36, +0xda, 0x3e, 0xdf, 0xb6, 0xed, 0x7b, 0x8c, 0x8d, 0x8d, 0x99, 0xb8, 0x25, +0x4b, 0xae, 0xb0, 0x7c, 0x7a, 0x13, 0x89, 0x04, 0xb6, 0x6e, 0xfd, 0xc6, +0xc4, 0x15, 0x16, 0x16, 0x48, 0x53, 0xeb, 0x9c, 0x73, 0xe6, 0xa2, 0x79, +0xcd, 0x3d, 0xa9, 0xc2, 0xfa, 0xa9, 0x56, 0x0b, 0x2f, 0xa0, 0xaf, 0xdb, +0xdb, 0xcf, 0x4f, 0xaa, 0xb4, 0x3f, 0x9d, 0x08, 0x00, 0xf8, 0xf6, 0xdb, +0xef, 0xf0, 0xf8, 0x13, 0x4f, 0xa6, 0x37, 0xcc, 0x22, 0xca, 0xca, 0xe6, +0xe3, 0x9d, 0xb7, 0x53, 0xcf, 0x08, 0x6a, 0x92, 0x4b, 0x44, 0xd2, 0x27, +0xc2, 0xff, 0x51, 0x4c, 0x33, 0x06, 0x5d, 0x81, 0x26, 0x98, 0xf9, 0x92, +0xd3, 0x1d, 0x88, 0x57, 0xb0, 0xa0, 0x4b, 0xc4, 0xc9, 0x42, 0xc1, 0xff, +0x1b, 0xc4, 0xa8, 0xa0, 0x58, 0x6c, 0xd3, 0x6e, 0x30, 0x2e, 0xf0, 0xe2, +0xe8, 0xe7, 0x9f, 0x07, 0xb0, 0xfa, 0x9e, 0x66, 0x13, 0x77, 0x79, 0x75, +0x35, 0xd6, 0xae, 0x7d, 0xde, 0x62, 0xdb, 0xf2, 0xc1, 0x06, 0xbc, 0xfb, +0xee, 0x7b, 0x26, 0xee, 0xa1, 0x07, 0xef, 0xc7, 0xf2, 0xe5, 0xd7, 0x7b, +0x88, 0x80, 0x07, 0x04, 0xb2, 0xb0, 0x75, 0x95, 0x2d, 0xfe, 0xaa, 0xaa, +0x6c, 0xe6, 0x0f, 0xef, 0x13, 0xa1, 0x04, 0x54, 0x28, 0xf0, 0x6f, 0xdd, +0x29, 0x63, 0xc8, 0x82, 0x93, 0x4d, 0x6e, 0x27, 0x92, 0x49, 0xf4, 0xfd, +0xd8, 0x67, 0xe2, 0x0a, 0x0b, 0x0b, 0x50, 0x5a, 0xea, 0x72, 0xfe, 0xb0, +0x22, 0xdf, 0xf3, 0x24, 0xa8, 0xeb, 0xba, 0x65, 0x7d, 0x95, 0x97, 0x97, +0x87, 0xb2, 0xb2, 0x32, 0x8b, 0x6d, 0xdf, 0x8f, 0x7d, 0xf8, 0x2b, 0x61, +0xde, 0x13, 0x85, 0x42, 0x21, 0x10, 0x79, 0x2f, 0xc8, 0x08, 0x00, 0xd2, +0xad, 0xa3, 0x53, 0xec, 0xda, 0xb5, 0x0b, 0x63, 0xe3, 0xe3, 0x26, 0x2e, +0x14, 0x5a, 0x04, 0x21, 0xac, 0x7d, 0x24, 0x4f, 0xab, 0xd4, 0xfb, 0x0f, +0x87, 0x38, 0x26, 0x00, 0x1c, 0xf1, 0xe2, 0xa1, 0xbb, 0xdb, 0x59, 0x5a, +0x01, 0xce, 0x53, 0xd0, 0x3d, 0xf8, 0x08, 0xc5, 0x3a, 0x36, 0xb5, 0x03, +0x68, 0x48, 0x65, 0x76, 0xf7, 0xea, 0x35, 0x18, 0x18, 0xd8, 0x9d, 0x85, +0x06, 0x9d, 0xe3, 0xa5, 0xb5, 0x2f, 0xa0, 0xba, 0xfa, 0x32, 0x47, 0xb6, +0x04, 0x7c, 0x25, 0x18, 0xe8, 0x9f, 0xe1, 0x98, 0x66, 0x1c, 0x4c, 0xe8, +0x17, 0x44, 0xd4, 0x75, 0xba, 0x03, 0xf1, 0x0a, 0x32, 0xb8, 0x4b, 0xa8, +0x27, 0x8c, 0xc8, 0xe9, 0x0e, 0xc4, 0x2b, 0x0c, 0x52, 0xa3, 0x6a, 0x4d, +0x43, 0xc3, 0x60, 0x67, 0x2c, 0xd2, 0x8f, 0x14, 0x4b, 0x95, 0x05, 0xc1, +0x20, 0x0a, 0x0a, 0x0a, 0x2c, 0xfc, 0xc0, 0xc0, 0x6e, 0xcb, 0x76, 0x35, +0x18, 0x0c, 0x22, 0x37, 0xf7, 0x0c, 0x8b, 0x6d, 0x77, 0x77, 0x0f, 0xa6, +0xd6, 0xd0, 0x72, 0x72, 0x72, 0x70, 0xd1, 0x45, 0x0b, 0x6d, 0x83, 0x93, +0xb5, 0x27, 0x05, 0xa1, 0x4f, 0xab, 0xd5, 0x7e, 0x39, 0x59, 0xd7, 0x62, +0x6c, 0x04, 0xc1, 0xa6, 0x98, 0x04, 0x3c, 0xf2, 0xc8, 0xc3, 0x52, 0x7e, +0xc5, 0x8a, 0x95, 0x26, 0x21, 0x8a, 0xa2, 0x60, 0xdd, 0xba, 0x97, 0x10, +0xc8, 0xcd, 0x35, 0xd9, 0x0d, 0x0e, 0x1e, 0xc0, 0xaa, 0xdb, 0xef, 0x30, +0x71, 0x8b, 0x17, 0x57, 0xe1, 0xc5, 0x17, 0x9e, 0x73, 0x16, 0x6c, 0x2a, +0x18, 0xd8, 0x00, 0x9c, 0xda, 0x21, 0x32, 0x29, 0xef, 0x83, 0x61, 0xb8, +0xf9, 0xff, 0xf0, 0xf0, 0x08, 0x7e, 0x1d, 0x1a, 0x32, 0x71, 0xe5, 0xe5, +0xe5, 0x16, 0x11, 0x80, 0xbc, 0x44, 0x94, 0xa5, 0xf9, 0x43, 0xd7, 0x99, +0xfe, 0x15, 0xa2, 0x69, 0xda, 0x3e, 0x10, 0x3e, 0x76, 0xe3, 0xa1, 0xbb, +0xa7, 0xc7, 0xc2, 0x55, 0xd9, 0x04, 0x27, 0xad, 0x5f, 0x65, 0x47, 0x48, +0x6b, 0x7d, 0x7d, 0xfd, 0x7e, 0x60, 0x6a, 0x15, 0x05, 0xc6, 0xf3, 0x00, +0x1c, 0x9f, 0xfa, 0x38, 0xdd, 0x9f, 0x03, 0xb0, 0xd4, 0xaf, 0x02, 0x81, +0x80, 0x74, 0x09, 0xe3, 0x12, 0x2c, 0x74, 0x4c, 0xd6, 0xb6, 0x26, 0x85, +0x68, 0xda, 0x55, 0xbd, 0x20, 0xb4, 0x38, 0xf5, 0x32, 0x3d, 0x5d, 0x14, +0x45, 0x91, 0x0e, 0xde, 0xfd, 0xfb, 0x07, 0x2d, 0x25, 0x22, 0xbb, 0x25, +0x8c, 0x2b, 0x10, 0xde, 0x5b, 0x1a, 0x0e, 0x4f, 0xf6, 0xa6, 0xc9, 0x9b, +0x2f, 0xa1, 0x3f, 0x06, 0xe0, 0x70, 0x3a, 0x1f, 0xc3, 0xc3, 0x23, 0x18, +0x1a, 0x32, 0x57, 0xd1, 0x2b, 0x2a, 0xca, 0x91, 0x2b, 0x1d, 0x1f, 0xd6, +0xb4, 0xb2, 0x2b, 0xa1, 0xba, 0xc0, 0x61, 0x21, 0x26, 0x9e, 0x98, 0x4a, +0x98, 0x84, 0x2c, 0x69, 0x6c, 0x1c, 0x06, 0xd1, 0x9a, 0x74, 0x5e, 0x64, +0xe3, 0xc3, 0x2e, 0xad, 0x64, 0x03, 0xdd, 0xeb, 0xfa, 0x8a, 0x98, 0xef, +0x5f, 0xba, 0xb4, 0x69, 0x64, 0x2a, 0x67, 0x79, 0xbf, 0xb5, 0xb5, 0xf5, +0xad, 0x04, 0x7e, 0x33, 0x95, 0x23, 0x59, 0x2f, 0xdb, 0xd5, 0x77, 0xa7, +0xd7, 0x82, 0x03, 0x81, 0x00, 0xca, 0xe6, 0xcf, 0x77, 0x18, 0xb2, 0x15, +0x0c, 0xac, 0x5f, 0x56, 0xd7, 0x60, 0xa9, 0x49, 0x49, 0x0f, 0x7a, 0xba, +0xba, 0xba, 0x7c, 0xc7, 0x8f, 0x1d, 0xf9, 0x14, 0xc0, 0x35, 0x32, 0x67, +0x4e, 0x0f, 0x72, 0x0c, 0x83, 0x71, 0xf0, 0x37, 0x73, 0x0a, 0xfa, 0x7d, +0x3e, 0x14, 0x15, 0x15, 0xb9, 0x16, 0x00, 0x00, 0x04, 0x8a, 0x14, 0x8d, +0x8c, 0x5e, 0x2b, 0x3b, 0x4f, 0xb4, 0x3d, 0x7a, 0x8b, 0xc5, 0x62, 0x79, +0x04, 0xbd, 0x1d, 0xc0, 0xe5, 0x19, 0xb5, 0x9a, 0x7d, 0x6c, 0x65, 0x28, +0x8d, 0x76, 0x47, 0x6f, 0xb6, 0x9f, 0x0e, 0x4d, 0xd3, 0x8e, 0x27, 0x26, +0xf4, 0x06, 0x00, 0x5f, 0xce, 0x58, 0x68, 0x0e, 0x41, 0xa0, 0x88, 0xea, +0x9b, 0x75, 0xb5, 0x9d, 0x08, 0x20, 0x85, 0x10, 0x00, 0x68, 0x6c, 0x6c, +0x1c, 0x2b, 0x1e, 0xf9, 0xfd, 0xba, 0x74, 0x63, 0x66, 0x26, 0xc1, 0xc0, +0xfa, 0x40, 0x7e, 0x41, 0x53, 0x4d, 0x4d, 0xcd, 0xb1, 0x54, 0x76, 0x8e, +0x2f, 0x0c, 0xc4, 0x63, 0x91, 0x9b, 0x19, 0x78, 0x03, 0xc0, 0x99, 0xd9, +0x08, 0x30, 0x2d, 0x08, 0xbf, 0x03, 0xd4, 0x5c, 0x5b, 0x5b, 0xdf, 0xea, +0xc4, 0xdc, 0xf1, 0xac, 0xb4, 0x4c, 0x0b, 0x7f, 0xe8, 0x4f, 0x24, 0xcb, +0x40, 0x78, 0xd5, 0xed, 0xba, 0xcc, 0x25, 0x18, 0xcc, 0x2d, 0xbe, 0x84, +0x1e, 0x74, 0x2a, 0x02, 0xc8, 0xf0, 0x52, 0x4d, 0x3c, 0xbe, 0xe9, 0x62, +0xd6, 0xf1, 0xd8, 0x4c, 0x5c, 0xaa, 0x31, 0x58, 0x3c, 0x55, 0x57, 0x57, +0xe7, 0x7a, 0xb3, 0xe7, 0xe9, 0x9a, 0xd3, 0xc9, 0x3b, 0x5a, 0xc6, 0x4a, +0x02, 0xad, 0x00, 0x10, 0xcc, 0xc8, 0x09, 0xa1, 0x8f, 0x98, 0x36, 0x2a, +0x49, 0xa3, 0xc5, 0xcb, 0xdd, 0x2d, 0x4f, 0x42, 0xa6, 0x22, 0x1e, 0x6f, +0x3b, 0x0f, 0xba, 0xa8, 0x63, 0x88, 0x4b, 0x21, 0x8c, 0x0a, 0x80, 0x4a, +0x01, 0x14, 0xc1, 0x74, 0xf1, 0x0c, 0x87, 0x88, 0xb1, 0x97, 0x09, 0xfd, +0x64, 0x70, 0x97, 0x41, 0x6a, 0x54, 0xd3, 0xb4, 0x5f, 0xb2, 0xd1, 0xfe, +0xdf, 0x10, 0xf6, 0x83, 0xdb, 0x46, 0x42, 0xfd, 0xc8, 0x00, 0x00, 0x00, +0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, +}; diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 6581934..4617f3d 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -116,6 +116,12 @@ void BoardCanvas::ApplyPreferences() { void BoardCanvas::SetupBoard(std::string board, bool is_black_turn, std::map captures, std::string white_player, std::string black_player) { + gs.board = board; + gs.is_black_turn = is_black_turn; + gs.captures = captures; + gs.white=white_player; + gs.black=black_player; + this->board = board; this->is_black_turn = is_black_turn; this->captures = captures; @@ -241,6 +247,8 @@ void BoardCanvas::DrawBoard(wxDC &dc) { } if (piece != ' ') { dc.DrawBitmap(*t->Get(piece), px, py, false); + if(piece == 'k' || piece == 'K') + dc.DrawBitmap(*t->Get('#'), x+square_width/2+centrer_offset, y+centrer_offset, false); } } } diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp index 9a00262..5d7c76d 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.hpp +++ b/src/game_tab/left_panel/board/BoardCanvas.hpp @@ -58,6 +58,15 @@ typedef struct AnimState { 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; +} GameState; + class BoardCanvas : public wxPanel { // *t is theme for board+pieces and // *t_captures is theme for captured pieces (scale down version of t) @@ -78,6 +87,7 @@ class BoardCanvas : public wxPanel { // Current animation state AnimState adata; + GameState gs; public: BoardCanvas(wxFrame *parent); diff --git a/src/game_tab/left_panel/board/Theme.cpp b/src/game_tab/left_panel/board/Theme.cpp index 6c662dc..f72dfab 100644 --- a/src/game_tab/left_panel/board/Theme.cpp +++ b/src/game_tab/left_panel/board/Theme.cpp @@ -11,6 +11,8 @@ Theme::Theme() : square_radius(10) { config->Read("board/theme/squares/path", "default").ToStdString(); wxFileName square_file(square); CONFIG_CLOSE(config); + // Mat + skin['#']=LoadPNG("mat").ConvertToImage(); // Piece if (piece == "default" || !piece_file.FileExists()) { wxLogDebug("Loading piece skin from binres"); @@ -95,12 +97,18 @@ wxBitmap *Theme::Get(char c) { return (skin_scaled[c]); } void Theme::ResizePieces(std::uint32_t width) { for (std::pair c : skin) { - if (c.first != 's' && c.first != 'S') { + if (c.first != 's' && c.first != 'S' && c.first != '#') { if (skin_scaled.count(c.first)) delete skin_scaled[c.first]; skin_scaled[c.first] = new wxBitmap(c.second.Scale(width, width, wxIMAGE_QUALITY_HIGH)); } + else if(c.first == '#'){ + if (skin_scaled.count(c.first)) + delete skin_scaled[c.first]; + skin_scaled[c.first] = + new wxBitmap(c.second.Scale(width*MAT_SIZE_FACTOR, width*MAT_SIZE_FACTOR, wxIMAGE_QUALITY_HIGH)); + } } } diff --git a/src/game_tab/left_panel/board/Theme.hpp b/src/game_tab/left_panel/board/Theme.hpp index b896d09..c3acf10 100644 --- a/src/game_tab/left_panel/board/Theme.hpp +++ b/src/game_tab/left_panel/board/Theme.hpp @@ -8,6 +8,7 @@ #define ELT_DIM 200 #define DEFAULT_SIZE 80 #define PIECE_SIZE_FACTOR 0.8 // Should be between 0 and 1 +#define MAT_SIZE_FACTOR 0.4 #define DEFAULT_PIECE_THEME "assets/pieces/cburnett.png" #define DEFAULT_SQUARE_THEME "assets/boards/chesscom_8bits.png" -- cgit v1.2.3 From 56252f2b6c42fe369a4b0c77287469c49c381943 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 2 Jan 2023 11:36:13 +0100 Subject: Improve UI --- src/game_tab/Game.cpp | 8 +++ src/game_tab/Game.hpp | 1 + src/game_tab/left_panel/GameTabLeftPanel.cpp | 15 +++-- src/game_tab/left_panel/board/BoardCanvas.cpp | 85 ++++++++++++++------------- src/game_tab/left_panel/board/BoardCanvas.hpp | 8 +-- 5 files changed, 66 insertions(+), 51 deletions(-) diff --git a/src/game_tab/Game.cpp b/src/game_tab/Game.cpp index 8ab67cb..53be08f 100644 --- a/src/game_tab/Game.cpp +++ b/src/game_tab/Game.cpp @@ -92,6 +92,14 @@ void Game::SetMoveAsMainline(HalfMove *m) { } } +bool Game::IsCheckmate(bool forBlack){ + arbiter.Setup(GetFen()); + if(forBlack){ + return arbiter.IsBlackTurn() && arbiter.IsCheckMate(); + } + return !arbiter.IsBlackTurn() && arbiter.IsCheckMate(); +} + bool Game::Play(std::string move) { wxLogDebug("Playing move %s", move); std::string fen = GetFen(); diff --git a/src/game_tab/Game.hpp b/src/game_tab/Game.hpp index bc00c5a..0590027 100644 --- a/src/game_tab/Game.hpp +++ b/src/game_tab/Game.hpp @@ -31,6 +31,7 @@ public: std::string GetResult(); bool Play(std::string move); bool IsBlackToPlay(); + bool IsCheckmate(bool forBlack); void Previous(); void Next(); void DeleteMove(HalfMove *m); diff --git a/src/game_tab/left_panel/GameTabLeftPanel.cpp b/src/game_tab/left_panel/GameTabLeftPanel.cpp index 4aaddb4..25ded2c 100644 --- a/src/game_tab/left_panel/GameTabLeftPanel.cpp +++ b/src/game_tab/left_panel/GameTabLeftPanel.cpp @@ -99,14 +99,19 @@ void GameTabLeftPanel::Notify(bool skip_animation) { } // Update board canvas: + GameState gs; + gs.board=chessarbiter::FENParser::Parse(fen).board; + gs.is_black_turn=game->IsBlackToPlay(); + gs.captures=captures; + gs.white=game->GetTag("White"); + gs.black=game->GetTag("Black"); + gs.mat_black=game->IsCheckmate(true); + gs.mat_white=game->IsCheckmate(false); if(skip_animation || !animate){ - board_canvas->SetupBoard(chessarbiter::FENParser::Parse(fen).board, - game->IsBlackToPlay(), captures, - game->GetTag("White"),game->GetTag("Black")); + board_canvas->SetupBoard(gs); } else{ - board_canvas->Animate(chessarbiter::FENParser::Parse(fen).board, - game->IsBlackToPlay(), captures,src,dst,repeat); + board_canvas->Animate(gs, src,dst,repeat); } // Update last move last_move=m; diff --git a/src/game_tab/left_panel/board/BoardCanvas.cpp b/src/game_tab/left_panel/board/BoardCanvas.cpp index 4617f3d..f6846f1 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.cpp +++ b/src/game_tab/left_panel/board/BoardCanvas.cpp @@ -3,29 +3,36 @@ wxDEFINE_EVENT(PLAY_MOVE_EVENT, wxCommandEvent); BoardCanvas::BoardCanvas(wxFrame *parent) - : wxPanel(parent), black_side(false), is_black_turn(true), frozen(false), + : wxPanel(parent), black_side(false), frozen(false), lock_square_size(false), t(new Theme()), t_captures(new Theme()) { - board = "rnbqkbnrpppppppp PPPPPPPPRNBQKBNR"; is_dragging = false; valid_drag = false; + // Init animation data + adata.duration=200; + adata.duration_fast=80; + adata.fps=30; + adata.buffer=new wxBitmap(500,500,32); adata.reuseBuffer=false; adata.buffer=nullptr; - t_captures->ResizePieces(t->GetPiecesSizes() * CAPTURE_FACTOR); + // Init game state + gs.is_black_turn=false; + gs.board = "rnbqkbnrpppppppp PPPPPPPPRNBQKBNR"; + gs.mat_black=false; + gs.mat_white=false; + // Init clocks SetClockTime(-1, -1, -1, false); SetClockTime(-1, -1, -1, true); + // Init capture pieces + t_captures->ResizePieces(t->GetPiecesSizes() * CAPTURE_FACTOR); + // Load preferences ApplyPreferences(); // The following should be called when using an EVT_PAINT handler SetBackgroundStyle(wxBG_STYLE_PAINT); - adata.duration=200; - adata.duration_fast=80; - adata.fps=30; - adata.buffer=new wxBitmap(500,500,32); // Let GameTableLeftPanel process keyboard events: 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();}); Bind(wxEVT_PAINT, &BoardCanvas::OnPaint, this); Bind(wxEVT_SIZE, &BoardCanvas::OnResize, this); - // Mouse events: Bind(wxEVT_MOTION, &BoardCanvas::MouseEvent, this); Bind(wxEVT_LEFT_DOWN, &BoardCanvas::MouseEvent, this); @@ -113,30 +120,26 @@ void BoardCanvas::ApplyPreferences() { Refresh(); } -void BoardCanvas::SetupBoard(std::string board, bool is_black_turn, - std::map captures, - std::string white_player, std::string black_player) { - gs.board = board; - gs.is_black_turn = is_black_turn; - gs.captures = captures; - gs.white=white_player; - gs.black=black_player; - - this->board = board; - this->is_black_turn = is_black_turn; - this->captures = captures; - this->white_player=white_player; - this->black_player=black_player; +void BoardCanvas::SetupBoard(const GameState &new_gs) { + gs.board = new_gs.board; + gs.is_black_turn = new_gs.is_black_turn; + gs.captures = new_gs.captures; + gs.white=new_gs.white; + gs.black=new_gs.black; + gs.mat_white=new_gs.mat_white; + gs.mat_black=new_gs.mat_black; + gs.black_time=new_gs.black_time; + gs.white_time=new_gs.white_time; Refresh(); } -void BoardCanvas::Animate(const std::string &board, bool is_black_turn, std::map captures, std::string src, std::string dst,bool faster){ +void BoardCanvas::Animate(const GameState &new_gs, std::string src, std::string dst, bool faster){ std::uint8_t pfile = src[0]-'a'; std::uint8_t prank = src[1]-'1'; - adata.piece_moved = this->board[pfile + 8 * (7-prank)]; // Piece to move + adata.piece_moved = gs.board[pfile + 8 * (7-prank)]; // Piece to move // Now remove the piece that will be moved - this->board[pfile + 8 * (7-prank)]=' '; + gs.board[pfile + 8 * (7-prank)]=' '; wxMemoryDC memDC(*adata.buffer); DrawBoard(memDC); @@ -183,7 +186,7 @@ void BoardCanvas::Animate(const std::string &board, bool is_black_turn, std::map } adata.duration=faster ? duration_backup : duration_backup; adata.reuseBuffer=false; - SetupBoard(board, is_black_turn, captures,white_player,black_player); + SetupBoard(new_gs); } void BoardCanvas::DrawBoard(wxDC &dc) { @@ -236,7 +239,7 @@ void BoardCanvas::DrawBoard(wxDC &dc) { } std::uint32_t px = x + centrer_offset; std::uint32_t py = y + centrer_offset; - char piece = board[(7 - pfile) + 8 * prank]; + char piece = gs.board[(7 - pfile) + 8 * prank]; if (is_dragging && (7 - pfile) == active_square.x && (7 - prank) == active_square.y) { dp = piece; @@ -247,7 +250,7 @@ void BoardCanvas::DrawBoard(wxDC &dc) { } if (piece != ' ') { dc.DrawBitmap(*t->Get(piece), px, py, false); - if(piece == 'k' || piece == 'K') + if((piece == 'k' && gs.mat_black) || (piece == 'K' && gs.mat_white)) dc.DrawBitmap(*t->Get('#'), x+square_width/2+centrer_offset, y+centrer_offset, false); } } @@ -257,7 +260,7 @@ void BoardCanvas::DrawBoard(wxDC &dc) { dc.SetPen(wxPen(*wxBLACK, 3)); std::uint32_t badgeY = boardY; std::uint32_t badgeWidth = square_width / 2; - if (is_black_turn) { + if (gs.is_black_turn) { dc.SetBrush(*wxBLACK_BRUSH); if (black_side) { badgeY = boardY + (8 * square_width) - badgeWidth; @@ -286,15 +289,15 @@ void BoardCanvas::DrawBoard(wxDC &dc) { offsetYPlayerName = offsetY+captures_size; } for (char p : {'P', 'N', 'B', 'R', 'Q'}) { - if (captures.find(p) != captures.end()) { - for (std::uint8_t i = 0; i < captures[p]; i++) { + if (gs.captures.find(p) != gs.captures.end()) { + for (std::uint8_t i = 0; i < gs.captures[p]; i++) { dc.DrawBitmap(*t_captures->Get(p), boardX + offsetX, boardY + offsetY); offsetX += captures_size / 2; } offsetX += captures_size / 2; } } - dc.DrawText(wxString(black_player),boardX,boardY + offsetYPlayerName); + dc.DrawText(wxString(gs.black),boardX,boardY + offsetYPlayerName); // Black (white's captures): offsetX = 0; if (black_side) { @@ -305,15 +308,15 @@ void BoardCanvas::DrawBoard(wxDC &dc) { offsetYPlayerName = offsetY+captures_size; } for (char p : {'p', 'n', 'b', 'r', 'q'}) { - if (captures.find(p) != captures.end()) { - for (std::uint8_t i = 0; i < captures[p]; i++) { + if (gs.captures.find(p) != gs.captures.end()) { + for (std::uint8_t i = 0; i < gs.captures[p]; i++) { dc.DrawBitmap(*t_captures->Get(p), boardX + offsetX, boardY + offsetY); offsetX += captures_size / 2; } offsetX += captures_size / 2; } } - dc.DrawText(wxString(white_player),boardX,boardY + offsetYPlayerName); + dc.DrawText(wxString(gs.white),boardX,boardY + offsetYPlayerName); // Draw dragging piece if (DrawDraggingPiece) { @@ -327,9 +330,9 @@ void BoardCanvas::DrawBoard(wxDC &dc) { } // Draw Clocks - if (std::get<0>(black_time) >= 0) { + if (std::get<0>(gs.black_time) >= 0) { wxFont font = dc.GetFont(); - ClockTime clock = black_side ? white_time : black_time; + ClockTime clock = black_side ? gs.white_time : gs.black_time; wxString time = wxString::Format("%ds", std::get<1>(clock), std::get<2>(clock)); if (std::get<0>(clock) > 0) { @@ -342,7 +345,7 @@ void BoardCanvas::DrawBoard(wxDC &dc) { dc.GetTextExtent(time, &width, &height); dc.DrawText(time, wxPoint(boardX + square_width * 8 - width, boardY - height - numbers_size.y*2)); - clock = black_side ? black_time : white_time; + clock = black_side ? gs.black_time : gs.white_time; time = wxString::Format("%ds", std::get<1>(clock), std::get<2>(clock)); if (std::get<0>(clock) > 0) { time = wxString::Format("%d:%d", std::get<0>(clock), std::get<1>(clock)); @@ -394,7 +397,7 @@ void BoardCanvas::MouseEvent(wxMouseEvent &event) { if (IsCurrentSquareValid) { active_square.x = file; active_square.y = rank; - if (board[(7 - rank) * 8 + file] != ' ') { + if (gs.board[(7 - rank) * 8 + file] != ' ') { wxLogDebug("Drag start on square (%d,%d)", file, rank); valid_drag = true; } @@ -423,8 +426,8 @@ void BoardCanvas::Swap() { void BoardCanvas::SetClockTime(short hours, short min, short sec, bool IsBlack) { if (IsBlack) { - black_time = std::make_tuple(hours, min, sec); + gs.black_time = std::make_tuple(hours, min, sec); } else { - white_time = std::make_tuple(hours, min, sec); + gs.white_time = std::make_tuple(hours, min, sec); } } diff --git a/src/game_tab/left_panel/board/BoardCanvas.hpp b/src/game_tab/left_panel/board/BoardCanvas.hpp index 5d7c76d..7b6ccf7 100644 --- a/src/game_tab/left_panel/board/BoardCanvas.hpp +++ b/src/game_tab/left_panel/board/BoardCanvas.hpp @@ -65,6 +65,7 @@ typedef struct GameState { bool is_black_turn; bool mat_black; bool mat_white; + ClockTime black_time, white_time; } GameState; class BoardCanvas : public wxPanel { @@ -82,7 +83,6 @@ class BoardCanvas : public wxPanel { wxSize canvas_size; wxPoint active_square; std::map captures; - ClockTime black_time, white_time; bool frozen,lock_square_size; // Current animation state @@ -100,9 +100,7 @@ public: void Zoom(std::int32_t zoom); void Swap(); void OnResize(wxSizeEvent &e); - void SetupBoard(std::string board, bool is_black_turn, - std::map captures, - std::string white_player, std::string black_player); - void Animate(const std::string &board, bool is_black_turn, std::map captures, std::string src, std::string dst,bool faster); + void SetupBoard(const GameState &new_gs); + void Animate(const GameState &new_gs, std::string src, std::string dst,bool faster); void SetClockTime(short hours, short min, short sec, bool IsBlack); }; -- cgit v1.2.3 From d1c1031332f47cf076d5da0a8a161dbb8210a0b6 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 2 Jan 2023 11:44:11 +0100 Subject: Debug --- src/game_tab/HalfMove.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/game_tab/HalfMove.cpp b/src/game_tab/HalfMove.cpp index ae63527..32924e1 100644 --- a/src/game_tab/HalfMove.cpp +++ b/src/game_tab/HalfMove.cpp @@ -193,6 +193,8 @@ bool HalfMove::HasParent(HalfMove*m){ } bool HalfMove::HasChild(HalfMove*m){ + if(m==nullptr) + return false; if(mainline==m){ return true; } -- cgit v1.2.3 From 042f6ca17012414d13235d3e04ea9012ff49f79c Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 2 Jan 2023 11:58:40 +0100 Subject: Debug comments --- src/game_tab/right_panel/GameTabRightPanel.cpp | 7 ++++++- src/game_tab/right_panel/GameTabRightPanel.hpp | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/game_tab/right_panel/GameTabRightPanel.cpp b/src/game_tab/right_panel/GameTabRightPanel.cpp index 3a46f59..dd0ebca 100644 --- a/src/game_tab/right_panel/GameTabRightPanel.cpp +++ b/src/game_tab/right_panel/GameTabRightPanel.cpp @@ -89,7 +89,12 @@ void GameTabRightPanel::OnCommentChange(wxCommandEvent &event) { wxLogDebug("GameTabRightPanel: comment input change"); HalfMove *m = game->GetCurrentMove(); if (m != nullptr) { - m->comment=event.GetString().ToStdString(); + m->comment=event.GetString().Trim().ToStdString(); + // Remove newlines: + for(char &c:m->comment){ + if(c=='\n') + c=' '; + } } editor_canvas->Refresh(); } diff --git a/src/game_tab/right_panel/GameTabRightPanel.hpp b/src/game_tab/right_panel/GameTabRightPanel.hpp index aa28f17..6f3aaaa 100644 --- a/src/game_tab/right_panel/GameTabRightPanel.hpp +++ b/src/game_tab/right_panel/GameTabRightPanel.hpp @@ -1,3 +1,5 @@ +#include + #include "../Game.hpp" #include "LiveEngineDialog.hpp" #include "editor/EditorCanvas.hpp" -- cgit v1.2.3