Browse Source

PixelPaint: Move all filters into the Filter Gallery

Tobias Christiansen 3 years ago
parent
commit
3528563e3d

+ 133 - 0
Userland/Applications/PixelPaint/FilterModel.cpp

@@ -14,6 +14,139 @@
 namespace PixelPaint {
 FilterModel::FilterModel(ImageEditor* editor)
 {
+    auto spatial_category = FilterInfo::create_category("Spatial");
+
+    auto edge_detect_category = FilterInfo::create_category("Edge Detect", spatial_category);
+    auto laplace_cardinal_filter = FilterInfo::create_filter(
+        "Laplacian (Cardinal)", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::LaplacianFilter filter;
+                if (auto parameters = PixelPaint::FilterParameters<Gfx::LaplacianFilter>::get(false)) {
+                    filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
+                    layer->did_modify_bitmap(layer->rect());
+                    editor->did_complete_action();
+                }
+            }
+        },
+        edge_detect_category);
+    auto laplace_diagonal_filter = FilterInfo::create_filter(
+        "Laplacian (Diagonal)", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::LaplacianFilter filter;
+                if (auto parameters = PixelPaint::FilterParameters<Gfx::LaplacianFilter>::get(true)) {
+                    filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
+                    layer->did_modify_bitmap(layer->rect());
+                    editor->did_complete_action();
+                }
+            }
+        },
+        edge_detect_category);
+
+    auto blur_category = FilterInfo::create_category("Blur & Sharpen", spatial_category);
+    auto gaussian_blur_filter_3 = FilterInfo::create_filter(
+        "Gaussian Blur (3x3)", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::SpatialGaussianBlurFilter<3> filter;
+                if (auto parameters = PixelPaint::FilterParameters<Gfx::SpatialGaussianBlurFilter<3>>::get()) {
+                    filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
+                    layer->did_modify_bitmap(layer->rect());
+                    editor->did_complete_action();
+                }
+            }
+        },
+        blur_category);
+    auto gaussian_blur_filter_5 = FilterInfo::create_filter(
+        "Gaussian Blur (5x5)", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::SpatialGaussianBlurFilter<5> filter;
+                if (auto parameters = PixelPaint::FilterParameters<Gfx::SpatialGaussianBlurFilter<3>>::get()) {
+                    filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
+                    layer->did_modify_bitmap(layer->rect());
+                    editor->did_complete_action();
+                }
+            }
+        },
+        blur_category);
+    auto box_blur_filter_3 = FilterInfo::create_filter(
+        "Box Blur (3x3)", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::BoxBlurFilter<3> filter;
+                if (auto parameters = PixelPaint::FilterParameters<Gfx::BoxBlurFilter<3>>::get()) {
+                    filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
+                    layer->did_modify_bitmap(layer->rect());
+                    editor->did_complete_action();
+                }
+            }
+        },
+        blur_category);
+    auto box_blur_filter_5 = FilterInfo::create_filter(
+        "Box Blur (5x5)", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::BoxBlurFilter<5> filter;
+                if (auto parameters = PixelPaint::FilterParameters<Gfx::BoxBlurFilter<3>>::get()) {
+                    filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
+                    layer->did_modify_bitmap(layer->rect());
+                    editor->did_complete_action();
+                }
+            }
+        },
+        blur_category);
+    auto sharpen_filter = FilterInfo::create_filter(
+        "Sharpen", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::SharpenFilter filter;
+                if (auto parameters = PixelPaint::FilterParameters<Gfx::SharpenFilter>::get()) {
+                    filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
+                    layer->did_modify_bitmap(layer->rect());
+                    editor->did_complete_action();
+                }
+            }
+        },
+        blur_category);
+
+    m_filters.append(spatial_category);
+
+    auto color_category = FilterInfo::create_category("Color");
+    auto grayscale_filter = FilterInfo::create_filter(
+        "Grayscale", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::GrayscaleFilter filter;
+                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect());
+                layer->did_modify_bitmap(layer->rect());
+                editor->did_complete_action();
+            }
+        },
+        color_category);
+    auto invert_filter = FilterInfo::create_filter(
+        "Invert", [editor]() {
+            if (!editor)
+                return;
+            if (auto* layer = editor->active_layer()) {
+                Gfx::InvertFilter filter;
+                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect());
+                layer->did_modify_bitmap(layer->rect());
+                editor->did_complete_action();
+            }
+        },
+        color_category);
+
+    m_filters.append(color_category);
 
     auto filter_bitmap = Gfx::Bitmap::try_load_from_file("/res/icons/pixelpaint/filter.png").release_value_but_fixme_should_propagate_errors();
     m_filter_icon = GUI::Icon(filter_bitmap);

+ 3 - 123
Userland/Applications/PixelPaint/MainWidget.cpp

