diff options
author | Tommaso Peduzzi <tommaso.peduzzi@gmx.ch> | 2022-08-08 14:34:50 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-09-16 22:53:07 +0200 |
commit | 293ab2cdc9a0420bee7491481fcf70f7cfa53752 (patch) | |
tree | 1a2e7acd5f15080d831f823f5820035451b7e79a | |
parent | 77f124c87aceb52c6dae8ddab16669b67c7847e1 (diff) | |
download | serenity-293ab2cdc9a0420bee7491481fcf70f7cfa53752.zip |
PixelPaint: Add scaling function to move tool
This patch adds scaling function to the move tool.
When the cursor is over the lower right corner of the layer, it changes.
This is to signify that the layer can be scaled by dragging the mouse.
There is currently no preview of the scaling.
Doing a resize every time the mouse moves leads to unexpected behavior.
-rw-r--r-- | Userland/Applications/PixelPaint/Tools/MoveTool.cpp | 35 | ||||
-rw-r--r-- | Userland/Applications/PixelPaint/Tools/MoveTool.h | 4 |
2 files changed, 36 insertions, 3 deletions
diff --git a/Userland/Applications/PixelPaint/Tools/MoveTool.cpp b/Userland/Applications/PixelPaint/Tools/MoveTool.cpp index 023ecf15fc..c5e9e7bc3c 100644 --- a/Userland/Applications/PixelPaint/Tools/MoveTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/MoveTool.cpp @@ -29,8 +29,9 @@ void MoveTool::on_mousedown(Layer* layer, MouseEvent& event) auto& image_event = event.image_event(); if (layer_event.button() != GUI::MouseButton::Primary) return; - if (!layer->rect().contains(layer_event.position())) + if (!layer->rect().contains(layer_event.position()) && !m_mouse_in_resize_corner) return; + m_scaling = m_mouse_in_resize_corner; m_layer_being_moved = *layer; m_event_origin = image_event.position(); m_layer_origin = layer->location(); @@ -46,8 +47,17 @@ void MoveTool::on_mousemove(Layer* layer, MouseEvent& event) if (!layer) return; + constexpr int sensitivity = 20; + Gfx::IntPoint grab_rect_position = Gfx::IntPoint(layer->location().x() + layer->size().width() - sensitivity / 2, layer->location().y() + layer->size().height() - sensitivity / 2); + Gfx::IntRect grab_rect = Gfx::IntRect(grab_rect_position, Gfx::IntSize(sensitivity, sensitivity)); + auto updated_is_in_lower_right_corner = grab_rect.contains(event.image_event().position()); // check if the mouse is in the lower right corner + if (m_mouse_in_resize_corner != updated_is_in_lower_right_corner) { + m_mouse_in_resize_corner = updated_is_in_lower_right_corner; + m_editor->update_tool_cursor(); + } + auto& image_event = event.image_event(); - if (!m_layer_being_moved) + if (!m_layer_being_moved || m_scaling) return; auto delta = image_event.position() - m_event_origin; m_layer_being_moved->set_location(m_layer_origin.translated(delta)); @@ -68,12 +78,26 @@ void MoveTool::on_mouseup(Layer* layer, MouseEvent& event) auto& layer_event = event.layer_event(); if (layer_event.button() != GUI::MouseButton::Primary) return; + + if (m_scaling) { + auto& cursor_location = event.image_event().position(); + + auto new_size = Gfx::IntSize(abs(m_layer_being_moved->location().x() - cursor_location.x()), abs(m_layer_being_moved->location().y() - cursor_location.y())); + // TODO: Change this according to which direction the user is scaling + auto new_location = Gfx::IntPoint(m_layer_being_moved->location().x(), m_layer_being_moved->location().y()); + m_editor->active_layer()->resize(new_size, new_location, Gfx::Painter::ScalingMode::BilinearBlend); + } + + m_scaling = false; m_layer_being_moved = nullptr; m_editor->did_complete_action(tool_name()); } void MoveTool::on_keydown(GUI::KeyEvent& event) { + if (m_scaling) + return; + if (event.modifiers() != 0) return; @@ -104,4 +128,11 @@ void MoveTool::on_keydown(GUI::KeyEvent& event) m_editor->layers_did_change(); } +Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> MoveTool::cursor() +{ + if (m_mouse_in_resize_corner || m_scaling) + return Gfx::StandardCursor::ResizeDiagonalTLBR; + return Gfx::StandardCursor::Move; +} + } diff --git a/Userland/Applications/PixelPaint/Tools/MoveTool.h b/Userland/Applications/PixelPaint/Tools/MoveTool.h index 20e7e5a685..60d0502785 100644 --- a/Userland/Applications/PixelPaint/Tools/MoveTool.h +++ b/Userland/Applications/PixelPaint/Tools/MoveTool.h @@ -21,7 +21,7 @@ public: virtual void on_mousemove(Layer*, MouseEvent&) override; virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_keydown(GUI::KeyEvent&) override; - virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Move; } + virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; private: virtual StringView tool_name() const override { return "Move Tool"sv; } @@ -29,6 +29,8 @@ private: RefPtr<Layer> m_layer_being_moved; Gfx::IntPoint m_event_origin; Gfx::IntPoint m_layer_origin; + bool m_scaling { false }; + bool m_mouse_in_resize_corner { false }; }; } |