diff --git a/src/DrawingProgram/Tools/EllipseDrawTool.cpp b/src/DrawingProgram/Tools/EllipseDrawTool.cpp index 0f8d922..95dcfd6 100644 --- a/src/DrawingProgram/Tools/EllipseDrawTool.cpp +++ b/src/DrawingProgram/Tools/EllipseDrawTool.cpp @@ -31,26 +31,11 @@ void EllipseDrawTool::gui_toolbox() { t.gui.pop_id(); } -void EllipseDrawTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { - if(objInfoBeingEdited == erasedComp) - objInfoBeingEdited = nullptr; -} +void EllipseDrawTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { + if(button.button == InputManager::MouseButton::LEFT) { + if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited) { + auto& toolConfig = drawP.world.main.toolConfig; -bool EllipseDrawTool::right_click_popup_gui(Vector2f popupPos) { - Toolbar& t = drawP.world.main.toolbar; - t.paint_popup(popupPos); - return true; -} - -void EllipseDrawTool::switch_tool(DrawingProgramToolType newTool) { - commit(); -} - -void EllipseDrawTool::tool_update() { - auto& toolConfig = drawP.world.main.toolConfig; - - if(!objInfoBeingEdited) { - if(drawP.controls.leftClick && drawP.layerMan.is_a_layer_being_edited()) { auto relativeWidthResult = drawP.world.main.toolConfig.get_relative_width_stroke_size(drawP, drawP.world.drawData.cam.c.inverseScale); if(!relativeWidthResult.first.has_value()) { if(drawP.controls.leftClick) @@ -74,27 +59,46 @@ void EllipseDrawTool::tool_update() { objInfoBeingEdited = drawP.layerMan.add_component_to_layer_being_edited(newContainer); } - } - else { - if(drawP.controls.leftClickHeld) { - NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; - Vector2f newPos = containerPtr->coords.get_mouse_pos(drawP.world); - if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held) { - float height = std::fabs(startAt.y() - newPos.y()); - newPos.x() = startAt.x() + (((newPos.x() - startAt.x()) < 0.0f ? -1.0f : 1.0f) * height); - } - EllipseCanvasComponent& ellipse = static_cast(containerPtr->get_comp()); - ellipse.d.p1 = cwise_vec_min(startAt, newPos); - ellipse.d.p2 = cwise_vec_max(startAt, newPos); - ellipse.d.p2 = ensure_points_have_distance(ellipse.d.p1, ellipse.d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); - containerPtr->send_comp_update(drawP, false); - containerPtr->commit_update(drawP); - } - else + else if(!button.down && objInfoBeingEdited) commit(); } } +void EllipseDrawTool::input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { + if(objInfoBeingEdited) { + NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; + Vector2f newPos = containerPtr->coords.get_mouse_pos(drawP.world); + if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held) { + float height = std::fabs(startAt.y() - newPos.y()); + newPos.x() = startAt.x() + (((newPos.x() - startAt.x()) < 0.0f ? -1.0f : 1.0f) * height); + } + EllipseCanvasComponent& ellipse = static_cast(containerPtr->get_comp()); + ellipse.d.p1 = cwise_vec_min(startAt, newPos); + ellipse.d.p2 = cwise_vec_max(startAt, newPos); + ellipse.d.p2 = ensure_points_have_distance(ellipse.d.p1, ellipse.d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); + containerPtr->send_comp_update(drawP, false); + containerPtr->commit_update(drawP); + } +} + +void EllipseDrawTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { + if(objInfoBeingEdited == erasedComp) + objInfoBeingEdited = nullptr; +} + +bool EllipseDrawTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + +void EllipseDrawTool::switch_tool(DrawingProgramToolType newTool) { + commit(); +} + +void EllipseDrawTool::tool_update() { +} + bool EllipseDrawTool::prevent_undo_or_redo() { return objInfoBeingEdited; } diff --git a/src/DrawingProgram/Tools/EllipseDrawTool.hpp b/src/DrawingProgram/Tools/EllipseDrawTool.hpp index ca56d58..66b8a02 100644 --- a/src/DrawingProgram/Tools/EllipseDrawTool.hpp +++ b/src/DrawingProgram/Tools/EllipseDrawTool.hpp @@ -17,6 +17,8 @@ class EllipseDrawTool : public DrawingProgramToolBase { virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; + virtual void input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) override; + virtual void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) override; private: void commit(); diff --git a/src/DrawingProgram/Tools/EyeDropperTool.cpp b/src/DrawingProgram/Tools/EyeDropperTool.cpp index 615c48e..8baa425 100644 --- a/src/DrawingProgram/Tools/EyeDropperTool.cpp +++ b/src/DrawingProgram/Tools/EyeDropperTool.cpp @@ -12,12 +12,6 @@ #include #include #include -#ifdef USE_SKIA_BACKEND_GRAPHITE - #include -#elif USE_SKIA_BACKEND_GANESH - #include - #include -#endif #include EyeDropperTool::EyeDropperTool(DrawingProgram& initDrawP): @@ -45,30 +39,15 @@ bool EyeDropperTool::right_click_popup_gui(Vector2f popupPos) { return true; } -void EyeDropperTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { -} - -void EyeDropperTool::tool_update() { +void EyeDropperTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { auto& toolConfig = drawP.world.main.toolConfig; auto& selectingStrokeColor = drawP.world.main.toolConfig.eyeDropper.selectingStrokeColor; - if(drawP.controls.leftClick) { - SkSurfaceProps props; - sk_sp surface = drawP.world.main.create_native_surface(drawP.world.main.window.size, false); - SkCanvas* eyeDropperCanvas = surface->getCanvas(); - if(!eyeDropperCanvas) { - Logger::get().log("INFO", "Eye Dropper Tool could not make canvas"); - return; - } - int xPos = std::clamp(drawP.world.main.input.mouse.pos.x(), 0, drawP.world.main.window.size.x() - 1); - int yPos = std::clamp(drawP.world.main.input.mouse.pos.y(), 0, drawP.world.main.window.size.y() - 1); + if(button.button == InputManager::MouseButton::LEFT && button.down && !drawP.selection.is_being_transformed()) { + auto& surface = drawP.world.main.window.surface; - eyeDropperCanvas->save(); - DrawData d = drawP.world.drawData; - d.takingScreenshot = true; - drawP.world.main.draw(eyeDropperCanvas, drawP.world.main.world, d); - eyeDropperCanvas->restore(); - //drawP.world.main.window.ctx->flush(); + int xPos = std::clamp(button.pos.x(), 0, drawP.world.main.window.size.x() - 1); + int yPos = std::clamp(button.pos.y(), 0, drawP.world.main.window.size.y() - 1); Vector4 readData; SkImageInfo readDataInfo = SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); @@ -86,6 +65,12 @@ void EyeDropperTool::tool_update() { } } +void EyeDropperTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { +} + +void EyeDropperTool::tool_update() { +} + bool EyeDropperTool::prevent_undo_or_redo() { return false; } diff --git a/src/DrawingProgram/Tools/EyeDropperTool.hpp b/src/DrawingProgram/Tools/EyeDropperTool.hpp index ea8de8d..405c916 100644 --- a/src/DrawingProgram/Tools/EyeDropperTool.hpp +++ b/src/DrawingProgram/Tools/EyeDropperTool.hpp @@ -14,4 +14,5 @@ class EyeDropperTool : public DrawingProgramToolBase { virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; virtual void switch_tool(DrawingProgramToolType newTool) override; + virtual void input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) override; }; diff --git a/src/DrawingProgram/Tools/RectDrawTool.cpp b/src/DrawingProgram/Tools/RectDrawTool.cpp index 71ac547..4af7bcc 100644 --- a/src/DrawingProgram/Tools/RectDrawTool.cpp +++ b/src/DrawingProgram/Tools/RectDrawTool.cpp @@ -30,28 +30,13 @@ void RectDrawTool::gui_toolbox() { t.gui.pop_id(); } -void RectDrawTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { - if(objInfoBeingEdited == erasedComp) - objInfoBeingEdited = nullptr; -} +void RectDrawTool::input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) { + if(button.button == InputManager::MouseButton::LEFT) { + if(button.down && drawP.layerMan.is_a_layer_being_edited() && !objInfoBeingEdited) { + auto& toolConfig = drawP.world.main.toolConfig; + auto& fillStrokeMode = toolConfig.rectDraw.fillStrokeMode; + auto& relativeRadiusWidth = toolConfig.rectDraw.relativeRadiusWidth; -bool RectDrawTool::right_click_popup_gui(Vector2f popupPos) { - Toolbar& t = drawP.world.main.toolbar; - t.paint_popup(popupPos); - return true; -} - -void RectDrawTool::switch_tool(DrawingProgramToolType newTool) { - commit(); -} - -void RectDrawTool::tool_update() { - auto& toolConfig = drawP.world.main.toolConfig; - auto& fillStrokeMode = toolConfig.rectDraw.fillStrokeMode; - auto& relativeRadiusWidth = toolConfig.rectDraw.relativeRadiusWidth; - - if(!objInfoBeingEdited) { - if(drawP.controls.leftClick && drawP.layerMan.is_a_layer_being_edited()) { auto relativeWidthResult = drawP.world.main.toolConfig.get_relative_width_stroke_size(drawP, drawP.world.drawData.cam.c.inverseScale); auto relativeRadiusWidthResult = drawP.world.main.toolConfig.get_relative_width_from_value(drawP, drawP.world.drawData.cam.c.inverseScale, relativeRadiusWidth); if(!relativeWidthResult.first.has_value() || !relativeRadiusWidthResult.first.has_value()) { @@ -77,27 +62,46 @@ void RectDrawTool::tool_update() { newContainer->coords = drawP.world.drawData.cam.c; objInfoBeingEdited = drawP.layerMan.add_component_to_layer_being_edited(newContainer); } - } - else { - NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; - if(drawP.controls.leftClickHeld) { - Vector2f newPos = containerPtr->coords.get_mouse_pos(drawP.world); - if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held) { - float height = std::fabs(startAt.y() - newPos.y()); - newPos.x() = startAt.x() + (((newPos.x() - startAt.x()) < 0.0f ? -1.0f : 1.0f) * height); - } - RectangleCanvasComponent& rectangle = static_cast(containerPtr->get_comp()); - rectangle.d.p1 = cwise_vec_min(startAt, newPos); - rectangle.d.p2 = cwise_vec_max(startAt, newPos); - rectangle.d.p2 = ensure_points_have_distance(rectangle.d.p1, rectangle.d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); - containerPtr->send_comp_update(drawP, false); - containerPtr->commit_update(drawP); - } - else + else if(!button.down && objInfoBeingEdited) commit(); } } +void RectDrawTool::input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) { + if(objInfoBeingEdited) { + NetworkingObjects::NetObjOwnerPtr& containerPtr = objInfoBeingEdited->obj; + Vector2f newPos = containerPtr->coords.get_mouse_pos(drawP.world); + if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held) { + float height = std::fabs(startAt.y() - newPos.y()); + newPos.x() = startAt.x() + (((newPos.x() - startAt.x()) < 0.0f ? -1.0f : 1.0f) * height); + } + RectangleCanvasComponent& rectangle = static_cast(containerPtr->get_comp()); + rectangle.d.p1 = cwise_vec_min(startAt, newPos); + rectangle.d.p2 = cwise_vec_max(startAt, newPos); + rectangle.d.p2 = ensure_points_have_distance(rectangle.d.p1, rectangle.d.p2, MINIMUM_DISTANCE_BETWEEN_BOUNDS); + containerPtr->send_comp_update(drawP, false); + containerPtr->commit_update(drawP); + } +} + +void RectDrawTool::erase_component(CanvasComponentContainer::ObjInfo* erasedComp) { + if(objInfoBeingEdited == erasedComp) + objInfoBeingEdited = nullptr; +} + +bool RectDrawTool::right_click_popup_gui(Vector2f popupPos) { + Toolbar& t = drawP.world.main.toolbar; + t.paint_popup(popupPos); + return true; +} + +void RectDrawTool::switch_tool(DrawingProgramToolType newTool) { + commit(); +} + +void RectDrawTool::tool_update() { +} + bool RectDrawTool::prevent_undo_or_redo() { return objInfoBeingEdited; } diff --git a/src/DrawingProgram/Tools/RectDrawTool.hpp b/src/DrawingProgram/Tools/RectDrawTool.hpp index ca92384..3af6aa6 100644 --- a/src/DrawingProgram/Tools/RectDrawTool.hpp +++ b/src/DrawingProgram/Tools/RectDrawTool.hpp @@ -16,6 +16,8 @@ class RectDrawTool : public DrawingProgramToolBase { virtual void switch_tool(DrawingProgramToolType newTool) override; virtual void draw(SkCanvas* canvas, const DrawData& drawData) override; virtual bool prevent_undo_or_redo() override; + virtual void input_mouse_button_on_canvas_callback(const InputManager::MouseButtonCallbackArgs& button) override; + virtual void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) override; private: void commit();