Selaa lähdekoodia

PixelPaint: Show resize anchors when using the move tool

This commit adds a two color border around areas that the user must
drag to resize, when using the move tool.
Tim Ledbetter 2 vuotta sitten
vanhempi
commit
c82825379a

+ 25 - 6
Userland/Applications/PixelPaint/Tools/MoveTool.cpp

@@ -200,6 +200,28 @@ void MoveTool::on_second_paint(Layer const* layer, GUI::PaintEvent& event)
     }
     }
     painter.draw_rect_with_thickness(rect_in_editor, Color::Black, 3);
     painter.draw_rect_with_thickness(rect_in_editor, Color::Black, 3);
     painter.draw_rect_with_thickness(rect_in_editor, Color::White, 1);
     painter.draw_rect_with_thickness(rect_in_editor, Color::White, 1);
+    auto resize_anchors = resize_anchor_rects(rect_in_editor);
+    for (auto const& resize_anchor_rect : resize_anchors) {
+        painter.draw_rect_with_thickness(resize_anchor_rect, Color::Black, 3);
+        painter.draw_rect_with_thickness(resize_anchor_rect, Color::White, 1);
+    }
+}
+
+Gfx::IntRect MoveTool::resize_anchor_rect_from_position(Gfx::IntPoint position)
+{
+    constexpr int resize_anchor_size = 20;
+    auto resize_anchor_rect_top_left = position.translated(-resize_anchor_size / 2);
+    return Gfx::IntRect(resize_anchor_rect_top_left, Gfx::IntSize(resize_anchor_size, resize_anchor_size));
+}
+
+Array<Gfx::IntRect, 4> MoveTool::resize_anchor_rects(Gfx::IntRect layer_rect_in_frame_coordinates)
+{
+    return Array {
+        resize_anchor_rect_from_position(layer_rect_in_frame_coordinates.top_left()),
+        resize_anchor_rect_from_position(layer_rect_in_frame_coordinates.top_right().translated(1, 0)),
+        resize_anchor_rect_from_position(layer_rect_in_frame_coordinates.bottom_left().translated(0, 1)),
+        resize_anchor_rect_from_position(layer_rect_in_frame_coordinates.bottom_right().translated(1))
+    };
 }
 }
 
 
 ErrorOr<void> MoveTool::update_cached_preview_bitmap(Layer const* layer)
 ErrorOr<void> MoveTool::update_cached_preview_bitmap(Layer const* layer)
@@ -218,14 +240,11 @@ ErrorOr<void> MoveTool::update_cached_preview_bitmap(Layer const* layer)
 
 
 Optional<ResizeAnchorLocation const> MoveTool::resize_anchor_location_from_cursor_position(Layer const* layer, MouseEvent& event)
 Optional<ResizeAnchorLocation const> MoveTool::resize_anchor_location_from_cursor_position(Layer const* layer, MouseEvent& event)
 {
 {
-    auto cursor_within_resize_anchor_rect = [&](Gfx::IntPoint layer_position) {
-        constexpr int sensitivity = 20;
-        auto resize_anchor_rect_center = m_editor->content_to_frame_position(layer_position).to_rounded<int>();
-        auto resize_anchor_rect_top_left = resize_anchor_rect_center.translated(-sensitivity / 2);
-        auto resize_anchor_rect = Gfx::IntRect(resize_anchor_rect_top_left, Gfx::IntSize(sensitivity, sensitivity));
+    auto cursor_within_resize_anchor_rect = [&](Gfx::IntPoint layer_position_in_frame_coordinates) {
+        auto resize_anchor_rect = resize_anchor_rect_from_position(layer_position_in_frame_coordinates);
         return resize_anchor_rect.contains(event.raw_event().position());
         return resize_anchor_rect.contains(event.raw_event().position());
     };
     };
-    auto layer_rect = layer->relative_rect();
+    auto layer_rect = m_editor->content_to_frame_rect(layer->relative_rect()).to_rounded<int>();
     if (cursor_within_resize_anchor_rect(layer_rect.top_left()))
     if (cursor_within_resize_anchor_rect(layer_rect.top_left()))
         return ResizeAnchorLocation::TopLeft;
         return ResizeAnchorLocation::TopLeft;
     if (cursor_within_resize_anchor_rect(layer_rect.top_right().translated(1, 0)))
     if (cursor_within_resize_anchor_rect(layer_rect.top_right().translated(1, 0)))

+ 2 - 0
Userland/Applications/PixelPaint/Tools/MoveTool.h

@@ -41,6 +41,8 @@ public:
     LayerSelectionMode layer_selection_mode() const { return m_layer_selection_mode; }
     LayerSelectionMode layer_selection_mode() const { return m_layer_selection_mode; }
 
 
 private:
 private:
+    static Gfx::IntRect resize_anchor_rect_from_position(Gfx::IntPoint);
+    static Array<Gfx::IntRect, 4> resize_anchor_rects(Gfx::IntRect layer_rect_in_frame_coordinates);
     virtual StringView tool_name() const override { return "Move Tool"sv; }
     virtual StringView tool_name() const override { return "Move Tool"sv; }
     ErrorOr<void> update_cached_preview_bitmap(Layer const* layer);
     ErrorOr<void> update_cached_preview_bitmap(Layer const* layer);
     Optional<ResizeAnchorLocation const> resize_anchor_location_from_cursor_position(Layer const*, MouseEvent&);
     Optional<ResizeAnchorLocation const> resize_anchor_location_from_cursor_position(Layer const*, MouseEvent&);