diff --git a/Userland/Applications/PixelPaint/FilterModel.cpp b/Userland/Applications/PixelPaint/FilterModel.cpp index e1d2b3df13..8357370449 100644 --- a/Userland/Applications/PixelPaint/FilterModel.cpp +++ b/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::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::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>::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>::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>::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>::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::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); diff --git a/Userland/Applications/PixelPaint/MainWidget.cpp b/Userland/Applications/PixelPaint/MainWidget.cpp index 521ea35537..1b12f5810f 100644 --- a/Userland/Applications/PixelPaint/MainWidget.cpp +++ b/Userland/Applications/PixelPaint/MainWidget.cpp @@ -1,7 +1,7 @@ /* * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021, Mustafa Quraish - * Copyright (c) 2021, Tobias Christiansen + * Copyright (c) 2021-2022, Tobias Christiansen * * 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::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::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>::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>::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>::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>::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::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));