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 54c95577df)
This commit is contained in:
Alx Sa 2025-06-11 16:49:12 +00:00 committed by Jehan
parent ee555b9e0c
commit bc1f8cfd17
2 changed files with 63 additions and 80 deletions

View file

@ -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));

View file

@ -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;
}