From 90873781c1d2bbe5334dd6f732b6010843956c56 Mon Sep 17 00:00:00 2001 From: Elliot Maisl Date: Thu, 17 Jun 2021 00:00:23 +0200 Subject: [PATCH] PixelPaint: Add new selection moving modes If you press "spacebar" while moving a selection, it will now move the origin point of the selection; and if you press "control" it will move it relatively to the center. --- .../PixelPaint/RectangleSelectTool.cpp | 24 +++++++++++++++++++ .../PixelPaint/RectangleSelectTool.h | 9 +++++++ 2 files changed, 33 insertions(+) diff --git a/Userland/Applications/PixelPaint/RectangleSelectTool.cpp b/Userland/Applications/PixelPaint/RectangleSelectTool.cpp index a7a52e0bb2..66b541405f 100644 --- a/Userland/Applications/PixelPaint/RectangleSelectTool.cpp +++ b/Userland/Applications/PixelPaint/RectangleSelectTool.cpp @@ -37,6 +37,14 @@ void RectangleSelectTool::on_mousemove(Layer&, GUI::MouseEvent&, GUI::MouseEvent if (!m_selecting) return; + if (m_moving_mode != MovingMode::None) { + auto delta = m_selection_end - image_event.position(); + if (m_moving_mode == MovingMode::MovingOrigin) + m_selection_start -= delta; + else if (m_moving_mode == MovingMode::AroundCenter) + m_selection_start += delta; + } + m_selection_end = image_event.position(); m_editor->update(); } @@ -55,6 +63,22 @@ void RectangleSelectTool::on_mouseup(Layer&, GUI::MouseEvent&, GUI::MouseEvent& m_editor->selection().set(rect_in_image); } +void RectangleSelectTool::on_keydown(GUI::KeyEvent& key_event) +{ + if (key_event.key() == KeyCode::Key_Space) + m_moving_mode = MovingMode::MovingOrigin; + else if (key_event.key() == KeyCode::Key_Control) + m_moving_mode = MovingMode::AroundCenter; +} + +void RectangleSelectTool::on_keyup(GUI::KeyEvent& key_event) +{ + if (key_event.key() == KeyCode::Key_Space && m_moving_mode == MovingMode::MovingOrigin) + m_moving_mode = MovingMode::None; + else if (key_event.key() == KeyCode::Key_Control && m_moving_mode == MovingMode::AroundCenter) + m_moving_mode = MovingMode::None; +} + void RectangleSelectTool::on_second_paint(Layer const&, GUI::PaintEvent& event) { if (!m_selecting) diff --git a/Userland/Applications/PixelPaint/RectangleSelectTool.h b/Userland/Applications/PixelPaint/RectangleSelectTool.h index 2bfe4324b9..a47fd35ee8 100644 --- a/Userland/Applications/PixelPaint/RectangleSelectTool.h +++ b/Userland/Applications/PixelPaint/RectangleSelectTool.h @@ -18,10 +18,19 @@ public: virtual void on_mousedown(Layer&, GUI::MouseEvent&, GUI::MouseEvent&) override; virtual void on_mousemove(Layer&, GUI::MouseEvent&, GUI::MouseEvent&) override; virtual void on_mouseup(Layer&, GUI::MouseEvent&, GUI::MouseEvent&) override; + virtual void on_keydown(GUI::KeyEvent&) override; + virtual void on_keyup(GUI::KeyEvent&) override; virtual void on_second_paint(Layer const&, GUI::PaintEvent&) override; private: + enum class MovingMode { + MovingOrigin, + AroundCenter, + None, + }; + bool m_selecting { false }; + MovingMode m_moving_mode { MovingMode::None }; Gfx::IntPoint m_selection_start; Gfx::IntPoint m_selection_end; };