@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  * Copyright (c) 2021, Mustafa Quraish <mustafa@serenityos.org>
- * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
+ * Copyright (c) 2021-2022, Tobias Christiansen <tobyase@serenityos.org>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -598,104 +598,8 @@ void MainWidget::initialize_menubar(GUI::Window& window)
             return;
     }));
 
-    auto& spatial_filters_menu = filter_menu.add_submenu("&Spatial");
-
-    auto& edge_detect_submenu = spatial_filters_menu.add_submenu("&Edge Detect");
-    edge_detect_submenu.add_action(GUI::Action::create("Laplacian (&Cardinal)", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::LaplacianFilter filter;
-            if (auto parameters = PixelPaint::FilterParameters<Gfx::LaplacianFilter>::get(false)) {
-                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
-                layer->did_modify_bitmap(layer->rect());
-                editor->did_complete_action();
-            }
-        }
-    }));
-    edge_detect_submenu.add_action(GUI::Action::create("Laplacian (&Diagonal)", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::LaplacianFilter filter;
-            if (auto parameters = PixelPaint::FilterParameters<Gfx::LaplacianFilter>::get(true)) {
-                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
-                layer->did_modify_bitmap(layer->rect());
-                editor->did_complete_action();
-            }
-        }
-    }));
-    auto& blur_submenu = spatial_filters_menu.add_submenu("&Blur and Sharpen");
-    blur_submenu.add_action(GUI::Action::create("&Gaussian Blur (3x3)", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::SpatialGaussianBlurFilter<3> filter;
-            if (auto parameters = PixelPaint::FilterParameters<Gfx::SpatialGaussianBlurFilter<3>>::get()) {
-                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
-                layer->did_modify_bitmap(layer->rect());
-                editor->did_complete_action();
-            }
-        }
-    }));
-    blur_submenu.add_action(GUI::Action::create("G&aussian Blur (5x5)", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::SpatialGaussianBlurFilter<5> filter;
-            if (auto parameters = PixelPaint::FilterParameters<Gfx::SpatialGaussianBlurFilter<5>>::get()) {
-                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
-                layer->did_modify_bitmap(layer->rect());
-                editor->did_complete_action();
-            }
-        }
-    }));
-    blur_submenu.add_action(GUI::Action::create("&Box Blur (3x3)", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::BoxBlurFilter<3> filter;
-            if (auto parameters = PixelPaint::FilterParameters<Gfx::BoxBlurFilter<3>>::get()) {
-                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
-                layer->did_modify_bitmap(layer->rect());
-                editor->did_complete_action();
-            }
-        }
-    }));
-    blur_submenu.add_action(GUI::Action::create("B&ox Blur (5x5)", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::BoxBlurFilter<5> filter;
-            if (auto parameters = PixelPaint::FilterParameters<Gfx::BoxBlurFilter<5>>::get()) {
-                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
-                layer->did_modify_bitmap(layer->rect());
-                editor->did_complete_action();
-            }
-        }
-    }));
-    blur_submenu.add_action(GUI::Action::create("&Sharpen", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::SharpenFilter filter;
-            if (auto parameters = PixelPaint::FilterParameters<Gfx::SharpenFilter>::get()) {
-                filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters);
-                layer->did_modify_bitmap(layer->rect());
-                editor->did_complete_action();
-            }
-        }
-    }));
-
-    spatial_filters_menu.add_separator();
-    spatial_filters_menu.add_action(GUI::Action::create("Generic 5x5 &Convolution", [&](auto&) {
+    filter_menu.add_separator();
+    filter_menu.add_action(GUI::Action::create("Generic 5x5 &Convolution", [&](auto&) {
         auto* editor = current_image_editor();
         if (!editor)
             return;
@@ -709,30 +613,6 @@ void MainWidget::initialize_menubar(GUI::Window& window)
         }
     }));
 
-    auto& color_filters_menu = filter_menu.add_submenu("&Color");
-    color_filters_menu.add_action(GUI::Action::create("Grayscale", [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::GrayscaleFilter filter;
-            filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect());
-            layer->did_modify_bitmap(layer->rect());
-            editor->did_complete_action();
-        }
-    }));
-    color_filters_menu.add_action(GUI::Action::create("Invert", { Mod_Ctrl, Key_I }, [&](auto&) {
-        auto* editor = current_image_editor();
-        if (!editor)
-            return;
-        if (auto* layer = editor->active_layer()) {
-            Gfx::InvertFilter filter;
-            filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect());
-            layer->did_modify_bitmap(layer->rect());
-            editor->did_complete_action();
-        }
-    }));
-
     auto& help_menu = window.add_menu("&Help");
     help_menu.add_action(GUI::CommonActions::make_about_action("Pixel Paint", GUI::Icon::default_icon("app-pixel-paint"), &window));