core, widgets: Don't remove inactive filters on merge

If a filter is inactive/invisible, it does not
affect the appearance of the drawable.
Therefore, when merging all active filters,
those filters should not be removed.

This patch adds conditional checks for
gimp_filter_get_active () and does not
remove filters on merge if it returns
FALSE. It also adds sensitivity checks in
the GUI so that the merge down button is
not active if there are no visible filters.
This commit is contained in:
Alx Sa 2026-02-05 19:01:41 +00:00
parent 02886e626d
commit cfba63a932
2 changed files with 16 additions and 5 deletions

View file

@ -348,7 +348,8 @@ gimp_drawable_merge_filters (GimpDrawable *drawable)
list = list->next;
if (GIMP_IS_DRAWABLE_FILTER (filter) &&
if (GIMP_IS_DRAWABLE_FILTER (filter) &&
gimp_filter_get_active (GIMP_FILTER (filter)) &&
! gimp_drawable_filter_get_temporary (filter))
{

View file

@ -420,7 +420,7 @@ _gimp_drawable_tree_view_filter_editor_destroy (GimpDrawableTreeView *view)
static void
gimp_drawable_filters_editor_set_sensitive (GimpDrawableTreeView *view)
{
GimpDrawableTreeViewFiltersEditor *editor= view->editor;
GimpDrawableTreeViewFiltersEditor *editor = view->editor;
gboolean editable;
gint n_editable;
gint first_editable;
@ -444,6 +444,7 @@ gimp_drawable_filters_editor_set_sensitive (GimpDrawableTreeView *view)
GimpContainer *filters;
gboolean is_group = FALSE;
gboolean is_editable = FALSE;
gboolean has_visible_filters;
gint index;
filters = gimp_drawable_get_filters (editor->drawable);
@ -455,6 +456,9 @@ gimp_drawable_filters_editor_set_sensitive (GimpDrawableTreeView *view)
if (gimp_viewable_get_children (GIMP_VIEWABLE (editor->drawable)))
is_group = TRUE;
has_visible_filters =
gimp_drawable_has_visible_filters (editor->drawable);
is_editable = (index >= first_editable &&
index <= last_editable);
@ -467,7 +471,8 @@ gimp_drawable_filters_editor_set_sensitive (GimpDrawableTreeView *view)
gtk_widget_set_sensitive (editor->lower_button,
index < last_editable);
gtk_widget_set_sensitive (editor->merge_button,
! is_group &&
! is_group &&
has_visible_filters &&
(! GIMP_IS_RASTERIZABLE (editor->drawable) ||
gimp_rasterizable_is_rasterized (GIMP_RASTERIZABLE (editor->drawable))));
gtk_widget_set_sensitive (editor->remove_button,
@ -730,6 +735,7 @@ gimp_drawable_filters_editor_merge_clicked (GtkWidget *widget,
GimpDrawableTreeViewFiltersEditor *editor = view->editor;
GimpContext *context;
GimpToolInfo *active_tool;
GimpContainer *filters;
if (! GIMP_IS_DRAWABLE_FILTER (editor->filter))
return;
@ -746,7 +752,8 @@ gimp_drawable_filters_editor_merge_clicked (GtkWidget *widget,
gimp_context_get_display (context));
}
if (! gimp_viewable_get_children (GIMP_VIEWABLE (editor->drawable)))
if (! gimp_viewable_get_children (GIMP_VIEWABLE (editor->drawable)) &&
gimp_drawable_has_visible_filters (editor->drawable))
{
GimpImage *image = gimp_item_tree_view_get_image (GIMP_ITEM_TREE_VIEW (view));
@ -761,7 +768,10 @@ gimp_drawable_filters_editor_merge_clicked (GtkWidget *widget,
gimp_drawable_merge_filters (GIMP_DRAWABLE (editor->drawable));
_gimp_drawable_tree_view_filter_editor_hide (view);
/* If we still have inactive filters, keep pop-up open */
filters = gimp_drawable_get_filters (editor->drawable);
if (gimp_container_get_n_children (filters) == 0)
_gimp_drawable_tree_view_filter_editor_hide (view);
gimp_image_flush (image);
}