From bc1f8cfd1703932205685c94f595b8bc824e93ab Mon Sep 17 00:00:00 2001 From: Alx Sa Date: Wed, 11 Jun 2025 16:49:12 +0000 Subject: [PATCH] widgets, tools: Allow NDE filters on channels This patch removes restrictions on applying NDE filters to channels in the GUI. Note that layer masks are still restricted, not for technical reasons but because UX/UI needs to be considered further. (cherry picked from commit 54c95577dfad7c0140041dd94914f2be7a4a425a) --- app/tools/gimpfiltertool.c | 17 ++-- app/widgets/gimpdrawabletreeview.c | 126 ++++++++++++----------------- 2 files changed, 63 insertions(+), 80 deletions(-) diff --git a/app/tools/gimpfiltertool.c b/app/tools/gimpfiltertool.c index ea08e81954..698ee534da 100644 --- a/app/tools/gimpfiltertool.c +++ b/app/tools/gimpfiltertool.c @@ -56,6 +56,7 @@ #include "core/gimpimage-pick-color.h" #include "core/gimpimage-undo-push.h" #include "core/gimplayer.h" +#include "core/gimplayermask.h" #include "core/gimplist.h" #include "core/gimppickable.h" #include "core/gimpprogress.h" @@ -405,8 +406,10 @@ gimp_filter_tool_initialize (GimpTool *tool, "preview", NULL); /* Only show merge filter option if we're not editing an NDE filter or - * applying to a layer group */ - if ((GIMP_IS_LAYER (drawable) && ! GIMP_IS_GROUP_LAYER (drawable)) && + * applying to a layer group or layer mask */ + if (((GIMP_IS_LAYER (drawable) || GIMP_IS_CHANNEL (drawable)) && + ! GIMP_IS_GROUP_LAYER (drawable) && + ! GIMP_IS_LAYER_MASK (drawable)) && ! filter_tool->existing_filter) { gchar *operation_name = NULL; @@ -551,8 +554,9 @@ gimp_filter_tool_control (GimpTool *tool, drawable = gimp_drawable_filter_get_drawable (filter_tool->filter); /* TODO: Expand non-destructive editing to other drawables - * besides layers */ - if (! GIMP_IS_LAYER (drawable) || + * besides layers and channels */ + if ((! GIMP_IS_LAYER (drawable) && ! GIMP_IS_CHANNEL (drawable)) || + GIMP_IS_LAYER_MASK (drawable) || (! filter_tool->existing_filter && options->merge_filter)) non_destructive = FALSE; @@ -1354,8 +1358,9 @@ gimp_filter_tool_commit (GimpFilterTool *filter_tool, gimp_filter_tool_remove_guide (filter_tool); - /* TODO: Review when we can apply NDE filters to channels/layer masks */ - if (GIMP_IS_LAYER (drawable)) + /* TODO: Review when we can apply NDE filters to layer masks */ + if (GIMP_IS_LAYER (drawable) || + (GIMP_IS_CHANNEL (drawable) && ! GIMP_IS_LAYER_MASK (drawable))) gimp_drawable_update (drawable, 0, 0, -1, -1); gimp_image_flush (gimp_display_get_image (tool->display)); diff --git a/app/widgets/gimpdrawabletreeview.c b/app/widgets/gimpdrawabletreeview.c index d29529c6fc..6ae5499db0 100644 --- a/app/widgets/gimpdrawabletreeview.c +++ b/app/widgets/gimpdrawabletreeview.c @@ -207,6 +207,7 @@ gimp_drawable_tree_view_constructed (GObject *object) GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (object); GimpDrawableTreeView *view = GIMP_DRAWABLE_TREE_VIEW (object); GtkIconSize button_icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR; + GtkTreeViewColumn *column; gint pixel_icon_size = 16; gint button_spacing; @@ -218,39 +219,33 @@ gimp_drawable_tree_view_constructed (GObject *object) NULL); gtk_icon_size_lookup (button_icon_size, &pixel_icon_size, NULL); - /* TODO: Expand layer effects to other drawable types */ - if (GIMP_IS_LAYER_TREE_VIEW (object)) - { - GtkTreeViewColumn *column; + column = gtk_tree_view_column_new (); + view->priv->filters_header_image = + gtk_image_new_from_icon_name (GIMP_ICON_EFFECT, button_icon_size); + gimp_widget_set_identifier (view->priv->filters_header_image, + "item-effect-header-icon"); + gtk_tree_view_column_set_widget (column, view->priv->filters_header_image); + gtk_widget_show (view->priv->filters_header_image); + gtk_tree_view_insert_column (tree_view->view, column, 2); - column = gtk_tree_view_column_new (); - view->priv->filters_header_image = - gtk_image_new_from_icon_name (GIMP_ICON_EFFECT, button_icon_size); - gimp_widget_set_identifier (view->priv->filters_header_image, - "item-effect-header-icon"); - gtk_tree_view_column_set_widget (column, view->priv->filters_header_image); - gtk_widget_show (view->priv->filters_header_image); - gtk_tree_view_insert_column (tree_view->view, column, 2); + view->priv->filters_cell = gimp_cell_renderer_toggle_new (GIMP_ICON_EFFECT); + g_object_set (view->priv->filters_cell, + "xpad", 0, + "ypad", 0, + "icon-size", pixel_icon_size, + NULL); + gtk_tree_view_column_pack_start (column, view->priv->filters_cell, FALSE); + gtk_tree_view_column_set_attributes (column, view->priv->filters_cell, + "active", + view->priv->model_column_filters, + NULL); - view->priv->filters_cell = gimp_cell_renderer_toggle_new (GIMP_ICON_EFFECT); - g_object_set (view->priv->filters_cell, - "xpad", 0, - "ypad", 0, - "icon-size", pixel_icon_size, - NULL); - gtk_tree_view_column_pack_start (column, view->priv->filters_cell, FALSE); - gtk_tree_view_column_set_attributes (column, view->priv->filters_cell, - "active", - view->priv->model_column_filters, - NULL); + gimp_container_tree_view_add_toggle_cell (tree_view, + view->priv->filters_cell); - gimp_container_tree_view_add_toggle_cell (tree_view, - view->priv->filters_cell); - - g_signal_connect (view->priv->filters_cell, "clicked", - G_CALLBACK (gimp_drawable_tree_view_filters_cell_clicked), - item_view); - } + g_signal_connect (view->priv->filters_cell, "clicked", + G_CALLBACK (gimp_drawable_tree_view_filters_cell_clicked), + item_view); gimp_dnd_viewable_dest_add (gimp_item_tree_view_get_new_button (item_view), GIMP_TYPE_PATTERN, @@ -297,26 +292,23 @@ gimp_drawable_tree_view_style_updated (GtkWidget *widget) gtk_icon_size_lookup (button_icon_size, &pixel_icon_size, NULL); - if (GIMP_IS_LAYER_TREE_VIEW (view)) + gtk_image_get_icon_name (GTK_IMAGE (view->priv->filters_header_image), + &old_icon_name, &old_size); + + if (button_icon_size != old_size) { - gtk_image_get_icon_name (GTK_IMAGE (view->priv->filters_header_image), - &old_icon_name, &old_size); + gchar *icon_name = g_strdup (old_icon_name); - if (button_icon_size != old_size) - { - gchar *icon_name = g_strdup (old_icon_name); - - gtk_image_set_from_icon_name (GTK_IMAGE (view->priv->filters_header_image), - icon_name, button_icon_size); - g_free (icon_name); - } - - g_object_set (view->priv->filters_cell, - "icon-name", GIMP_ICON_EFFECT, - "icon-size", pixel_icon_size, - NULL); + gtk_image_set_from_icon_name (GTK_IMAGE (view->priv->filters_header_image), + icon_name, button_icon_size); + g_free (icon_name); } + g_object_set (view->priv->filters_cell, + "icon-name", GIMP_ICON_EFFECT, + "icon-size", pixel_icon_size, + NULL); + GTK_WIDGET_CLASS (parent_class)->style_updated (widget); } @@ -333,26 +325,16 @@ gimp_drawable_tree_view_set_container (GimpContainerView *view, old_container = gimp_container_view_get_container (view); if (old_container) - { - if (GIMP_IS_LAYER_TREE_VIEW (drawable_view)) - { - g_clear_pointer (&drawable_view->priv->filters_changed_handler, - gimp_tree_handler_disconnect); - } - } + g_clear_pointer (&drawable_view->priv->filters_changed_handler, + gimp_tree_handler_disconnect); parent_view_iface->set_container (view, container); if (container) - { - if (GIMP_IS_LAYER_TREE_VIEW (drawable_view)) - { - drawable_view->priv->filters_changed_handler = - gimp_tree_handler_connect (container, "filters-changed", - G_CALLBACK (gimp_drawable_tree_view_filters_changed), - view); - } - } + drawable_view->priv->filters_changed_handler = + gimp_tree_handler_connect (container, "filters-changed", + G_CALLBACK (gimp_drawable_tree_view_filters_changed), + view); } static gpointer @@ -363,24 +345,20 @@ gimp_drawable_tree_view_insert_item (GimpContainerView *view, { GimpContainerTreeView *tree_view = GIMP_CONTAINER_TREE_VIEW (view); GimpDrawableTreeView *drawable_view = GIMP_DRAWABLE_TREE_VIEW (view); + GimpContainer *filters; GtkTreeIter *iter; + gint n_filters; iter = parent_view_iface->insert_item (view, viewable, parent_insert_data, index); - if (GIMP_IS_LAYER_TREE_VIEW (view)) - { - GimpContainer *filters; - gint n_filters; + filters = gimp_drawable_get_filters (GIMP_DRAWABLE (viewable)); + n_filters = gimp_container_get_n_children (filters); - filters = gimp_drawable_get_filters (GIMP_DRAWABLE (viewable)); - n_filters = gimp_container_get_n_children (filters); - - gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter, - drawable_view->priv->model_column_filters, - n_filters > 0, - -1); - } + gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter, + drawable_view->priv->model_column_filters, + n_filters > 0, + -1); return iter; }