ソースを参照

PixelPaint: Make Alt-Clicking with all tool act like the PickerTool

Refactored PickerTool functionality to the ImageEditor level and added a
flag to Tool Base Class to allow for tools to override Alt+Click
ColorPicker functionality
Fausto Tommasi 2 年 前
コミット
813ca5ebbe

+ 28 - 0
Userland/Applications/PixelPaint/ImageEditor.cpp

@@ -305,6 +305,29 @@ GUI::MouseEvent ImageEditor::event_adjusted_for_layer(GUI::MouseEvent const& eve
     };
 }
 
+void ImageEditor::set_editor_color_to_color_at_mouse_position(GUI::MouseEvent const& event, bool sample_all_layers = false)
+{
+    auto position = event.position();
+    Color color;
+    auto layer = active_layer();
+    if (sample_all_layers) {
+        color = image().color_at(position);
+    } else {
+        if (!layer || !layer->rect().contains(position))
+            return;
+        color = layer->currently_edited_bitmap().get_pixel(position);
+    }
+
+    // We picked a transparent pixel, do nothing.
+    if (!color.alpha())
+        return;
+
+    if (event.button() == GUI::MouseButton::Primary)
+        set_primary_color(color);
+    else if (event.button() == GUI::MouseButton::Secondary)
+        set_secondary_color(color);
+}
+
 void ImageEditor::mousedown_event(GUI::MouseEvent& event)
 {
     if (event.button() == GUI::MouseButton::Middle) {
@@ -313,6 +336,11 @@ void ImageEditor::mousedown_event(GUI::MouseEvent& event)
         return;
     }
 
+    if (event.alt() && !m_active_tool->is_overriding_alt()) {
+        set_editor_color_to_color_at_mouse_position(event);
+        return; // Pick Color instead of acivating active tool when holding alt.
+    }
+
     if (!m_active_tool)
         return;
 

+ 2 - 0
Userland/Applications/PixelPaint/ImageEditor.h

@@ -118,6 +118,8 @@ public:
 
     Core::EventLoop& gui_event_loop() { return m_gui_event_loop; }
 
+    void set_editor_color_to_color_at_mouse_position(GUI::MouseEvent const& event, bool sample_all_layers);
+
 private:
     explicit ImageEditor(NonnullRefPtr<Image>);
 

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

@@ -18,6 +18,8 @@ public:
     virtual GUI::Widget* get_properties_widget() override;
     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override;
 
+    virtual bool is_overriding_alt() override { return true; }
+
 protected:
     virtual void draw_point(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::IntPoint const& point) override;
     virtual void draw_line(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::IntPoint const& start, Gfx::IntPoint const& end) override;

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

@@ -28,6 +28,8 @@ public:
 
     void draw_using(GUI::Painter&, Gfx::IntPoint const& start_position, Gfx::IntPoint const& end_position, Color color, int thickness);
 
+    virtual bool is_overriding_alt() override { return true; }
+
 private:
     virtual StringView tool_name() const override { return "Line Tool"sv; }
 

+ 3 - 18
Userland/Applications/PixelPaint/Tools/PickerTool.cpp

@@ -16,25 +16,10 @@ namespace PixelPaint {
 
 void PickerTool::on_mousedown(Layer* layer, MouseEvent& event)
 {
-    auto& position = event.layer_event().position();
-
-    Color color;
-    if (m_sample_all_layers) {
-        color = m_editor->image().color_at(position);
-    } else {
-        if (!layer || !layer->rect().contains(position))
-            return;
-        color = layer->currently_edited_bitmap().get_pixel(position);
-    }
-
-    // We picked a transparent pixel, do nothing.
-    if (!color.alpha())
+    if (!layer)
         return;
-
-    if (event.layer_event().button() == GUI::MouseButton::Primary)
-        m_editor->set_primary_color(color);
-    else if (event.layer_event().button() == GUI::MouseButton::Secondary)
-        m_editor->set_secondary_color(color);
+    auto layer_event = event.layer_event();
+    m_editor->set_editor_color_to_color_at_mouse_position(layer_event, m_sample_all_layers);
 }
 
 GUI::Widget* PickerTool::get_properties_widget()

+ 3 - 0
Userland/Applications/PixelPaint/Tools/Tool.h

@@ -77,6 +77,9 @@ public:
 
     virtual StringView tool_name() const = 0;
 
+    // We only set the override_alt_key flag to true since the override is false by default. If false is desired do not call method.
+    virtual bool is_overriding_alt() { return false; };
+
 protected:
     Tool() = default;
     WeakPtr<ImageEditor> m_editor;