summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTommaso Peduzzi <tommaso.peduzzi@gmx.ch>2022-08-08 14:34:50 +0200
committerAndreas Kling <kling@serenityos.org>2022-09-16 22:53:07 +0200
commit293ab2cdc9a0420bee7491481fcf70f7cfa53752 (patch)
tree1a2e7acd5f15080d831f823f5820035451b7e79a
parent77f124c87aceb52c6dae8ddab16669b67c7847e1 (diff)
downloadserenity-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.cpp35
-rw-r--r--Userland/Applications/PixelPaint/Tools/MoveTool.h4
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 };
};
}