From 0a474c16a0071cc354c538d2a5f5b62ebb829205 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Mon, 18 May 2026 17:57:02 +0300 Subject: [PATCH] Improved brush tool performance --- src/DrawingProgram/Tools/BrushTool.cpp | 18 +++++++++++++----- src/DrawingProgram/Tools/BrushTool.hpp | 1 + src/DrawingProgram/Tools/EditTool.cpp | 4 +--- .../Tools/EditTools/BrushEditTool.cpp | 11 +++++++---- .../Tools/EditTools/BrushEditTool.hpp | 3 ++- .../EditTools/DrawingProgramEditToolBase.hpp | 2 +- .../Tools/EditTools/EllipseDrawEditTool.cpp | 3 +-- .../Tools/EditTools/EllipseDrawEditTool.hpp | 3 +-- .../Tools/EditTools/ImageEditTool.cpp | 3 +-- .../Tools/EditTools/ImageEditTool.hpp | 2 +- .../Tools/EditTools/RectDrawEditTool.cpp | 3 +-- .../Tools/EditTools/RectDrawEditTool.hpp | 2 +- .../Tools/EditTools/TextBoxEditTool.cpp | 3 +-- .../Tools/EditTools/TextBoxEditTool.hpp | 2 +- 14 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/DrawingProgram/Tools/BrushTool.cpp b/src/DrawingProgram/Tools/BrushTool.cpp index f8aa11a..e82017f 100644 --- a/src/DrawingProgram/Tools/BrushTool.cpp +++ b/src/DrawingProgram/Tools/BrushTool.cpp @@ -45,8 +45,10 @@ void BrushTool::switch_tool(DrawingProgramToolType newTool) { } void BrushTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { - if(objInfoBeingEdited == erasedComp) + if(objInfoBeingEdited == erasedComp) { objInfoBeingEdited = nullptr; + commitUpdate = false; + } } void BrushTool::smooth_out_points(float smoothFactor) { @@ -171,8 +173,7 @@ void BrushTool::input_mouse_motion_callback(const InputManager::MouseMotionCallb } smooth_out_points(drawP.world.main.conf.tabletOptions.brushPressureSmoothingFactor); - containerPtr->send_comp_update(drawP, false); - containerPtr->commit_update(drawP); + commitUpdate = true; } } @@ -190,8 +191,7 @@ void BrushTool::input_pen_axis_callback(const InputManager::PenAxisCallbackArgs& float width = toolConfig.get_relative_width_stroke_size(drawP, containerPtr->coords.inverseScale).first.value() * penWidth; brushPoints.back().width = std::max(brushPoints.back().width, width); smooth_out_points(drawP.world.main.conf.tabletOptions.brushPressureSmoothingFactor); - containerPtr->send_comp_update(drawP, false); - containerPtr->commit_update(drawP); + commitUpdate = true; } } } @@ -222,6 +222,13 @@ bool BrushTool::extensive_point_checking_back(const BrushStrokeCanvasComponent& void BrushTool::tool_update() { if(!drawP.world.main.g.gui.cursor_obstructed()) drawP.world.main.input.hideCursor = true; + + if(commitUpdate && objInfoBeingEdited) { + NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; + containerPtr->send_comp_update(drawP, false); + containerPtr->commit_update(drawP); + commitUpdate = false; + } } void BrushTool::commit_stroke() { @@ -237,6 +244,7 @@ void BrushTool::commit_stroke() { components->erase(components, containerPtr->objInfo); } objInfoBeingEdited = nullptr; + commitUpdate = false; } } diff --git a/src/DrawingProgram/Tools/BrushTool.hpp b/src/DrawingProgram/Tools/BrushTool.hpp index b0ebd17..f875bc5 100644 --- a/src/DrawingProgram/Tools/BrushTool.hpp +++ b/src/DrawingProgram/Tools/BrushTool.hpp @@ -54,6 +54,7 @@ class BrushTool : public DrawingProgramToolBase { float penWidth = 1.0f; bool addedTemporaryPoint = false; + bool commitUpdate = false; CanvasComponentContainer::ObjInfo* objInfoBeingEdited = nullptr; diff --git a/src/DrawingProgram/Tools/EditTool.cpp b/src/DrawingProgram/Tools/EditTool.cpp index d6c9ba3..9b1dca7 100644 --- a/src/DrawingProgram/Tools/EditTool.cpp +++ b/src/DrawingProgram/Tools/EditTool.cpp @@ -318,10 +318,8 @@ bool EditTool::is_editable(CanvasComponentContainer::ObjInfo* comp) { void EditTool::tool_update() { if(objInfoBeingEdited) { + compEditTool->edit_update(); objInfoBeingEdited->obj->send_comp_update(drawP, false); - bool shouldNotReset = compEditTool->edit_update(); - if(!shouldNotReset) - switch_tool(get_type()); } } diff --git a/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp b/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp index 9481d0a..507b626 100644 --- a/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp @@ -36,7 +36,7 @@ void BrushEditTool::edit_gui(Toolbar& t) { auto& a = static_cast(comp->obj->get_comp()); auto& gui = drawP.world.main.g.gui; - auto commit_update_func = [&] { comp->obj->commit_update(drawP); }; + auto commit_update_func = [&] { commitUpdate = true; }; gui.new_id("edit tool brush", [&] { text_label_centered(gui, "Edit Brush Stroke"); @@ -53,7 +53,7 @@ void BrushEditTool::gui_phone_toolbox(PhoneDrawingProgramScreen& t) { auto& a = static_cast(comp->obj->get_comp()); auto& gui = drawP.world.main.g.gui; - auto commit_update_func = [&] { comp->obj->commit_update(drawP); }; + auto commit_update_func = [&] { commitUpdate = true; }; gui.new_id("edit tool brush", [&] { left_to_right_line_layout(gui, [&]() { @@ -78,6 +78,9 @@ void BrushEditTool::edit_start(EditTool& editTool, std::any& prevData) { void BrushEditTool::commit_edit_updates(std::any& prevData) { } -bool BrushEditTool::edit_update() { - return true; +void BrushEditTool::edit_update() { + if(commitUpdate) { + comp->obj->commit_update(drawP); + commitUpdate = false; + } } diff --git a/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp b/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp index 41706f1..3c817da 100644 --- a/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp +++ b/src/DrawingProgram/Tools/EditTools/BrushEditTool.hpp @@ -28,10 +28,11 @@ class BrushEditTool : public DrawingProgramEditToolBase { BrushEditTool(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp); virtual void edit_start(EditTool& editTool, std::any& prevData) override; virtual void commit_edit_updates(std::any& prevData) override; - virtual bool edit_update() override; + virtual void edit_update() override; virtual void edit_gui(Toolbar& t) override; virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override; virtual Vector4f* color_picker_color(Vector4f* oldColor) override; private: + bool commitUpdate = false; Vector4f oldColor; }; diff --git a/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp b/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp index 0066152..c52ae65 100644 --- a/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp +++ b/src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.hpp @@ -30,7 +30,7 @@ class DrawingProgramEditToolBase { DrawingProgramEditToolBase(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp); virtual void edit_start(EditTool& editTool, std::any& prevData) = 0; virtual void commit_edit_updates(std::any& prevData) = 0; - virtual bool edit_update() = 0; + virtual void edit_update() = 0; virtual void edit_gui(Toolbar& t) = 0; virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) = 0; virtual void right_click_popup_gui(Toolbar& t, Vector2f popupPos); diff --git a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp index a91eedd..d4d7b16 100644 --- a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp @@ -122,6 +122,5 @@ void EllipseDrawEditTool::edit_start(EditTool& editTool, std::any& prevData) { void EllipseDrawEditTool::commit_edit_updates(std::any& prevData) { } -bool EllipseDrawEditTool::edit_update() { - return true; +void EllipseDrawEditTool::edit_update() { } diff --git a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.hpp b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.hpp index a0be16d..0d17644 100644 --- a/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.hpp +++ b/src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.hpp @@ -31,11 +31,10 @@ class EllipseDrawEditTool : public DrawingProgramEditToolBase { virtual void edit_start(EditTool& editTool, std::any& prevData) override; virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override; virtual void commit_edit_updates(std::any& prevData) override; - virtual bool edit_update() override; + virtual void edit_update() override; virtual void edit_gui(Toolbar& t) override; virtual Vector4f* color_picker_color(Vector4f* oldColor) override; private: void commit(); - std::optional oldData; }; diff --git a/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp b/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp index 0daf950..d838611 100644 --- a/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp @@ -59,8 +59,7 @@ void ImageEditTool::commit_edit_updates(std::any& prevData) { comp->obj->commit_update(drawP); } -bool ImageEditTool::edit_update() { - return true; +void ImageEditTool::edit_update() { } void ImageEditTool::edit_gui(Toolbar& t) { diff --git a/src/DrawingProgram/Tools/EditTools/ImageEditTool.hpp b/src/DrawingProgram/Tools/EditTools/ImageEditTool.hpp index f3dcd8b..9dce97f 100644 --- a/src/DrawingProgram/Tools/EditTools/ImageEditTool.hpp +++ b/src/DrawingProgram/Tools/EditTools/ImageEditTool.hpp @@ -27,7 +27,7 @@ class ImageEditTool : public DrawingProgramEditToolBase { ImageEditTool(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp); virtual void edit_start(EditTool& editTool, std::any& prevData) override; virtual void commit_edit_updates(std::any& prevData) override; - virtual bool edit_update() override; + virtual void edit_update() override; virtual void edit_gui(Toolbar& t) override; virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override; }; diff --git a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp index 25576e0..0f16434 100644 --- a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp @@ -120,6 +120,5 @@ void RectDrawEditTool::edit_start(EditTool& editTool, std::any& prevData) { void RectDrawEditTool::commit_edit_updates(std::any& prevData) { } -bool RectDrawEditTool::edit_update() { - return true; +void RectDrawEditTool::edit_update() { } diff --git a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.hpp b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.hpp index bafeef4..3944e3f 100644 --- a/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.hpp +++ b/src/DrawingProgram/Tools/EditTools/RectDrawEditTool.hpp @@ -29,7 +29,7 @@ class RectDrawEditTool : public DrawingProgramEditToolBase { RectDrawEditTool(DrawingProgram& initDrawP, CanvasComponentContainer::ObjInfo* initComp); virtual void edit_start(EditTool& editTool, std::any& prevData) override; virtual void commit_edit_updates(std::any& prevData) override; - virtual bool edit_update() override; + virtual void edit_update() override; virtual void edit_gui(Toolbar& t) override; virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override; virtual Vector4f* color_picker_color(Vector4f* oldColor) override; diff --git a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp index 8774c75..8d8e47a 100644 --- a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp +++ b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp @@ -796,6 +796,5 @@ void TextBoxEditTool::edit_start(EditTool& editTool, std::any& prevData) { CustomEvents::emit_event(CustomEvents::RefreshTextBoxInputEvent{}); } -bool TextBoxEditTool::edit_update() { - return true; +void TextBoxEditTool::edit_update() { } diff --git a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp index a63f0ee..c638a7c 100644 --- a/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp +++ b/src/DrawingProgram/Tools/EditTools/TextBoxEditTool.hpp @@ -31,7 +31,7 @@ class TextBoxEditTool : public DrawingProgramEditToolBase { virtual void edit_start(EditTool& editTool, std::any& prevData) override; virtual void commit_edit_updates(std::any& prevData) override; - virtual bool edit_update() override; + virtual void edit_update() override; virtual void edit_gui(Toolbar& t) override; virtual void gui_phone_toolbox(PhoneDrawingProgramScreen& t) override; virtual void right_click_popup_gui(Toolbar& t, Vector2f popupPos) override;