mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-11 01:06:01 +03:00
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.
This commit is contained in:
parent
77f124c87a
commit
293ab2cdc9
Notes:
sideshowbarker
2024-07-17 09:37:30 +09:00
Author: https://github.com/tommasopeduzzi 🔰 Commit: https://github.com/SerenityOS/serenity/commit/293ab2cdc9 Pull-request: https://github.com/SerenityOS/serenity/pull/14806 Reviewed-by: https://github.com/MacDue Reviewed-by: https://github.com/TobyAsE ✅
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 };
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user