From 90374da228fb07a1ede2e0b10db2293e3f25d979 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sat, 2 Aug 2025 20:10:33 +0300 Subject: [PATCH] Restructure how tool data is stored --- CMakeLists.txt | 7 +- src/DrawingProgram/BrushTool.cpp | 11 +- src/DrawingProgram/BrushTool.hpp | 16 +- src/DrawingProgram/DrawingProgram.cpp | 221 ++++-------------- src/DrawingProgram/DrawingProgram.hpp | 47 +--- .../DrawingProgramEditToolBase.cpp | 7 + .../DrawingProgramEditToolBase.hpp | 19 ++ .../DrawingProgramSelection.cpp | 6 +- src/DrawingProgram/DrawingProgramToolBase.cpp | 44 ++++ src/DrawingProgram/DrawingProgramToolBase.hpp | 33 +++ src/DrawingProgram/EditTool.cpp | 97 ++------ src/DrawingProgram/EditTool.hpp | 22 +- src/DrawingProgram/EllipseDrawEditTool.cpp | 82 +++++++ src/DrawingProgram/EllipseDrawEditTool.hpp | 20 ++ src/DrawingProgram/EllipseDrawTool.cpp | 72 +----- src/DrawingProgram/EllipseDrawTool.hpp | 25 +- src/DrawingProgram/EraserTool.cpp | 7 +- src/DrawingProgram/EraserTool.hpp | 18 +- .../{ImageTool.cpp => ImageEditTool.cpp} | 17 +- src/DrawingProgram/ImageEditTool.hpp | 14 ++ src/DrawingProgram/ImageTool.hpp | 23 -- src/DrawingProgram/InkDropperTool.cpp | 10 +- src/DrawingProgram/InkDropperTool.hpp | 19 +- src/DrawingProgram/LassoSelectTool.cpp | 8 +- src/DrawingProgram/LassoSelectTool.hpp | 16 +- src/DrawingProgram/RectDrawEditTool.cpp | 79 +++++++ src/DrawingProgram/RectDrawEditTool.hpp | 18 ++ src/DrawingProgram/RectDrawTool.cpp | 76 +----- src/DrawingProgram/RectDrawTool.hpp | 25 +- src/DrawingProgram/RectSelectTool.cpp | 7 +- src/DrawingProgram/RectSelectTool.hpp | 21 +- src/DrawingProgram/ScreenshotTool.cpp | 17 +- src/DrawingProgram/ScreenshotTool.hpp | 18 +- src/DrawingProgram/TextBoxEditTool.cpp | 210 +++++++++++++++++ src/DrawingProgram/TextBoxEditTool.hpp | 22 ++ src/DrawingProgram/TextBoxTool.cpp | 212 +---------------- src/DrawingProgram/TextBoxTool.hpp | 25 +- 37 files changed, 790 insertions(+), 801 deletions(-) create mode 100644 src/DrawingProgram/DrawingProgramEditToolBase.cpp create mode 100644 src/DrawingProgram/DrawingProgramEditToolBase.hpp create mode 100644 src/DrawingProgram/DrawingProgramToolBase.cpp create mode 100644 src/DrawingProgram/DrawingProgramToolBase.hpp create mode 100644 src/DrawingProgram/EllipseDrawEditTool.cpp create mode 100644 src/DrawingProgram/EllipseDrawEditTool.hpp rename src/DrawingProgram/{ImageTool.cpp => ImageEditTool.cpp} (67%) create mode 100644 src/DrawingProgram/ImageEditTool.hpp delete mode 100644 src/DrawingProgram/ImageTool.hpp create mode 100644 src/DrawingProgram/RectDrawEditTool.cpp create mode 100644 src/DrawingProgram/RectDrawEditTool.hpp create mode 100644 src/DrawingProgram/TextBoxEditTool.cpp create mode 100644 src/DrawingProgram/TextBoxEditTool.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ae552bc..4d166c5 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,8 +57,13 @@ set(sources "src/main.cpp" "src/DrawingProgram/InkDropperTool.cpp" "src/DrawingProgram/ScreenshotTool.cpp" "src/DrawingProgram/EditTool.cpp" - "src/DrawingProgram/ImageTool.cpp" + "src/DrawingProgram/ImageEditTool.cpp" "src/DrawingProgram/DrawingProgramSelection.cpp" + "src/DrawingProgram/DrawingProgramEditToolBase.cpp" + "src/DrawingProgram/DrawingProgramToolBase.cpp" + "src/DrawingProgram/EllipseDrawEditTool.cpp" + "src/DrawingProgram/RectDrawEditTool.cpp" + "src/DrawingProgram/TextBoxEditTool.cpp" "src/DrawComponents/DrawEllipse.cpp" "src/DrawComponents/DrawRectangle.cpp" "src/DrawComponents/DrawImage.cpp" diff --git a/src/DrawingProgram/BrushTool.cpp b/src/DrawingProgram/BrushTool.cpp index 4a63fd6..a69fc56 100644 --- a/src/DrawingProgram/BrushTool.cpp +++ b/src/DrawingProgram/BrushTool.cpp @@ -1,12 +1,10 @@ #include "BrushTool.hpp" #include -#include "../TimePoint.hpp" #include "../DrawComponents/DrawBrushStroke.hpp" #include "../GUIStuff/GUIManager.hpp" -#include "../SharedTypes.hpp" -#include "../Server/CommandList.hpp" #include "DrawingProgram.hpp" #include "../MainProgram.hpp" +#include "DrawingProgramToolBase.hpp" #include #define VEL_SMOOTH_MIN 0.6 @@ -14,8 +12,11 @@ #define MINIMUM_DISTANCE_TO_NEXT_POINT 0.002f BrushTool::BrushTool(DrawingProgram& initDrawP): - drawP(initDrawP) -{ + DrawingProgramToolBase(initDrawP) +{} + +DrawingProgramToolType BrushTool::get_type() { + return DrawingProgramToolType::BRUSH; } void BrushTool::reset_tool() { diff --git a/src/DrawingProgram/BrushTool.hpp b/src/DrawingProgram/BrushTool.hpp index bed4104..8ac3d9e 100644 --- a/src/DrawingProgram/BrushTool.hpp +++ b/src/DrawingProgram/BrushTool.hpp @@ -1,5 +1,6 @@ #pragma once #include "../SharedTypes.hpp" +#include "DrawingProgramToolBase.hpp" #include #include #include @@ -12,14 +13,15 @@ class DrawingProgram; class DrawBrushStroke; struct DrawData; -class BrushTool { +class BrushTool : public DrawingProgramToolBase { public: BrushTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void reset_tool(); - void draw(SkCanvas* canvas, const DrawData& drawData); - bool prevent_undo_or_redo(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void reset_tool() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual bool prevent_undo_or_redo() override; private: void commit_stroke(); bool extensive_point_checking_back(const Vector2f& newPoint); @@ -42,6 +44,4 @@ class BrushTool { bool midwayInterpolation = true; Vector2f prevPointUnaltered = {0, 0}; } controls; - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index e93ce4e..919c0b4 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -1,7 +1,5 @@ #include "DrawingProgram.hpp" -#include "Helpers/Hashes.hpp" -#include "Helpers/MathExtras.hpp" -#include "Helpers/SCollision.hpp" +#include "DrawingProgramToolBase.hpp" #include #include #include "../DrawCamera.hpp" @@ -11,11 +9,10 @@ #include "../InputManager.hpp" #include "../SharedTypes.hpp" #include "../Server/CommandList.hpp" +#include #include -#include #include #include -#include #include "../DrawComponents/DrawImage.hpp" #include #include @@ -29,23 +26,16 @@ #include #include +#include "EraserTool.hpp" + DrawingProgram::DrawingProgram(World& initWorld): world(initWorld), compCache(*this), components([&](){ return world.get_new_id(); }), - brushTool(*this), - eraserTool(*this), - rectSelectTool(*this), - lassoSelectTool(*this), - rectDrawTool(*this), - ellipseDrawTool(*this), - textBoxTool(*this), - inkDropperTool(*this), - screenshotTool(*this), - editTool(*this), - imageTool(*this), selection(*this) { + drawTool = DrawingProgramToolBase::allocate_tool_type(*this, controls.selectedTool); + components.updateCallback = [&]() { if(&world == world.main.world.get()) world.main.drawProgCache.refresh = true; @@ -199,16 +189,16 @@ void DrawingProgram::toolbar_gui() { .border = {.color = convert_vec4(t.io->theme->backColor2), .width = CLAY_BORDER_OUTSIDE(t.io->theme->windowBorders1)} }) { t.gui.obstructing_window(); - if(t.gui.svg_icon_button("Brush Toolbar Button", "data/icons/brush.svg", controls.selectedTool == TOOL_BRUSH)) { controls.selectedTool = TOOL_BRUSH; } - if(t.gui.svg_icon_button("Eraser Toolbar Button", "data/icons/eraser.svg", controls.selectedTool == TOOL_ERASER)) { controls.selectedTool = TOOL_ERASER; } - if(t.gui.svg_icon_button("Text Toolbar Button", "data/icons/text.svg", controls.selectedTool == TOOL_TEXTBOX)) { controls.selectedTool = TOOL_TEXTBOX; } - if(t.gui.svg_icon_button("Ellipse Toolbar Button", "data/icons/circle.svg", controls.selectedTool == TOOL_ELLIPSE)) { controls.selectedTool = TOOL_ELLIPSE; } - if(t.gui.svg_icon_button("Rect Toolbar Button", "data/icons/rectangle.svg", controls.selectedTool == TOOL_RECTANGLE)) { controls.selectedTool = TOOL_RECTANGLE; } - if(t.gui.svg_icon_button("RectSelect Toolbar Button", "data/icons/rectselect.svg", controls.selectedTool == TOOL_RECTSELECT)) { controls.selectedTool = TOOL_RECTSELECT; } - if(t.gui.svg_icon_button("LassoSelect Toolbar Button", "data/icons/close.svg", controls.selectedTool == TOOL_LASSOSELECT)) { controls.selectedTool = TOOL_LASSOSELECT; } - if(t.gui.svg_icon_button("Edit Toolbar Button", "data/icons/cursor.svg", controls.selectedTool == TOOL_EDIT)) { controls.selectedTool = TOOL_EDIT; } - if(t.gui.svg_icon_button("Inkdropper Toolbar Button", "data/icons/eyedropper.svg", controls.selectedTool == TOOL_INKDROPPER)) { controls.selectedTool = TOOL_INKDROPPER; } - if(t.gui.svg_icon_button("Screenshot Toolbar Button", "data/icons/camera.svg", controls.selectedTool == TOOL_SCREENSHOT)) { controls.selectedTool = TOOL_SCREENSHOT; } + if(t.gui.svg_icon_button("Brush Toolbar Button", "data/icons/brush.svg", controls.selectedTool == DrawingProgramToolType::BRUSH)) { controls.selectedTool = DrawingProgramToolType::BRUSH; } + if(t.gui.svg_icon_button("Eraser Toolbar Button", "data/icons/eraser.svg", controls.selectedTool == DrawingProgramToolType::ERASER)) { controls.selectedTool = DrawingProgramToolType::ERASER; } + if(t.gui.svg_icon_button("Text Toolbar Button", "data/icons/text.svg", controls.selectedTool == DrawingProgramToolType::TEXTBOX)) { controls.selectedTool = DrawingProgramToolType::TEXTBOX; } + if(t.gui.svg_icon_button("Ellipse Toolbar Button", "data/icons/circle.svg", controls.selectedTool == DrawingProgramToolType::ELLIPSE)) { controls.selectedTool = DrawingProgramToolType::ELLIPSE; } + if(t.gui.svg_icon_button("Rect Toolbar Button", "data/icons/rectangle.svg", controls.selectedTool == DrawingProgramToolType::RECTANGLE)) { controls.selectedTool = DrawingProgramToolType::RECTANGLE; } + if(t.gui.svg_icon_button("RectSelect Toolbar Button", "data/icons/rectselect.svg", controls.selectedTool == DrawingProgramToolType::RECTSELECT)) { controls.selectedTool = DrawingProgramToolType::RECTSELECT; } + if(t.gui.svg_icon_button("LassoSelect Toolbar Button", "data/icons/close.svg", controls.selectedTool == DrawingProgramToolType::LASSOSELECT)) { controls.selectedTool = DrawingProgramToolType::LASSOSELECT; } + if(t.gui.svg_icon_button("Edit Toolbar Button", "data/icons/cursor.svg", controls.selectedTool == DrawingProgramToolType::EDIT)) { controls.selectedTool = DrawingProgramToolType::EDIT; } + if(t.gui.svg_icon_button("Inkdropper Toolbar Button", "data/icons/eyedropper.svg", controls.selectedTool == DrawingProgramToolType::INKDROPPER)) { controls.selectedTool = DrawingProgramToolType::INKDROPPER; } + if(t.gui.svg_icon_button("Screenshot Toolbar Button", "data/icons/camera.svg", controls.selectedTool == DrawingProgramToolType::SCREENSHOT)) { controls.selectedTool = DrawingProgramToolType::SCREENSHOT; } CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { if(t.gui.color_button("Foreground Color", &controls.foregroundColor, &controls.foregroundColor == t.colorLeft)) { t.color_selector_left(&controls.foregroundColor == t.colorLeft ? nullptr : &controls.foregroundColor); @@ -223,7 +213,7 @@ void DrawingProgram::toolbar_gui() { void DrawingProgram::tool_options_gui() { Toolbar& t = world.main.toolbar; - float minGUIWidth = controls.selectedTool == TOOL_SCREENSHOT ? 300 : 200; + float minGUIWidth = controls.selectedTool == DrawingProgramToolType::SCREENSHOT ? 300 : 200; CLAY({ .layout = { .sizing = {.width = CLAY_SIZING_FIT(minGUIWidth), .height = CLAY_SIZING_FIT(0)}, @@ -237,54 +227,24 @@ void DrawingProgram::tool_options_gui() { .border = {.color = convert_vec4(t.io->theme->backColor2), .width = CLAY_BORDER_OUTSIDE(t.io->theme->windowBorders1)} }) { t.gui.obstructing_window(); - switch(controls.selectedTool) { - case TOOL_BRUSH: - brushTool.gui_toolbox(); - break; - case TOOL_ERASER: - eraserTool.gui_toolbox(); - break; - case TOOL_LASSOSELECT: - lassoSelectTool.gui_toolbox(); - break; - case TOOL_RECTSELECT: - rectSelectTool.gui_toolbox(); - break; - case TOOL_RECTANGLE: - rectDrawTool.gui_toolbox(); - break; - case TOOL_ELLIPSE: - ellipseDrawTool.gui_toolbox(); - break; - case TOOL_TEXTBOX: - textBoxTool.gui_toolbox(); - break; - case TOOL_INKDROPPER: - inkDropperTool.gui_toolbox(); - break; - case TOOL_SCREENSHOT: - screenshotTool.gui_toolbox(); - break; - case TOOL_EDIT: - editTool.gui_toolbox(); - break; - } + drawTool->gui_toolbox(); } } void DrawingProgram::update() { - if(controls.selectedTool == TOOL_BRUSH && world.main.input.pen.isEraser && !temporaryEraser) { - controls.selectedTool = TOOL_ERASER; + if(controls.selectedTool == DrawingProgramToolType::BRUSH && world.main.input.pen.isEraser && !temporaryEraser) { + controls.selectedTool = DrawingProgramToolType::ERASER; temporaryEraser = true; } - else if(controls.selectedTool == TOOL_ERASER && !world.main.input.pen.isEraser && temporaryEraser) { - controls.selectedTool = TOOL_BRUSH; + else if(controls.selectedTool == DrawingProgramToolType::ERASER && !world.main.input.pen.isEraser && temporaryEraser) { + controls.selectedTool = DrawingProgramToolType::BRUSH; temporaryEraser = false; } if(controls.selectedTool != controls.previousSelected) { - controls.previousSelected = controls.selectedTool; reset_tools(); + drawTool = DrawingProgramToolBase::allocate_tool_type(*this, controls.selectedTool); + controls.previousSelected = controls.selectedTool; } controls.cursorHoveringOverCanvas = !world.main.toolbar.io->hoverObstructed; @@ -317,56 +277,25 @@ void DrawingProgram::update() { drag_drop_update(); if(world.main.input.key(InputManager::KEY_DRAW_TOOL_BRUSH).pressed) - controls.selectedTool = TOOL_BRUSH; + controls.selectedTool = DrawingProgramToolType::BRUSH; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_ERASER).pressed) - controls.selectedTool = TOOL_ERASER; + controls.selectedTool = DrawingProgramToolType::ERASER; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_RECTSELECT).pressed) - controls.selectedTool = TOOL_RECTSELECT; + controls.selectedTool = DrawingProgramToolType::RECTSELECT; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_RECTANGLE).pressed) - controls.selectedTool = TOOL_RECTANGLE; + controls.selectedTool = DrawingProgramToolType::RECTANGLE; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_ELLIPSE).pressed) - controls.selectedTool = TOOL_ELLIPSE; + controls.selectedTool = DrawingProgramToolType::ELLIPSE; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_TEXTBOX).pressed) - controls.selectedTool = TOOL_TEXTBOX; + controls.selectedTool = DrawingProgramToolType::TEXTBOX; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_INKDROPPER).pressed) - controls.selectedTool = TOOL_INKDROPPER; + controls.selectedTool = DrawingProgramToolType::INKDROPPER; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_SCREENSHOT).pressed) - controls.selectedTool = TOOL_SCREENSHOT; + controls.selectedTool = DrawingProgramToolType::SCREENSHOT; else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_EDIT).pressed) - controls.selectedTool = TOOL_EDIT; + controls.selectedTool = DrawingProgramToolType::EDIT; - switch(controls.selectedTool) { - case TOOL_BRUSH: - brushTool.tool_update(); - break; - case TOOL_ERASER: - eraserTool.tool_update(); - break; - case TOOL_LASSOSELECT: - lassoSelectTool.tool_update(); - break; - case TOOL_RECTSELECT: - rectSelectTool.tool_update(); - break; - case TOOL_RECTANGLE: - rectDrawTool.tool_update(); - break; - case TOOL_ELLIPSE: - ellipseDrawTool.tool_update(); - break; - case TOOL_TEXTBOX: - textBoxTool.tool_update(); - break; - case TOOL_INKDROPPER: - inkDropperTool.tool_update(); - break; - case TOOL_SCREENSHOT: - screenshotTool.tool_update(); - break; - case TOOL_EDIT: - editTool.tool_update(); - break; - }; + drawTool->tool_update(); if(controls.leftClickReleased) controls.leftClickReleased = false; @@ -376,38 +305,18 @@ void DrawingProgram::update() { selection.update(); - if(controls.selectedTool == TOOL_ERASER) - compCache.test_rebuild_dont_include_set_dont_include_nodes(components.client_list(), eraserTool.erasedComponents, eraserTool.erasedBVHNodes); - else if(controls.selectedTool == TOOL_RECTSELECT) + if(controls.selectedTool == DrawingProgramToolType::ERASER) { + EraserTool* eraserTool = static_cast(drawTool.get()); + compCache.test_rebuild_dont_include_set_dont_include_nodes(components.client_list(), eraserTool->erasedComponents, eraserTool->erasedBVHNodes); + } + else if(controls.selectedTool == DrawingProgramToolType::RECTSELECT) compCache.test_rebuild_dont_include_set(components.client_list(), selection.get_selected_set()); else compCache.test_rebuild(components.client_list()); } bool DrawingProgram::prevent_undo_or_redo() { - switch(controls.selectedTool) { - case TOOL_BRUSH: - return brushTool.prevent_undo_or_redo(); - case TOOL_ERASER: - return eraserTool.prevent_undo_or_redo(); - case TOOL_LASSOSELECT: - return lassoSelectTool.prevent_undo_or_redo(); - case TOOL_RECTSELECT: - return rectSelectTool.prevent_undo_or_redo(); - case TOOL_RECTANGLE: - return rectDrawTool.prevent_undo_or_redo(); - case TOOL_ELLIPSE: - return ellipseDrawTool.prevent_undo_or_redo(); - case TOOL_TEXTBOX: - return textBoxTool.prevent_undo_or_redo(); - case TOOL_INKDROPPER: - return inkDropperTool.prevent_undo_or_redo(); - case TOOL_SCREENSHOT: - return screenshotTool.prevent_undo_or_redo(); - case TOOL_EDIT: - return editTool.prevent_undo_or_redo(); - }; - return false; + return drawTool->prevent_undo_or_redo(); } SkPaint DrawingProgram::select_tool_line_paint() { @@ -425,9 +334,11 @@ SkPaint DrawingProgram::select_tool_line_paint() { } void DrawingProgram::force_rebuild_cache() { - if(controls.selectedTool == TOOL_ERASER) - compCache.test_rebuild_dont_include_set_dont_include_nodes(components.client_list(), eraserTool.erasedComponents, eraserTool.erasedBVHNodes, true); - else if(controls.selectedTool == TOOL_RECTSELECT) + if(controls.selectedTool == DrawingProgramToolType::ERASER) { + EraserTool* eraserTool = static_cast(drawTool.get()); + compCache.test_rebuild_dont_include_set_dont_include_nodes(components.client_list(), eraserTool->erasedComponents, eraserTool->erasedBVHNodes, true); + } + else if(controls.selectedTool == DrawingProgramToolType::RECTSELECT) compCache.test_rebuild_dont_include_set(components.client_list(), selection.get_selected_set(), true); else compCache.test_rebuild(components.client_list(), true); @@ -499,14 +410,7 @@ void DrawingProgram::add_file_to_canvas_by_data(const std::string& fileName, std } void DrawingProgram::reset_tools() { - lassoSelectTool.reset_tool(); - rectSelectTool.reset_tool(); - textBoxTool.reset_tool(); - brushTool.reset_tool(); - rectDrawTool.reset_tool(); - ellipseDrawTool.reset_tool(); - editTool.reset_tool(); - eraserTool.reset_tool(); + drawTool->reset_tool(); } void DrawingProgram::initialize_draw_data(cereal::PortableBinaryInputArchive& a) { @@ -705,38 +609,7 @@ void DrawingProgram::draw(SkCanvas* canvas, const DrawData& drawData) { } } - switch(controls.selectedTool) { - case TOOL_BRUSH: - brushTool.draw(canvas, drawData); - break; - case TOOL_ERASER: - eraserTool.draw(canvas, drawData); - break; - case TOOL_LASSOSELECT: - lassoSelectTool.draw(canvas, drawData); - break; - case TOOL_RECTSELECT: - rectSelectTool.draw(canvas, drawData); - break; - case TOOL_RECTANGLE: - rectDrawTool.draw(canvas, drawData); - break; - case TOOL_ELLIPSE: - ellipseDrawTool.draw(canvas, drawData); - break; - case TOOL_TEXTBOX: - textBoxTool.draw(canvas, drawData); - break; - case TOOL_INKDROPPER: - inkDropperTool.draw(canvas, drawData); - break; - case TOOL_SCREENSHOT: - screenshotTool.draw(canvas, drawData); - break; - case TOOL_EDIT: - editTool.draw(canvas, drawData); - break; - } + drawTool->draw(canvas, drawData); } Vector4f* DrawingProgram::get_foreground_color_ptr() { diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 74ba5a4..d0f5061 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -9,19 +9,9 @@ #include #include #include -#include "BrushTool.hpp" -#include "EraserTool.hpp" -#include "RectSelectTool.hpp" -#include "LassoSelectTool.hpp" -#include "RectDrawTool.hpp" -#include "EllipseDrawTool.hpp" -#include "TextBoxTool.hpp" -#include "InkDropperTool.hpp" -#include "ScreenshotTool.hpp" -#include "EditTool.hpp" -#include "ImageTool.hpp" #include "DrawingProgramSelection.hpp" #include "../CollabList.hpp" +#include "DrawingProgramToolBase.hpp" class World; @@ -87,45 +77,21 @@ class DrawingProgram { SkPaint select_tool_line_paint(); - - BrushTool brushTool; - EraserTool eraserTool; - RectSelectTool rectSelectTool; - LassoSelectTool lassoSelectTool; - RectDrawTool rectDrawTool; - EllipseDrawTool ellipseDrawTool; - TextBoxTool textBoxTool; - InkDropperTool inkDropperTool; - ScreenshotTool screenshotTool; - EditTool editTool; - ImageTool imageTool; + std::unique_ptr drawTool; DrawingProgramSelection selection; bool temporaryEraser = false; - enum Tool : int { - TOOL_BRUSH = 0, - TOOL_ERASER, - TOOL_LASSOSELECT, - TOOL_RECTSELECT, - TOOL_RECTANGLE, - TOOL_ELLIPSE, - TOOL_TEXTBOX, - TOOL_INKDROPPER, - TOOL_SCREENSHOT, - TOOL_EDIT - }; - struct GlobalControls { float relativeWidth = 15.0f; Vector4f foregroundColor{0.9f, 0.9f, 0.9f, 1.0f}; Vector4f backgroundColor{0.0f, 0.0f, 0.0f, 1.0f}; - int previousSelected = 0; + DrawingProgramToolType selectedTool = DrawingProgramToolType::BRUSH; + DrawingProgramToolType previousSelected = DrawingProgramToolType::BRUSH; WorldVec previousMouseWorldPos = {0, 0}; WorldVec currentMouseWorldPos = {0, 0}; - int selectedTool = 0; bool leftClick = false; bool leftClickHeld = false; bool leftClickReleased = false; @@ -145,7 +111,10 @@ class DrawingProgram { friend class TextBoxTool; friend class ScreenshotTool; friend class EditTool; - friend class ImageTool; + friend class ImageEditTool; + friend class RectDrawEditTool; + friend class EllipseDrawEditTool; + friend class TextBoxEditTool; friend class DrawingProgramCache; friend class DrawingProgramSelection; friend class LassoSelectTool; diff --git a/src/DrawingProgram/DrawingProgramEditToolBase.cpp b/src/DrawingProgram/DrawingProgramEditToolBase.cpp new file mode 100644 index 0000000..144a40c --- /dev/null +++ b/src/DrawingProgram/DrawingProgramEditToolBase.cpp @@ -0,0 +1,7 @@ +#include "DrawingProgramEditToolBase.hpp" + +DrawingProgramEditToolBase::DrawingProgramEditToolBase(DrawingProgram& initDrawP): + drawP(initDrawP) +{} + +DrawingProgramEditToolBase::~DrawingProgramEditToolBase() {} diff --git a/src/DrawingProgram/DrawingProgramEditToolBase.hpp b/src/DrawingProgram/DrawingProgramEditToolBase.hpp new file mode 100644 index 0000000..3b0ccae --- /dev/null +++ b/src/DrawingProgram/DrawingProgramEditToolBase.hpp @@ -0,0 +1,19 @@ +#pragma once +#include +#include "../DrawData.hpp" +#include "../DrawComponents/DrawComponent.hpp" + +class DrawingProgram; +class EditTool; + +class DrawingProgramEditToolBase { + public: + DrawingProgramEditToolBase(DrawingProgram& initDrawP); + virtual void edit_start(EditTool& editTool, const std::shared_ptr& a, std::any& prevData) = 0; + virtual void commit_edit_updates(const std::shared_ptr& a, std::any& prevData) = 0; + virtual bool edit_update(const std::shared_ptr& a) = 0; + virtual bool edit_gui(const std::shared_ptr& a) = 0; + virtual ~DrawingProgramEditToolBase(); + protected: + DrawingProgram& drawP; +}; diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index 521a3ce..65e90f0 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -325,9 +325,9 @@ void DrawingProgramSelection::update() { void DrawingProgramSelection::paste_clipboard() { auto& clipboard = drawP.world.main.clipboard; - drawP.reset_tools(); - drawP.controls.selectedTool = DrawingProgram::TOOL_RECTSELECT; - drawP.controls.previousSelected = DrawingProgram::TOOL_RECTSELECT; + + drawP.controls.selectedTool = DrawingProgramToolType::RECTSELECT; + uint64_t allPlacement = drawP.components.client_list().size(); std::vector> placedComponents; WorldVec mousePos = drawP.world.get_mouse_world_pos(); diff --git a/src/DrawingProgram/DrawingProgramToolBase.cpp b/src/DrawingProgram/DrawingProgramToolBase.cpp new file mode 100644 index 0000000..9dbaa5c --- /dev/null +++ b/src/DrawingProgram/DrawingProgramToolBase.cpp @@ -0,0 +1,44 @@ +#include "DrawingProgramToolBase.hpp" + +#include "BrushTool.hpp" +#include "EraserTool.hpp" +#include "RectSelectTool.hpp" +#include "LassoSelectTool.hpp" +#include "RectDrawTool.hpp" +#include "EllipseDrawTool.hpp" +#include "TextBoxTool.hpp" +#include "InkDropperTool.hpp" +#include "ScreenshotTool.hpp" +#include "EditTool.hpp" + +DrawingProgramToolBase::DrawingProgramToolBase(DrawingProgram& initDrawP): + drawP(initDrawP) +{} + +DrawingProgramToolBase::~DrawingProgramToolBase() {} + +std::unique_ptr DrawingProgramToolBase::allocate_tool_type(DrawingProgram& drawP, DrawingProgramToolType t) { + switch(t) { + case DrawingProgramToolType::BRUSH: + return std::make_unique(drawP); + case DrawingProgramToolType::ERASER: + return std::make_unique(drawP); + case DrawingProgramToolType::LASSOSELECT: + return std::make_unique(drawP); + case DrawingProgramToolType::RECTSELECT: + return std::make_unique(drawP); + case DrawingProgramToolType::RECTANGLE: + return std::make_unique(drawP); + case DrawingProgramToolType::ELLIPSE: + return std::make_unique(drawP); + case DrawingProgramToolType::TEXTBOX: + return std::make_unique(drawP); + case DrawingProgramToolType::INKDROPPER: + return std::make_unique(drawP); + case DrawingProgramToolType::SCREENSHOT: + return std::make_unique(drawP); + case DrawingProgramToolType::EDIT: + return std::make_unique(drawP); + } + return nullptr; +} diff --git a/src/DrawingProgram/DrawingProgramToolBase.hpp b/src/DrawingProgram/DrawingProgramToolBase.hpp new file mode 100644 index 0000000..6ab9488 --- /dev/null +++ b/src/DrawingProgram/DrawingProgramToolBase.hpp @@ -0,0 +1,33 @@ +#pragma once +#include +#include "../DrawData.hpp" + +class DrawingProgram; + +enum class DrawingProgramToolType : int { + BRUSH = 0, + ERASER, + LASSOSELECT, + RECTSELECT, + RECTANGLE, + ELLIPSE, + TEXTBOX, + INKDROPPER, + SCREENSHOT, + EDIT +}; + +class DrawingProgramToolBase { + public: + DrawingProgramToolBase(DrawingProgram& initDrawP); + virtual DrawingProgramToolType get_type() = 0; + virtual void gui_toolbox() = 0; + virtual void tool_update() = 0; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) = 0; + virtual void reset_tool() = 0; + virtual bool prevent_undo_or_redo() = 0; + virtual ~DrawingProgramToolBase(); + static std::unique_ptr allocate_tool_type(DrawingProgram& drawP, DrawingProgramToolType t); + protected: + DrawingProgram& drawP; +}; diff --git a/src/DrawingProgram/EditTool.cpp b/src/DrawingProgram/EditTool.cpp index 4ecebbf..061ece1 100644 --- a/src/DrawingProgram/EditTool.cpp +++ b/src/DrawingProgram/EditTool.cpp @@ -1,57 +1,38 @@ #include "EditTool.hpp" #include #include "DrawingProgram.hpp" -#include "../Server/CommandList.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" #include "Helpers/MathExtras.hpp" #include "Helpers/SCollision.hpp" -#include "Helpers/Serializers.hpp" -#include "../DrawComponents/DrawRectangle.hpp" -#include "../DrawComponents/DrawTextBox.hpp" -#include "../InputManager.hpp" #include "../SharedTypes.hpp" #include #include -#include + +#include "TextBoxEditTool.hpp" +#include "RectDrawEditTool.hpp" +#include "ImageEditTool.hpp" +#include "EllipseDrawEditTool.hpp" EditTool::EditTool(DrawingProgram& initDrawP): - drawP(initDrawP) -{ + DrawingProgramToolBase(initDrawP) +{} + +DrawingProgramToolType EditTool::get_type() { + return DrawingProgramToolType::EDIT; } void EditTool::gui_toolbox() { Toolbar& t = drawP.world.main.toolbar; if(controls.isEditing) { std::shared_ptr a = controls.compToEdit.lock(); - bool editHappened = false; if(a) { - switch(a->get_type()) { - case DRAWCOMPONENT_TEXTBOX: { - editHappened = drawP.textBoxTool.edit_gui(std::static_pointer_cast(a)); - break; - } - case DRAWCOMPONENT_ELLIPSE: { - editHappened = drawP.ellipseDrawTool.edit_gui(std::static_pointer_cast(a)); - break; - } - case DRAWCOMPONENT_RECTANGLE: { - editHappened = drawP.rectDrawTool.edit_gui(std::static_pointer_cast(a)); - break; - } - case DRAWCOMPONENT_IMAGE: { - editHappened = drawP.imageTool.edit_gui(std::static_pointer_cast(a)); - break; - } - default: { - break; - } + bool editHappened = controls.compEditTool->edit_gui(a); + if(editHappened) { + a->commit_update(drawP); + a->client_send_update(drawP); } } - if(editHappened) { - a->commit_update(drawP); - a->client_send_update(drawP); - } } else { t.gui.push_id("edit tool"); @@ -67,22 +48,7 @@ void EditTool::add_point_handle(const HandleData& handle) { void EditTool::reset_tool() { auto a = controls.compToEdit.lock(); if(a && a->collabListInfo.lock()) { - switch(a->get_type()) { - case DRAWCOMPONENT_TEXTBOX: - drawP.textBoxTool.commit_edit_updates(std::static_pointer_cast(a), controls.prevData); - break; - case DRAWCOMPONENT_ELLIPSE: - drawP.ellipseDrawTool.commit_edit_updates(std::static_pointer_cast(a), controls.prevData); - break; - case DRAWCOMPONENT_RECTANGLE: - drawP.rectDrawTool.commit_edit_updates(std::static_pointer_cast(a), controls.prevData); - break; - case DRAWCOMPONENT_IMAGE: - drawP.imageTool.commit_edit_updates(std::static_pointer_cast(a), controls.prevData); - break; - default: - break; - } + controls.compEditTool->commit_edit_updates(a, controls.prevData); a->commit_update(drawP); a->client_send_update(drawP); } @@ -96,19 +62,19 @@ void EditTool::edit_start(const std::shared_ptr& comp) { controls.isEditing = true; switch(comp->get_type()) { case DRAWCOMPONENT_TEXTBOX: { - drawP.textBoxTool.edit_start(std::static_pointer_cast(comp), controls.prevData); + controls.compEditTool = std::make_unique(drawP); break; } case DRAWCOMPONENT_ELLIPSE: { - drawP.ellipseDrawTool.edit_start(std::static_pointer_cast(comp), controls.prevData); + controls.compEditTool = std::make_unique(drawP); break; } case DRAWCOMPONENT_RECTANGLE: { - drawP.rectDrawTool.edit_start(std::static_pointer_cast(comp), controls.prevData); + controls.compEditTool = std::make_unique(drawP); break; } case DRAWCOMPONENT_IMAGE: { - drawP.imageTool.edit_start(std::static_pointer_cast(comp), controls.prevData); + controls.compEditTool = std::make_unique(drawP); break; } default: { @@ -118,6 +84,7 @@ void EditTool::edit_start(const std::shared_ptr& comp) { } if(controls.isEditing) { controls.compToEdit = comp; + controls.compEditTool->edit_start(*this, comp, controls.prevData); comp->lastUpdateTime = std::chrono::steady_clock::now(); } } @@ -188,29 +155,7 @@ void EditTool::tool_update() { a->lastUpdateTime = std::chrono::steady_clock::now(); - bool shouldNotReset; - switch(a->get_type()) { - case DRAWCOMPONENT_TEXTBOX: { - shouldNotReset = drawP.textBoxTool.edit_update(std::static_pointer_cast(a)); - break; - } - case DRAWCOMPONENT_ELLIPSE: { - shouldNotReset = drawP.ellipseDrawTool.edit_update(std::static_pointer_cast(a)); - break; - } - case DRAWCOMPONENT_RECTANGLE: { - shouldNotReset = drawP.rectDrawTool.edit_update(std::static_pointer_cast(a)); - break; - } - case DRAWCOMPONENT_IMAGE: { - shouldNotReset = drawP.imageTool.edit_update(std::static_pointer_cast(a)); - break; - } - default: { - shouldNotReset = false; - break; - } - } + bool shouldNotReset = controls.compEditTool->edit_update(a); if(!shouldNotReset || clickedAway) reset_tool(); } diff --git a/src/DrawingProgram/EditTool.hpp b/src/DrawingProgram/EditTool.hpp index 585acc9..b8f704a 100644 --- a/src/DrawingProgram/EditTool.hpp +++ b/src/DrawingProgram/EditTool.hpp @@ -1,13 +1,13 @@ #pragma once -#include -#include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include "../DrawComponents/DrawEllipse.hpp" #include #include +#include "DrawingProgramEditToolBase.hpp" class DrawingProgram; -class EditTool { +class EditTool : public DrawingProgramToolBase { public: struct HandleData { Vector2f* p; @@ -16,22 +16,22 @@ class EditTool { }; EditTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void reset_tool(); - void draw(SkCanvas* canvas, const DrawData& drawData); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void reset_tool() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual bool prevent_undo_or_redo() override; + void add_point_handle(const HandleData& handle); void edit_start(const std::shared_ptr& comp); - bool prevent_undo_or_redo(); struct EditControls { + std::unique_ptr compEditTool; std::vector pointHandles; std::weak_ptr compToEdit; bool isEditing = false; HandleData* pointDragging = nullptr; std::any prevData; } controls; - private: - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/EllipseDrawEditTool.cpp b/src/DrawingProgram/EllipseDrawEditTool.cpp new file mode 100644 index 0000000..a766636 --- /dev/null +++ b/src/DrawingProgram/EllipseDrawEditTool.cpp @@ -0,0 +1,82 @@ +#include "EllipseDrawEditTool.hpp" +#include "DrawingProgram.hpp" +#include "../World.hpp" +#include "../MainProgram.hpp" +#include "../DrawData.hpp" +#include +#include +#include "EditTool.hpp" + +EllipseDrawEditTool::EllipseDrawEditTool(DrawingProgram& initDrawP): + DrawingProgramEditToolBase(initDrawP) +{} + +bool EllipseDrawEditTool::edit_gui(const std::shared_ptr& comp) { + auto a = std::static_pointer_cast(comp); + + Toolbar& t = drawP.world.main.toolbar; + t.gui.push_id("edit tool ellipse"); + t.gui.text_label_centered("Edit Ellipse"); + if(t.gui.radio_button_field("fillonly", "Fill only", a->d.fillStrokeMode == 0)) a->d.fillStrokeMode = 0; + if(t.gui.radio_button_field("outlineonly", "Outline only", a->d.fillStrokeMode == 1)) a->d.fillStrokeMode = 1; + if(t.gui.radio_button_field("filloutline", "Fill and Outline", a->d.fillStrokeMode == 2)) a->d.fillStrokeMode = 2; + if(a->d.fillStrokeMode == 0 || a->d.fillStrokeMode == 2) { + t.gui.left_to_right_line_layout([&]() { + CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { + if(t.gui.color_button("Fill Color", &a->d.fillColor, &a->d.fillColor == t.colorRight)) + t.color_selector_right(&a->d.fillColor == t.colorRight ? nullptr : &a->d.fillColor); + } + t.gui.text_label("Fill Color"); + }); + } + if(a->d.fillStrokeMode == 1 || a->d.fillStrokeMode == 2) { + t.gui.slider_scalar_field("relstrokewidth", "Outline Size", &a->d.strokeWidth, 3.0f, 40.0f); + t.gui.left_to_right_line_layout([&]() { + CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { + if(t.gui.color_button("Outline Color", &a->d.strokeColor, &a->d.strokeColor == t.colorRight)) + t.color_selector_right(&a->d.strokeColor == t.colorRight ? nullptr : &a->d.strokeColor); + } + t.gui.text_label("Outline Color"); + }); + } + t.gui.pop_id(); + + bool editHappened = a->d != oldData; + oldData = a->d; + return editHappened; +} + +void EllipseDrawEditTool::edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) { + auto a = std::static_pointer_cast(comp); + + prevData = a->d; + editTool.add_point_handle({&a->d.p1, nullptr, &a->d.p2}); + editTool.add_point_handle({&a->d.p2, &a->d.p1, nullptr}); +} + +void EllipseDrawEditTool::commit_edit_updates(const std::shared_ptr& comp, std::any& prevData) { + auto a = std::static_pointer_cast(comp); + + DrawEllipse::Data pData = std::any_cast(prevData); + DrawEllipse::Data cData = a->d; + drawP.world.undo.push(UndoManager::UndoRedoPair{ + [&, a, pData]() { + a->d = pData; + a->client_send_update(drawP); + a->commit_update(drawP); + drawP.reset_tools(); + return true; + }, + [&, a, cData]() { + a->d = cData; + a->client_send_update(drawP); + a->commit_update(drawP); + drawP.reset_tools(); + return true; + } + }); +} + +bool EllipseDrawEditTool::edit_update(const std::shared_ptr& comp) { + return true; +} diff --git a/src/DrawingProgram/EllipseDrawEditTool.hpp b/src/DrawingProgram/EllipseDrawEditTool.hpp new file mode 100644 index 0000000..6d05244 --- /dev/null +++ b/src/DrawingProgram/EllipseDrawEditTool.hpp @@ -0,0 +1,20 @@ +#pragma once +#include "DrawingProgramEditToolBase.hpp" +#include "../DrawComponents/DrawEllipse.hpp" +#include +#include + +class DrawingProgram; + +class EllipseDrawEditTool : public DrawingProgramEditToolBase { + public: + EllipseDrawEditTool(DrawingProgram& initDrawP); + virtual void edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) override; + virtual void commit_edit_updates(const std::shared_ptr& comp, std::any& prevData) override; + virtual bool edit_update(const std::shared_ptr& comp) override; + virtual bool edit_gui(const std::shared_ptr& comp) override; + private: + void commit(); + + DrawEllipse::Data oldData; +}; diff --git a/src/DrawingProgram/EllipseDrawTool.cpp b/src/DrawingProgram/EllipseDrawTool.cpp index 4fa365b..d081096 100644 --- a/src/DrawingProgram/EllipseDrawTool.cpp +++ b/src/DrawingProgram/EllipseDrawTool.cpp @@ -4,6 +4,7 @@ #include "../Server/CommandList.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include "Helpers/SCollision.hpp" #include "Helpers/Serializers.hpp" #include "../InputManager.hpp" @@ -11,8 +12,11 @@ #include EllipseDrawTool::EllipseDrawTool(DrawingProgram& initDrawP): - drawP(initDrawP) -{ + DrawingProgramToolBase(initDrawP) +{} + +DrawingProgramToolType EllipseDrawTool::get_type() { + return DrawingProgramToolType::ELLIPSE; } void EllipseDrawTool::gui_toolbox() { @@ -27,75 +31,11 @@ void EllipseDrawTool::gui_toolbox() { t.gui.pop_id(); } -bool EllipseDrawTool::edit_gui(const std::shared_ptr& a) { - Toolbar& t = drawP.world.main.toolbar; - t.gui.push_id("edit tool ellipse"); - t.gui.text_label_centered("Edit Ellipse"); - if(t.gui.radio_button_field("fillonly", "Fill only", a->d.fillStrokeMode == 0)) a->d.fillStrokeMode = 0; - if(t.gui.radio_button_field("outlineonly", "Outline only", a->d.fillStrokeMode == 1)) a->d.fillStrokeMode = 1; - if(t.gui.radio_button_field("filloutline", "Fill and Outline", a->d.fillStrokeMode == 2)) a->d.fillStrokeMode = 2; - if(a->d.fillStrokeMode == 0 || a->d.fillStrokeMode == 2) { - t.gui.left_to_right_line_layout([&]() { - CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { - if(t.gui.color_button("Fill Color", &a->d.fillColor, &a->d.fillColor == t.colorRight)) - t.color_selector_right(&a->d.fillColor == t.colorRight ? nullptr : &a->d.fillColor); - } - t.gui.text_label("Fill Color"); - }); - } - if(a->d.fillStrokeMode == 1 || a->d.fillStrokeMode == 2) { - t.gui.slider_scalar_field("relstrokewidth", "Outline Size", &a->d.strokeWidth, 3.0f, 40.0f); - t.gui.left_to_right_line_layout([&]() { - CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { - if(t.gui.color_button("Outline Color", &a->d.strokeColor, &a->d.strokeColor == t.colorRight)) - t.color_selector_right(&a->d.strokeColor == t.colorRight ? nullptr : &a->d.strokeColor); - } - t.gui.text_label("Outline Color"); - }); - } - t.gui.pop_id(); - - bool editHappened = a->d != controls.oldData; - controls.oldData = a->d; - return editHappened; -} - -void EllipseDrawTool::edit_start(const std::shared_ptr& a, std::any& prevData) { - prevData = a->d; - drawP.editTool.add_point_handle({&a->d.p1, nullptr, &a->d.p2}); - drawP.editTool.add_point_handle({&a->d.p2, &a->d.p1, nullptr}); -} - -void EllipseDrawTool::commit_edit_updates(const std::shared_ptr& a, std::any& prevData) { - DrawEllipse::Data pData = std::any_cast(prevData); - DrawEllipse::Data cData = a->d; - drawP.world.undo.push(UndoManager::UndoRedoPair{ - [&, a, pData]() { - a->d = pData; - a->client_send_update(drawP); - a->commit_update(drawP); - drawP.reset_tools(); - return true; - }, - [&, a, cData]() { - a->d = cData; - a->client_send_update(drawP); - a->commit_update(drawP); - drawP.reset_tools(); - return true; - } - }); -} - void EllipseDrawTool::reset_tool() { commit(); controls.drawStage = 0; } -bool EllipseDrawTool::edit_update(const std::shared_ptr& a) { - return true; -} - void EllipseDrawTool::tool_update() { switch(controls.drawStage) { case 0: { diff --git a/src/DrawingProgram/EllipseDrawTool.hpp b/src/DrawingProgram/EllipseDrawTool.hpp index bd15fde..1dfc6e4 100644 --- a/src/DrawingProgram/EllipseDrawTool.hpp +++ b/src/DrawingProgram/EllipseDrawTool.hpp @@ -1,36 +1,27 @@ #pragma once -#include -#include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include "../DrawComponents/DrawEllipse.hpp" #include #include class DrawingProgram; -class EllipseDrawTool { +class EllipseDrawTool : public DrawingProgramToolBase { public: EllipseDrawTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void reset_tool(); - void draw(SkCanvas* canvas, const DrawData& drawData); - - void edit_start(const std::shared_ptr& a, std::any& prevData); - void commit_edit_updates(const std::shared_ptr& a, std::any& prevData); - bool edit_update(const std::shared_ptr& a); - bool edit_gui(const std::shared_ptr& a); - - bool prevent_undo_or_redo(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void reset_tool() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual bool prevent_undo_or_redo() override; private: void commit(); struct EllipseDrawControls { - DrawEllipse::Data oldData; Vector2f startAt; int fillStrokeMode = 1; int drawStage = 0; std::shared_ptr intermediateItem; } controls; - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/EraserTool.cpp b/src/DrawingProgram/EraserTool.cpp index cbfcbad..dd52034 100644 --- a/src/DrawingProgram/EraserTool.cpp +++ b/src/DrawingProgram/EraserTool.cpp @@ -4,8 +4,11 @@ #include "../DrawData.hpp" EraserTool::EraserTool(DrawingProgram& initDrawP): - drawP(initDrawP) -{ + DrawingProgramToolBase(initDrawP) +{} + +DrawingProgramToolType EraserTool::get_type() { + return DrawingProgramToolType::ERASER; } void EraserTool::gui_toolbox() { diff --git a/src/DrawingProgram/EraserTool.hpp b/src/DrawingProgram/EraserTool.hpp index 5541bef..63bf668 100644 --- a/src/DrawingProgram/EraserTool.hpp +++ b/src/DrawingProgram/EraserTool.hpp @@ -2,22 +2,20 @@ #include #include "../DrawData.hpp" #include "../DrawComponents/DrawComponent.hpp" +#include "DrawingProgramToolBase.hpp" class DrawingProgram; -class EraserTool { +class EraserTool : public DrawingProgramToolBase { public: EraserTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void reset_tool(); - void draw(SkCanvas* canvas, const DrawData& drawData); - - bool prevent_undo_or_redo(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void reset_tool() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual bool prevent_undo_or_redo() override; std::unordered_set erasedComponents; std::unordered_set> erasedBVHNodes; - private: - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/ImageTool.cpp b/src/DrawingProgram/ImageEditTool.cpp similarity index 67% rename from src/DrawingProgram/ImageTool.cpp rename to src/DrawingProgram/ImageEditTool.cpp index 04ad166..dbb08e2 100644 --- a/src/DrawingProgram/ImageTool.cpp +++ b/src/DrawingProgram/ImageEditTool.cpp @@ -1,29 +1,32 @@ -#include "ImageTool.hpp" +#include "ImageEditTool.hpp" #include "DrawingProgram.hpp" +#include "../DrawComponents/DrawImage.hpp" #include "../World.hpp" #include "../Toolbar.hpp" #include "../MainProgram.hpp" #include "../ResourceManager.hpp" +#include "DrawingProgramEditToolBase.hpp" #include #ifdef __EMSCRIPTEN__ #include #endif -ImageTool::ImageTool(DrawingProgram& initDrawP): - drawP(initDrawP) +ImageEditTool::ImageEditTool(DrawingProgram& initDrawP): + DrawingProgramEditToolBase(initDrawP) {} -void ImageTool::edit_start(const std::shared_ptr& a, std::any& prevData) { +void ImageEditTool::edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) { } -void ImageTool::commit_edit_updates(const std::shared_ptr& a, std::any& prevData) { +void ImageEditTool::commit_edit_updates(const std::shared_ptr& comp, std::any& prevData) { } -bool ImageTool::edit_update(const std::shared_ptr& a) { +bool ImageEditTool::edit_update(const std::shared_ptr& comp) { return true; } -bool ImageTool::edit_gui(const std::shared_ptr& a) { +bool ImageEditTool::edit_gui(const std::shared_ptr& comp) { + std::shared_ptr a = std::static_pointer_cast(comp); Toolbar& t = drawP.world.main.toolbar; t.gui.push_id("edit tool image"); t.gui.text_label_centered("File Properties"); diff --git a/src/DrawingProgram/ImageEditTool.hpp b/src/DrawingProgram/ImageEditTool.hpp new file mode 100644 index 0000000..008ecfa --- /dev/null +++ b/src/DrawingProgram/ImageEditTool.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "DrawingProgramEditToolBase.hpp" +#include + +class DrawingProgram; + +class ImageEditTool : public DrawingProgramEditToolBase { + public: + ImageEditTool(DrawingProgram& initDrawP); + virtual void edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) override; + virtual void commit_edit_updates(const std::shared_ptr& comp, std::any& prevData) override; + virtual bool edit_update(const std::shared_ptr& comp) override; + virtual bool edit_gui(const std::shared_ptr& comp) override; +}; diff --git a/src/DrawingProgram/ImageTool.hpp b/src/DrawingProgram/ImageTool.hpp deleted file mode 100644 index 9074996..0000000 --- a/src/DrawingProgram/ImageTool.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#include -#include "../DrawData.hpp" -#include "../DrawComponents/DrawRectangle.hpp" -#include "../DrawComponents/DrawImage.hpp" -#include -#include - -class DrawingProgram; - -class ImageTool { - public: - ImageTool(DrawingProgram& initDrawP); - void edit_start(const std::shared_ptr& a, std::any& prevData); - void commit_edit_updates(const std::shared_ptr& a, std::any& prevData); - bool edit_update(const std::shared_ptr& a); - bool edit_gui(const std::shared_ptr& a); - private: - struct ImageControls { - } controls; - - DrawingProgram& drawP; -}; diff --git a/src/DrawingProgram/InkDropperTool.cpp b/src/DrawingProgram/InkDropperTool.cpp index 597a99c..5ef79b5 100644 --- a/src/DrawingProgram/InkDropperTool.cpp +++ b/src/DrawingProgram/InkDropperTool.cpp @@ -3,6 +3,7 @@ #include "../Server/CommandList.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include #include #include @@ -21,10 +22,14 @@ #include InkDropperTool::InkDropperTool(DrawingProgram& initDrawP): - drawP(initDrawP) + DrawingProgramToolBase(initDrawP) { } +DrawingProgramToolType InkDropperTool::get_type() { + return DrawingProgramToolType::INKDROPPER; +} + void InkDropperTool::gui_toolbox() { Toolbar& t = drawP.world.main.toolbar; t.gui.push_id("Color select tool"); @@ -79,3 +84,6 @@ bool InkDropperTool::prevent_undo_or_redo() { void InkDropperTool::draw(SkCanvas* canvas, const DrawData& drawData) { } + +void InkDropperTool::reset_tool() { +} diff --git a/src/DrawingProgram/InkDropperTool.hpp b/src/DrawingProgram/InkDropperTool.hpp index 30de4cc..3403a71 100644 --- a/src/DrawingProgram/InkDropperTool.hpp +++ b/src/DrawingProgram/InkDropperTool.hpp @@ -1,18 +1,15 @@ #pragma once -#include -#include "../DrawData.hpp" -#include +#include "DrawingProgramToolBase.hpp" class DrawingProgram; -class InkDropperTool { +class InkDropperTool : public DrawingProgramToolBase { public: InkDropperTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void draw(SkCanvas* canvas, const DrawData& drawData); - bool prevent_undo_or_redo(); - private: - - DrawingProgram& drawP; + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual bool prevent_undo_or_redo() override; + virtual void reset_tool() override; }; diff --git a/src/DrawingProgram/LassoSelectTool.cpp b/src/DrawingProgram/LassoSelectTool.cpp index e156e7f..0c1ef8f 100644 --- a/src/DrawingProgram/LassoSelectTool.cpp +++ b/src/DrawingProgram/LassoSelectTool.cpp @@ -2,6 +2,7 @@ #include "DrawingProgram.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include "Helpers/MathExtras.hpp" #include "Helpers/SCollision.hpp" #include "../CoordSpaceHelper.hpp" @@ -29,8 +30,11 @@ struct nth<1, Vector2f> { } // namespace mapbox LassoSelectTool::LassoSelectTool(DrawingProgram& initDrawP): - drawP(initDrawP) -{ + DrawingProgramToolBase(initDrawP) +{} + +DrawingProgramToolType LassoSelectTool::get_type() { + return DrawingProgramToolType::LASSOSELECT; } void LassoSelectTool::gui_toolbox() { diff --git a/src/DrawingProgram/LassoSelectTool.hpp b/src/DrawingProgram/LassoSelectTool.hpp index d6ad1d8..5ba00df 100644 --- a/src/DrawingProgram/LassoSelectTool.hpp +++ b/src/DrawingProgram/LassoSelectTool.hpp @@ -4,18 +4,20 @@ #include #include "../CoordSpaceHelper.hpp" #include "../DrawComponents/DrawComponent.hpp" +#include "DrawingProgramToolBase.hpp" class DrawingProgram; -class LassoSelectTool { +class LassoSelectTool : public DrawingProgramToolBase { public: LassoSelectTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void draw(SkCanvas* canvas, const DrawData& drawData); - void reset_tool(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual void reset_tool() override; + virtual bool prevent_undo_or_redo() override; - bool prevent_undo_or_redo(); private: struct LassoSelectControls { int selectionMode = 0; @@ -24,6 +26,4 @@ class LassoSelectTool { std::vector lassoPoints; } controls; - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/RectDrawEditTool.cpp b/src/DrawingProgram/RectDrawEditTool.cpp new file mode 100644 index 0000000..4ee0098 --- /dev/null +++ b/src/DrawingProgram/RectDrawEditTool.cpp @@ -0,0 +1,79 @@ +#include "RectDrawEditTool.hpp" +#include "DrawingProgram.hpp" +#include "../World.hpp" +#include "../MainProgram.hpp" +#include +#include "EditTool.hpp" + +RectDrawEditTool::RectDrawEditTool(DrawingProgram& initDrawP): + DrawingProgramEditToolBase(initDrawP) +{} + +bool RectDrawEditTool::edit_gui(const std::shared_ptr& comp) { + std::shared_ptr a = std::static_pointer_cast(comp); + Toolbar& t = drawP.world.main.toolbar; + t.gui.push_id("edit tool rectangle"); + t.gui.text_label_centered("Edit Rectangle"); + t.gui.slider_scalar_field("relradiuswidth", "Corner Radius", &a->d.cornerRadius, 0.0f, 40.0f); + if(t.gui.radio_button_field("fillonly", "Fill only", a->d.fillStrokeMode == 0)) a->d.fillStrokeMode = 0; + if(t.gui.radio_button_field("outlineonly", "Outline only", a->d.fillStrokeMode == 1)) a->d.fillStrokeMode = 1; + if(t.gui.radio_button_field("filloutline", "Fill and Outline", a->d.fillStrokeMode == 2)) a->d.fillStrokeMode = 2; + if(a->d.fillStrokeMode == 0 || a->d.fillStrokeMode == 2) { + t.gui.left_to_right_line_layout([&]() { + CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { + if(t.gui.color_button("Fill Color", &a->d.fillColor, &a->d.fillColor == t.colorRight)) + t.color_selector_right(&a->d.fillColor == t.colorRight ? nullptr : &a->d.fillColor); + } + t.gui.text_label("Fill Color"); + }); + } + if(a->d.fillStrokeMode == 1 || a->d.fillStrokeMode == 2) { + t.gui.slider_scalar_field("relstrokewidth", "Outline Size", &a->d.strokeWidth, 3.0f, 40.0f); + t.gui.left_to_right_line_layout([&]() { + CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { + if(t.gui.color_button("Outline Color", &a->d.strokeColor, &a->d.strokeColor == t.colorRight)) + t.color_selector_right(&a->d.strokeColor == t.colorRight ? nullptr : &a->d.strokeColor); + } + t.gui.text_label("Outline Color"); + }); + } + t.gui.pop_id(); + + bool editHappened = a->d != oldData; + oldData = a->d; + return editHappened; +} + +void RectDrawEditTool::edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) { + std::shared_ptr a = std::static_pointer_cast(comp); + prevData = a->d; + editTool.add_point_handle({&a->d.p1, nullptr, &a->d.p2}); + editTool.add_point_handle({&a->d.p2, &a->d.p1, nullptr}); +} + +void RectDrawEditTool::commit_edit_updates(const std::shared_ptr& comp, std::any& prevData) { + std::shared_ptr a = std::static_pointer_cast(comp); + + DrawRectangle::Data pData = std::any_cast(prevData); + DrawRectangle::Data cData = a->d; + drawP.world.undo.push(UndoManager::UndoRedoPair{ + [&, a, pData]() { + a->d = pData; + a->client_send_update(drawP); + a->commit_update(drawP); + drawP.reset_tools(); + return true; + }, + [&, a, cData]() { + a->d = cData; + a->client_send_update(drawP); + a->commit_update(drawP); + drawP.reset_tools(); + return true; + } + }); +} + +bool RectDrawEditTool::edit_update(const std::shared_ptr& comp) { + return true; +} diff --git a/src/DrawingProgram/RectDrawEditTool.hpp b/src/DrawingProgram/RectDrawEditTool.hpp new file mode 100644 index 0000000..f32118c --- /dev/null +++ b/src/DrawingProgram/RectDrawEditTool.hpp @@ -0,0 +1,18 @@ +#pragma once +#include "DrawingProgramEditToolBase.hpp" +#include "../DrawComponents/DrawRectangle.hpp" +#include +#include + +class DrawingProgram; + +class RectDrawEditTool : public DrawingProgramEditToolBase { + public: + RectDrawEditTool(DrawingProgram& initDrawP); + virtual void edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) override; + virtual void commit_edit_updates(const std::shared_ptr& comp, std::any& prevData) override; + virtual bool edit_update(const std::shared_ptr& comp) override; + virtual bool edit_gui(const std::shared_ptr& comp) override; + private: + DrawRectangle::Data oldData; +}; diff --git a/src/DrawingProgram/RectDrawTool.cpp b/src/DrawingProgram/RectDrawTool.cpp index 5b75a08..55e907b 100644 --- a/src/DrawingProgram/RectDrawTool.cpp +++ b/src/DrawingProgram/RectDrawTool.cpp @@ -1,17 +1,18 @@ #include "RectDrawTool.hpp" #include "DrawingProgram.hpp" -#include "../Server/CommandList.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" -#include "Helpers/SCollision.hpp" -#include "Helpers/Serializers.hpp" -#include "../SharedTypes.hpp" +#include "DrawingProgramToolBase.hpp" #include RectDrawTool::RectDrawTool(DrawingProgram& initDrawP): - drawP(initDrawP) + DrawingProgramToolBase(initDrawP) {} +DrawingProgramToolType RectDrawTool::get_type() { + return DrawingProgramToolType::RECTANGLE; +} + void RectDrawTool::gui_toolbox() { Toolbar& t = drawP.world.main.toolbar; t.gui.push_id("rect draw tool"); @@ -25,76 +26,11 @@ void RectDrawTool::gui_toolbox() { t.gui.pop_id(); } -bool RectDrawTool::edit_gui(const std::shared_ptr& a) { - Toolbar& t = drawP.world.main.toolbar; - t.gui.push_id("edit tool rectangle"); - t.gui.text_label_centered("Edit Rectangle"); - t.gui.slider_scalar_field("relradiuswidth", "Corner Radius", &a->d.cornerRadius, 0.0f, 40.0f); - if(t.gui.radio_button_field("fillonly", "Fill only", a->d.fillStrokeMode == 0)) a->d.fillStrokeMode = 0; - if(t.gui.radio_button_field("outlineonly", "Outline only", a->d.fillStrokeMode == 1)) a->d.fillStrokeMode = 1; - if(t.gui.radio_button_field("filloutline", "Fill and Outline", a->d.fillStrokeMode == 2)) a->d.fillStrokeMode = 2; - if(a->d.fillStrokeMode == 0 || a->d.fillStrokeMode == 2) { - t.gui.left_to_right_line_layout([&]() { - CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { - if(t.gui.color_button("Fill Color", &a->d.fillColor, &a->d.fillColor == t.colorRight)) - t.color_selector_right(&a->d.fillColor == t.colorRight ? nullptr : &a->d.fillColor); - } - t.gui.text_label("Fill Color"); - }); - } - if(a->d.fillStrokeMode == 1 || a->d.fillStrokeMode == 2) { - t.gui.slider_scalar_field("relstrokewidth", "Outline Size", &a->d.strokeWidth, 3.0f, 40.0f); - t.gui.left_to_right_line_layout([&]() { - CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { - if(t.gui.color_button("Outline Color", &a->d.strokeColor, &a->d.strokeColor == t.colorRight)) - t.color_selector_right(&a->d.strokeColor == t.colorRight ? nullptr : &a->d.strokeColor); - } - t.gui.text_label("Outline Color"); - }); - } - t.gui.pop_id(); - - bool editHappened = a->d != controls.oldData; - controls.oldData = a->d; - return editHappened; -} - void RectDrawTool::reset_tool() { commit_rectangle(); controls.drawStage = 0; } -void RectDrawTool::edit_start(const std::shared_ptr& a, std::any& prevData) { - prevData = a->d; - drawP.editTool.add_point_handle({&a->d.p1, nullptr, &a->d.p2}); - drawP.editTool.add_point_handle({&a->d.p2, &a->d.p1, nullptr}); -} - -void RectDrawTool::commit_edit_updates(const std::shared_ptr& a, std::any& prevData) { - DrawRectangle::Data pData = std::any_cast(prevData); - DrawRectangle::Data cData = a->d; - drawP.world.undo.push(UndoManager::UndoRedoPair{ - [&, a, pData]() { - a->d = pData; - a->client_send_update(drawP); - a->commit_update(drawP); - drawP.reset_tools(); - return true; - }, - [&, a, cData]() { - a->d = cData; - a->client_send_update(drawP); - a->commit_update(drawP); - drawP.reset_tools(); - return true; - } - }); -} - -bool RectDrawTool::edit_update(const std::shared_ptr& a) { - return true; -} - void RectDrawTool::tool_update() { switch(controls.drawStage) { case 0: { diff --git a/src/DrawingProgram/RectDrawTool.hpp b/src/DrawingProgram/RectDrawTool.hpp index 385374d..42b6254 100644 --- a/src/DrawingProgram/RectDrawTool.hpp +++ b/src/DrawingProgram/RectDrawTool.hpp @@ -1,37 +1,28 @@ #pragma once -#include -#include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include "../DrawComponents/DrawRectangle.hpp" #include #include class DrawingProgram; -class RectDrawTool { +class RectDrawTool : public DrawingProgramToolBase { public: RectDrawTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void reset_tool(); - void draw(SkCanvas* canvas, const DrawData& drawData); - - void edit_start(const std::shared_ptr& a, std::any& prevData); - void commit_edit_updates(const std::shared_ptr& a, std::any& prevData); - bool edit_update(const std::shared_ptr& a); - bool edit_gui(const std::shared_ptr& a); - - bool prevent_undo_or_redo(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void reset_tool() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual bool prevent_undo_or_redo() override; private: void commit_rectangle(); struct RectDrawControls { - DrawRectangle::Data oldData; Vector2f startAt; float relativeRadiusWidth = 10.0f; int fillStrokeMode = 1; int drawStage = 0; std::shared_ptr intermediateItem; } controls; - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/RectSelectTool.cpp b/src/DrawingProgram/RectSelectTool.cpp index 886050c..f9c3256 100644 --- a/src/DrawingProgram/RectSelectTool.cpp +++ b/src/DrawingProgram/RectSelectTool.cpp @@ -2,15 +2,20 @@ #include "DrawingProgram.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include "Helpers/MathExtras.hpp" #include "Helpers/SCollision.hpp" #include "../CoordSpaceHelper.hpp" RectSelectTool::RectSelectTool(DrawingProgram& initDrawP): - drawP(initDrawP) + DrawingProgramToolBase(initDrawP) { } +DrawingProgramToolType RectSelectTool::get_type() { + return DrawingProgramToolType::RECTSELECT; +} + void RectSelectTool::gui_toolbox() { drawP.world.main.toolbar.gui.text_label_centered("Rectangle Select"); } diff --git a/src/DrawingProgram/RectSelectTool.hpp b/src/DrawingProgram/RectSelectTool.hpp index f7f1ba7..6391736 100644 --- a/src/DrawingProgram/RectSelectTool.hpp +++ b/src/DrawingProgram/RectSelectTool.hpp @@ -1,31 +1,26 @@ #pragma once -#include -#include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include #include "../CoordSpaceHelper.hpp" #include "../DrawComponents/DrawComponent.hpp" class DrawingProgram; -class RectSelectTool { +class RectSelectTool : public DrawingProgramToolBase { public: RectSelectTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void draw(SkCanvas* canvas, const DrawData& drawData); - void reset_tool(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual void reset_tool() override; + virtual bool prevent_undo_or_redo() override; - bool prevent_undo_or_redo(); private: struct RectSelectControls { int selectionMode = 0; - CoordSpaceHelper coords; - Vector2f selectStartAt; - std::array newT; } controls; - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/ScreenshotTool.cpp b/src/DrawingProgram/ScreenshotTool.cpp index 05eaee8..bcc93b2 100644 --- a/src/DrawingProgram/ScreenshotTool.cpp +++ b/src/DrawingProgram/ScreenshotTool.cpp @@ -3,6 +3,7 @@ #include "../Server/CommandList.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include "Helpers/SCollision.hpp" #include #include @@ -37,8 +38,11 @@ #define AA_LEVEL 4 ScreenshotTool::ScreenshotTool(DrawingProgram& initDrawP): - drawP(initDrawP) -{ + DrawingProgramToolBase(initDrawP) +{} + +DrawingProgramToolType ScreenshotTool::get_type() { + return DrawingProgramToolType::SCREENSHOT; } void ScreenshotTool::gui_toolbox() { @@ -74,10 +78,11 @@ void ScreenshotTool::gui_toolbox() { setExtensionFilter = {"WebP", "webp"}; t.open_file_selector("Export", {setExtensionFilter}, [setExtensionFilter, w = make_weak_ptr(drawP.world.main.world)](const std::filesystem::path& p, const auto& e) { auto world = w.lock(); - if(world) { - world->drawProg.screenshotTool.controls.screenshotSavePath = force_extension_on_path(p, setExtensionFilter.extensions); - world->drawProg.screenshotTool.controls.setToTakeScreenshot = true; - } + // NOTE: CHANGE THIS + //if(world) { + // world->drawProg.screenshotTool.controls.screenshotSavePath = force_extension_on_path(p, setExtensionFilter.extensions); + // world->drawProg.screenshotTool.controls.setToTakeScreenshot = true; + //} }, "screenshot", true); #endif } diff --git a/src/DrawingProgram/ScreenshotTool.hpp b/src/DrawingProgram/ScreenshotTool.hpp index b24d637..bf6978e 100644 --- a/src/DrawingProgram/ScreenshotTool.hpp +++ b/src/DrawingProgram/ScreenshotTool.hpp @@ -1,6 +1,5 @@ #pragma once -#include -#include "../DrawData.hpp" +#include "DrawingProgramToolBase.hpp" #include #include #include "../InputManager.hpp" @@ -8,14 +7,15 @@ class DrawingProgram; -class ScreenshotTool { +class ScreenshotTool : public DrawingProgramToolBase { public: ScreenshotTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void draw(SkCanvas* canvas, const DrawData& drawData); - void reset_tool(); - bool prevent_undo_or_redo(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual void reset_tool() override; + virtual bool prevent_undo_or_redo() override; private: void commit_rect(); void take_screenshot(const std::filesystem::path& filePath); @@ -52,6 +52,4 @@ class ScreenshotTool { std::atomic setToTakeScreenshot = false; std::filesystem::path screenshotSavePath; } controls; - - DrawingProgram& drawP; }; diff --git a/src/DrawingProgram/TextBoxEditTool.cpp b/src/DrawingProgram/TextBoxEditTool.cpp new file mode 100644 index 0000000..b19ad57 --- /dev/null +++ b/src/DrawingProgram/TextBoxEditTool.cpp @@ -0,0 +1,210 @@ +#include "TextBoxEditTool.hpp" +#include "DrawingProgram.hpp" +#include "../MainProgram.hpp" +#include "../DrawData.hpp" +#include "Helpers/SCollision.hpp" +#include "../CollabTextBox/CollabTextBox.hpp" +#include +#include +#include "EditTool.hpp" + +TextBoxEditTool::TextBoxEditTool(DrawingProgram& initDrawP): + DrawingProgramEditToolBase(initDrawP) +{} + +bool TextBoxEditTool::edit_gui(const std::shared_ptr& comp) { + std::shared_ptr a = std::static_pointer_cast(comp); + Toolbar& t = drawP.world.main.toolbar; + t.gui.push_id("edit tool text"); + t.gui.text_label_centered("Edit Text"); + t.gui.slider_scalar_field("Text Relative Size", "Text Size", &a->d.textSize, 5.0f, 100.0f); + t.gui.left_to_right_line_layout([&]() { + CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { + if(t.gui.color_button("Text Color", &a->d.textColor, &a->d.textColor == t.colorRight)) + t.color_selector_right(&a->d.textColor == t.colorRight ? nullptr : &a->d.textColor); + } + t.gui.text_label("Text Color"); + }); + t.gui.pop_id(); + bool editHappened = a->d != oldData; + oldData = a->d; + return editHappened; +} + +void TextBoxEditTool::commit_edit_updates(const std::shared_ptr& comp, std::any& prevData) { + std::shared_ptr a = std::static_pointer_cast(comp); + + a->d.editing = false; + DrawTextBox::Data pData = std::any_cast(prevData); + DrawTextBox::Data cData = a->d; + drawP.world.undo.push(UndoManager::UndoRedoPair{ + [&, a, pData]() { + a->d = pData; + a->set_textbox_string(pData.currentText); + a->d.editing = false; + a->client_send_update(drawP); + a->commit_update(drawP); + drawP.reset_tools(); + return true; + }, + [&, a, cData]() { + a->d = cData; + a->set_textbox_string(cData.currentText); + a->d.editing = false; + a->client_send_update(drawP); + a->commit_update(drawP); + drawP.reset_tools(); + return true; + } + }); +} + +void TextBoxEditTool::edit_start(EditTool& editTool, const std::shared_ptr& comp, std::any& prevData) { + std::shared_ptr a = std::static_pointer_cast(comp); + auto& cur = a->d.cursor; + auto& textbox = a->textBox; + Vector2f textSelectPos = a->get_mouse_pos(drawP); + SkIPoint p = convert_vec2(textSelectPos.cast()); + cur.pos = cur.selectionBeginPos = cur.selectionEndPos = textbox.getPosition(p); + prevData = a->d; + a->d.editing = true; + a->client_send_update(drawP); + editTool.add_point_handle({&a->d.p1, nullptr, &a->d.p2}); + editTool.add_point_handle({&a->d.p2, &a->d.p1, nullptr}); +} + +bool TextBoxEditTool::edit_update(const std::shared_ptr& comp) { + std::shared_ptr a = std::static_pointer_cast(comp); + + SCollision::ColliderCollection mousePointCollection; + mousePointCollection.circle.emplace_back(drawP.world.main.input.mouse.pos, 1.0f); + mousePointCollection.recalculate_bounds(); + + a->textBox.setWidth(std::abs(a->d.p2.x() - a->d.p1.x())); + + InputManager& input = drawP.world.main.input; + auto& textbox = a->textBox; + auto& cur = a->d.cursor; + + bool moved = false; + bool movedHeld = false; + + bool collidesWithBox = false; + if(a->collides_with_cam_coords(drawP.world.drawData.cam.c, mousePointCollection)) { + //drawP.world.main.input.cursorIcon = InputManager::SystemCursorType::TEXT; + collidesWithBox = true; + } + + if(drawP.controls.leftClick) { + if(collidesWithBox) { + Vector2f textSelectPos = a->get_mouse_pos(drawP); + SkIPoint p = convert_vec2(textSelectPos.cast()); + cur.pos = cur.selectionBeginPos = textbox.getPosition(p); + moved = true; + } + } + else if(drawP.controls.leftClickHeld) { + if(collidesWithBox) { + Vector2f textSelectPos = a->get_mouse_pos(drawP); + SkIPoint p = convert_vec2(textSelectPos.cast()); + cur.pos = cur.selectionBeginPos = textbox.getPosition(p); + } + movedHeld = true; + } + + + if(input.key(InputManager::KEY_TEXT_LEFT).repeat) + cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kLeft, cur.selectionBeginPos); + if(input.key(InputManager::KEY_TEXT_RIGHT).repeat) + cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kRight, cur.selectionBeginPos); + if(input.key(InputManager::KEY_TEXT_UP).repeat) + cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kUp, cur.selectionBeginPos); + if(input.key(InputManager::KEY_TEXT_DOWN).repeat) + cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kDown, cur.selectionBeginPos); + if(input.key(InputManager::KEY_TEXT_HOME).repeat) + cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kHome, cur.selectionBeginPos); + + moved = moved || input.key(InputManager::KEY_TEXT_DOWN).repeat || input.key(InputManager::KEY_TEXT_UP).repeat || input.key(InputManager::KEY_TEXT_RIGHT).repeat || input.key(InputManager::KEY_TEXT_LEFT).repeat || input.key(InputManager::KEY_TEXT_HOME).repeat; + if(moved && !input.key(InputManager::KEY_TEXT_SHIFT).held && !movedHeld) + cur.selectionEndPos = cur.selectionBeginPos; + + if(moved || movedHeld) + update_textbox_network(a); + + if(input.key(InputManager::KEY_TEXT_BACKSPACE).repeat) { + edit_text([&]() { + if(cur.selectionBeginPos != cur.selectionEndPos) + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); + else + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.pos, textbox.move(CollabTextBox::Movement::kLeft, cur.pos)); + }, a); + } + if(input.key(InputManager::KEY_TEXT_DELETE).repeat) { + edit_text([&]() { + if(cur.selectionBeginPos != cur.selectionEndPos) + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); + else + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.pos, textbox.move(CollabTextBox::Movement::kRight, cur.pos)); + }, a); + } + if(input.get_clipboard_paste_happened()) { + edit_text([&]() { + if(cur.selectionBeginPos != cur.selectionEndPos) + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); + std::string clipboard = input.get_clipboard_str(); + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.insert(cur.pos, clipboard); + }, a); + } + if(input.key(InputManager::KEY_TEXT_ENTER).repeat) { + edit_text([&]() { + if(cur.selectionBeginPos != cur.selectionEndPos) + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); + cur.pos = textbox.insert(cur.pos, "\n"); + cur.pos.fParagraphIndex++; + cur.pos.fTextByteIndex = 0; + cur.selectionBeginPos = cur.selectionEndPos = cur.pos; + }, a); + } + if(input.key(InputManager::KEY_TEXT_COPY).repeat) { + std::string clipboardData = textbox.copy(cur.selectionBeginPos, cur.selectionEndPos); + input.set_clipboard_str(clipboardData); + } + if(input.key(InputManager::KEY_TEXT_CUT).repeat) { + edit_text([&]() { + std::string clipboardData = textbox.copy(cur.selectionBeginPos, cur.selectionEndPos); + input.set_clipboard_str(clipboardData); + if(cur.selectionBeginPos != cur.selectionEndPos) + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); + }, a); + } + if(input.key(InputManager::KEY_TEXT_SELECTALL).repeat) { + cur.selectionEndPos.fParagraphIndex = textbox.lineCount() == 0 ? 0 : textbox.lineCount() - 1; + cur.selectionEndPos.fTextByteIndex = textbox.line(cur.selectionEndPos.fParagraphIndex).size(); + cur.pos = cur.selectionEndPos; + cur.selectionBeginPos.fTextByteIndex = 0; + cur.selectionBeginPos.fParagraphIndex = 0; + update_textbox_network(a); + } + if(!input.text.newInput.empty()) { + edit_text([&]() { + if(cur.selectionBeginPos != cur.selectionEndPos) + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); + cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.insert(cur.pos, input.text.newInput); + }, a); + } + + input.text.set_accepting_input(); + return true; +} + +// Passing a function in, just in case we have to do something before editing the text +void TextBoxEditTool::edit_text(std::function toRun, const std::shared_ptr& textBox) { + toRun(); + textBox->update_contained_string(drawP); + update_textbox_network(textBox); +} + +void TextBoxEditTool::update_textbox_network(const std::shared_ptr& textBox) { + textBox->client_send_update(drawP); + textBox->commit_update(drawP); +} diff --git a/src/DrawingProgram/TextBoxEditTool.hpp b/src/DrawingProgram/TextBoxEditTool.hpp new file mode 100644 index 0000000..8b0eee3 --- /dev/null +++ b/src/DrawingProgram/TextBoxEditTool.hpp @@ -0,0 +1,22 @@ +#pragma once +#include "../DrawComponents/DrawTextBox.hpp" +#include "DrawingProgramEditToolBase.hpp" +#include +#include + +class DrawingProgram; + +class TextBoxEditTool : public DrawingProgramEditToolBase { + public: + TextBoxEditTool(DrawingProgram& initDrawP); + + virtual void edit_start(EditTool& editTool, const std::shared_ptr& a, std::any& prevData) override; + virtual void commit_edit_updates(const std::shared_ptr& a, std::any& prevData) override; + virtual bool edit_update(const std::shared_ptr& a) override; + virtual bool edit_gui(const std::shared_ptr& a) override; + private: + void edit_text(std::function toRun, const std::shared_ptr& textBox); + void update_textbox_network(const std::shared_ptr& textBox); + + DrawTextBox::Data oldData; +}; diff --git a/src/DrawingProgram/TextBoxTool.cpp b/src/DrawingProgram/TextBoxTool.cpp index d55441b..ff71fd2 100644 --- a/src/DrawingProgram/TextBoxTool.cpp +++ b/src/DrawingProgram/TextBoxTool.cpp @@ -1,21 +1,20 @@ #include "TextBoxTool.hpp" #include #include "DrawingProgram.hpp" -#include "../Server/CommandList.hpp" #include "../MainProgram.hpp" #include "../DrawData.hpp" #include "Helpers/MathExtras.hpp" #include "Helpers/SCollision.hpp" -#include "Helpers/Serializers.hpp" #include "../CollabTextBox/CollabTextBox.hpp" -#include "../SharedTypes.hpp" #include #include -#include TextBoxTool::TextBoxTool(DrawingProgram& initDrawP): - drawP(initDrawP) -{ + DrawingProgramToolBase(initDrawP) +{} + +DrawingProgramToolType TextBoxTool::get_type() { + return DrawingProgramToolType::TEXTBOX; } void TextBoxTool::gui_toolbox() { @@ -31,188 +30,6 @@ void TextBoxTool::reset_tool() { controls.drawStage = 0; } -bool TextBoxTool::edit_gui(const std::shared_ptr& a) { - Toolbar& t = drawP.world.main.toolbar; - t.gui.push_id("edit tool text"); - t.gui.text_label_centered("Edit Text"); - t.gui.slider_scalar_field("Text Relative Size", "Text Size", &a->d.textSize, 5.0f, 100.0f); - t.gui.left_to_right_line_layout([&]() { - CLAY({.layout = {.sizing = {.width = CLAY_SIZING_FIXED(40), .height = CLAY_SIZING_FIXED(40)}}}) { - if(t.gui.color_button("Text Color", &a->d.textColor, &a->d.textColor == t.colorRight)) - t.color_selector_right(&a->d.textColor == t.colorRight ? nullptr : &a->d.textColor); - } - t.gui.text_label("Text Color"); - }); - t.gui.pop_id(); - bool editHappened = a->d != controls.oldData; - controls.oldData = a->d; - return editHappened; -} - -void TextBoxTool::commit_edit_updates(const std::shared_ptr& a, std::any& prevData) { - a->d.editing = false; - DrawTextBox::Data pData = std::any_cast(prevData); - DrawTextBox::Data cData = a->d; - drawP.world.undo.push(UndoManager::UndoRedoPair{ - [&, a, pData]() { - a->d = pData; - a->set_textbox_string(pData.currentText); - a->d.editing = false; - a->client_send_update(drawP); - a->commit_update(drawP); - drawP.reset_tools(); - return true; - }, - [&, a, cData]() { - a->d = cData; - a->set_textbox_string(cData.currentText); - a->d.editing = false; - a->client_send_update(drawP); - a->commit_update(drawP); - drawP.reset_tools(); - return true; - } - }); -} - -void TextBoxTool::edit_start(const std::shared_ptr& a, std::any& prevData) { - auto& cur = a->d.cursor; - auto& textbox = a->textBox; - Vector2f textSelectPos = a->get_mouse_pos(drawP); - SkIPoint p = convert_vec2(textSelectPos.cast()); - cur.pos = cur.selectionBeginPos = cur.selectionEndPos = textbox.getPosition(p); - prevData = a->d; - a->d.editing = true; - a->client_send_update(drawP); - drawP.editTool.add_point_handle({&a->d.p1, nullptr, &a->d.p2}); - drawP.editTool.add_point_handle({&a->d.p2, &a->d.p1, nullptr}); -} - -bool TextBoxTool::edit_update(const std::shared_ptr& a) { - SCollision::ColliderCollection mousePointCollection; - mousePointCollection.circle.emplace_back(drawP.world.main.input.mouse.pos, 1.0f); - mousePointCollection.recalculate_bounds(); - - a->textBox.setWidth(std::abs(a->d.p2.x() - a->d.p1.x())); - - InputManager& input = drawP.world.main.input; - auto& textbox = a->textBox; - auto& cur = a->d.cursor; - - bool moved = false; - bool movedHeld = false; - - bool collidesWithBox = false; - if(a->collides_with_cam_coords(drawP.world.drawData.cam.c, mousePointCollection)) { - //drawP.world.main.input.cursorIcon = InputManager::SystemCursorType::TEXT; - collidesWithBox = true; - } - - if(drawP.controls.leftClick) { - if(collidesWithBox) { - Vector2f textSelectPos = a->get_mouse_pos(drawP); - SkIPoint p = convert_vec2(textSelectPos.cast()); - cur.pos = cur.selectionBeginPos = textbox.getPosition(p); - moved = true; - } - } - else if(drawP.controls.leftClickHeld) { - if(collidesWithBox) { - Vector2f textSelectPos = a->get_mouse_pos(drawP); - SkIPoint p = convert_vec2(textSelectPos.cast()); - cur.pos = cur.selectionBeginPos = textbox.getPosition(p); - } - movedHeld = true; - } - - - if(input.key(InputManager::KEY_DRAW_UNSELECT).repeat) - reset_tool(); - - if(input.key(InputManager::KEY_TEXT_LEFT).repeat) - cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kLeft, cur.selectionBeginPos); - if(input.key(InputManager::KEY_TEXT_RIGHT).repeat) - cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kRight, cur.selectionBeginPos); - if(input.key(InputManager::KEY_TEXT_UP).repeat) - cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kUp, cur.selectionBeginPos); - if(input.key(InputManager::KEY_TEXT_DOWN).repeat) - cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kDown, cur.selectionBeginPos); - if(input.key(InputManager::KEY_TEXT_HOME).repeat) - cur.pos = cur.selectionBeginPos = textbox.move(CollabTextBox::Movement::kHome, cur.selectionBeginPos); - - moved = moved || input.key(InputManager::KEY_TEXT_DOWN).repeat || input.key(InputManager::KEY_TEXT_UP).repeat || input.key(InputManager::KEY_TEXT_RIGHT).repeat || input.key(InputManager::KEY_TEXT_LEFT).repeat || input.key(InputManager::KEY_TEXT_HOME).repeat; - if(moved && !input.key(InputManager::KEY_TEXT_SHIFT).held && !movedHeld) - cur.selectionEndPos = cur.selectionBeginPos; - - if(moved || movedHeld) - update_textbox_network(a); - - if(input.key(InputManager::KEY_TEXT_BACKSPACE).repeat) { - edit_text([&]() { - if(cur.selectionBeginPos != cur.selectionEndPos) - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); - else - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.pos, textbox.move(CollabTextBox::Movement::kLeft, cur.pos)); - }, a); - } - if(input.key(InputManager::KEY_TEXT_DELETE).repeat) { - edit_text([&]() { - if(cur.selectionBeginPos != cur.selectionEndPos) - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); - else - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.pos, textbox.move(CollabTextBox::Movement::kRight, cur.pos)); - }, a); - } - if(input.get_clipboard_paste_happened()) { - edit_text([&]() { - if(cur.selectionBeginPos != cur.selectionEndPos) - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); - std::string clipboard = input.get_clipboard_str(); - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.insert(cur.pos, clipboard); - }, a); - } - if(input.key(InputManager::KEY_TEXT_ENTER).repeat) { - edit_text([&]() { - if(cur.selectionBeginPos != cur.selectionEndPos) - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); - cur.pos = textbox.insert(cur.pos, "\n"); - cur.pos.fParagraphIndex++; - cur.pos.fTextByteIndex = 0; - cur.selectionBeginPos = cur.selectionEndPos = cur.pos; - }, a); - } - if(input.key(InputManager::KEY_TEXT_COPY).repeat) { - std::string clipboardData = textbox.copy(cur.selectionBeginPos, cur.selectionEndPos); - input.set_clipboard_str(clipboardData); - } - if(input.key(InputManager::KEY_TEXT_CUT).repeat) { - edit_text([&]() { - std::string clipboardData = textbox.copy(cur.selectionBeginPos, cur.selectionEndPos); - input.set_clipboard_str(clipboardData); - if(cur.selectionBeginPos != cur.selectionEndPos) - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); - }, a); - } - if(input.key(InputManager::KEY_TEXT_SELECTALL).repeat) { - cur.selectionEndPos.fParagraphIndex = textbox.lineCount() == 0 ? 0 : textbox.lineCount() - 1; - cur.selectionEndPos.fTextByteIndex = textbox.line(cur.selectionEndPos.fParagraphIndex).size(); - cur.pos = cur.selectionEndPos; - cur.selectionBeginPos.fTextByteIndex = 0; - cur.selectionBeginPos.fParagraphIndex = 0; - update_textbox_network(a); - } - if(!input.text.newInput.empty()) { - edit_text([&]() { - if(cur.selectionBeginPos != cur.selectionEndPos) - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.remove(cur.selectionBeginPos, cur.selectionEndPos); - cur.selectionEndPos = cur.selectionBeginPos = cur.pos = textbox.insert(cur.pos, input.text.newInput); - }, a); - } - - input.text.set_accepting_input(); - return true; -} - void TextBoxTool::tool_update() { switch(controls.drawStage) { case 0: { @@ -248,9 +65,10 @@ void TextBoxTool::tool_update() { auto i = controls.intermediateItem; commit(); drawP.reset_tools(); - drawP.controls.selectedTool = DrawingProgram::TOOL_EDIT; - drawP.controls.previousSelected = DrawingProgram::TOOL_EDIT; - drawP.editTool.edit_start(i); + // NOTE: CHANGE THIS + //drawP.controls.selectedTool = DrawingProgram::TOOL_EDIT; + //drawP.controls.previousSelected = DrawingProgram::TOOL_EDIT; + //drawP.editTool.edit_start(i); } else { controls.intermediateItem->client_send_update(drawP); @@ -265,18 +83,6 @@ bool TextBoxTool::prevent_undo_or_redo() { return controls.intermediateItem != nullptr; } -// Passing a function in, just in case we have to do something before editing the text -void TextBoxTool::edit_text(std::function toRun, const std::shared_ptr& textBox) { - toRun(); - textBox->update_contained_string(drawP); - update_textbox_network(textBox); -} - -void TextBoxTool::update_textbox_network(const std::shared_ptr& textBox) { - textBox->client_send_update(drawP); - textBox->commit_update(drawP); -} - void TextBoxTool::commit() { if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) { controls.intermediateItem->client_send_update(drawP); diff --git a/src/DrawingProgram/TextBoxTool.hpp b/src/DrawingProgram/TextBoxTool.hpp index 720ddff..3e7fa95 100644 --- a/src/DrawingProgram/TextBoxTool.hpp +++ b/src/DrawingProgram/TextBoxTool.hpp @@ -1,26 +1,20 @@ #pragma once -#include -#include "../DrawData.hpp" #include "../DrawComponents/DrawTextBox.hpp" +#include "DrawingProgramToolBase.hpp" #include #include class DrawingProgram; -class TextBoxTool { +class TextBoxTool : public DrawingProgramToolBase { public: TextBoxTool(DrawingProgram& initDrawP); - void gui_toolbox(); - void tool_update(); - void draw(SkCanvas* canvas, const DrawData& drawData); - void reset_tool(); - - void edit_start(const std::shared_ptr& a, std::any& prevData); - void commit_edit_updates(const std::shared_ptr& a, std::any& prevData); - bool edit_update(const std::shared_ptr& a); - bool edit_gui(const std::shared_ptr& a); - - bool prevent_undo_or_redo(); + virtual DrawingProgramToolType get_type() override; + virtual void gui_toolbox() override; + virtual void tool_update() override; + virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; + virtual void reset_tool() override; + virtual bool prevent_undo_or_redo() override; private: void edit_text(std::function toRun, const std::shared_ptr& textBox); void update_textbox_network(const std::shared_ptr& textBox); @@ -32,8 +26,5 @@ class TextBoxTool { Vector2f endAt; int drawStage = 0; std::shared_ptr intermediateItem; - DrawTextBox::Data oldData; } controls; - - DrawingProgram& drawP; };