From 12ef3b0416696e112502b3fd95592bf8c37f4ced Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Tue, 16 Sep 2025 17:10:18 +0300 Subject: [PATCH] Can now translate screenshot area in screenshot tool --- src/DrawingProgram/ScreenshotTool.cpp | 29 ++++++++++++++++++++++++--- src/DrawingProgram/ScreenshotTool.hpp | 3 +++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/DrawingProgram/ScreenshotTool.cpp b/src/DrawingProgram/ScreenshotTool.cpp index 3bb7e41..4178dbc 100644 --- a/src/DrawingProgram/ScreenshotTool.cpp +++ b/src/DrawingProgram/ScreenshotTool.cpp @@ -394,19 +394,42 @@ void ScreenshotTool::tool_update() { break; } - if(drawP.controls.cursorHoveringOverCanvas) + if(drawP.controls.cursorHoveringOverCanvas && drawP.controls.leftClick) { for(int i = 0; i < 8; i++) if(SCollision::collide(controls.circles[i], drawP.world.main.input.mouse.pos)) controls.dragType = i; - if(drawP.controls.leftClick) { + if(controls.dragType == -1) { + Vector2f mousePosScreenshotCoords = controls.coords.get_mouse_pos(drawP.world); + if(SCollision::collide(mousePosScreenshotCoords, SCollision::AABB({controls.rectX1, controls.rectY1}, {controls.rectX2, controls.rectY2}))) + controls.dragType = -2; + } + if(controls.dragType == -1) controls.selectionMode = 0; + else if(controls.dragType == -2) { + controls.translateBeginPos = drawP.world.get_mouse_world_pos(); + controls.translateBeginCoords = controls.coords; + controls.selectionMode = 3; + } else controls.selectionMode = 1; } break; } + case 3: { + controls.coords = controls.translateBeginCoords; + controls.coords.translate(drawP.world.get_mouse_world_pos() - controls.translateBeginPos); + if((drawP.world.drawData.cam.c.inverseScale << 8) < controls.coords.inverseScale || (drawP.world.drawData.cam.c.inverseScale >> 15) > controls.coords.inverseScale) { + controls.selectionMode = 0; + break; + } + if(!drawP.controls.leftClickHeld) { + controls.selectionMode = 2; + commit_rect(); + } + break; + } } } @@ -435,7 +458,7 @@ bool ScreenshotTool::prevent_undo_or_redo() { } void ScreenshotTool::draw(SkCanvas* canvas, const DrawData& drawData) { - if(controls.selectionMode == 1 || controls.selectionMode == 2) { + if(controls.selectionMode >= 1) { canvas->save(); controls.coords.transform_sk_canvas(canvas, drawData); float x1 = std::min(controls.rectX1, controls.rectX2); diff --git a/src/DrawingProgram/ScreenshotTool.hpp b/src/DrawingProgram/ScreenshotTool.hpp index f8fbad7..36c1c0d 100644 --- a/src/DrawingProgram/ScreenshotTool.hpp +++ b/src/DrawingProgram/ScreenshotTool.hpp @@ -41,6 +41,9 @@ class ScreenshotTool : public DrawingProgramToolBase { }; struct ScreenshotControls { + CoordSpaceHelper translateBeginCoords; + WorldVec translateBeginPos; + CoordSpaceHelper coords; float rectX1; float rectX2;