Переглянути джерело

PixelPaint: Add action to invert selection

snooze6214 2 роки тому
батько
коміт
d3353ee0e7

BIN
Base/res/icons/pixelpaint/invert-selection.png


+ 1 - 0
Userland/Applications/PixelPaint/IconBag.cpp

@@ -18,6 +18,7 @@ ErrorOr<IconBag> IconBag::try_create()
     icon_bag.close_image = TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/close-tab.png"sv));
     icon_bag.edit_copy = TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-copy.png"sv));
     icon_bag.clear_selection = TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/clear-selection.png"sv));
+    icon_bag.invert_selection = TRY(Gfx::Bitmap::try_load_from_file("/res/icons/pixelpaint/invert-selection.png"sv));
     icon_bag.swap_colors = TRY(Gfx::Bitmap::try_load_from_file("/res/icons/pixelpaint/swap-colors.png"sv));
     icon_bag.default_colors = TRY(Gfx::Bitmap::try_load_from_file("/res/icons/pixelpaint/default-colors.png"sv));
     icon_bag.load_color_palette = TRY(Gfx::Bitmap::try_load_from_file("/res/icons/pixelpaint/load-color-palette.png"sv));

+ 1 - 0
Userland/Applications/PixelPaint/IconBag.h

@@ -19,6 +19,7 @@ struct IconBag final {
     RefPtr<Gfx::Bitmap> close_image { nullptr };
     RefPtr<Gfx::Bitmap> edit_copy { nullptr };
     RefPtr<Gfx::Bitmap> clear_selection { nullptr };
+    RefPtr<Gfx::Bitmap> invert_selection { nullptr };
     RefPtr<Gfx::Bitmap> swap_colors { nullptr };
     RefPtr<Gfx::Bitmap> default_colors { nullptr };
     RefPtr<Gfx::Bitmap> load_color_palette { nullptr };

+ 6 - 0
Userland/Applications/PixelPaint/MainWidget.cpp

@@ -365,6 +365,12 @@ void MainWidget::initialize_menubar(GUI::Window& window)
             VERIFY(editor);
             editor->image().selection().clear();
         }));
+    m_edit_menu->add_action(GUI::Action::create(
+        "&Invert Selection", g_icon_bag.invert_selection, [&](auto&) {
+            auto* editor = current_image_editor();
+            VERIFY(editor);
+            editor->image().selection().invert();
+        }));
 
     m_edit_menu->add_separator();
     m_edit_menu->add_action(GUI::Action::create(

+ 7 - 0
Userland/Applications/PixelPaint/Selection.cpp

@@ -22,6 +22,13 @@ void Selection::clear()
         client->selection_did_change();
 }
 
+void Selection::invert()
+{
+    auto new_mask = Mask::full(m_image.rect());
+    new_mask.subtract(m_mask);
+    m_mask = new_mask;
+}
+
 void Selection::merge(Mask const& mask, MergeMode mode)
 {
     switch (mode) {

+ 1 - 0
Userland/Applications/PixelPaint/Selection.h

@@ -38,6 +38,7 @@ public:
 
     bool is_empty() const { return m_mask.is_null(); }
     void clear();
+    void invert();
     void merge(Mask const&, MergeMode);
     void merge(Gfx::IntRect const& rect, MergeMode mode) { merge(Mask::full(rect), mode); }
     Gfx::IntRect bounding_rect() const { return m_mask.bounding_rect(); }