core,widgets: Fix filter manipulations on invisible layers

Many actions done on layers require refreshing its filters, by toggling
the layer off and on again. When done on an invisible layer, this would
turn it visible, which could not be undone.
Now, the layer remains invisible.
This commit is contained in:
Estecka 2025-05-28 15:36:59 +02:00 committed by Michael Natterer
parent 3b775abc90
commit a60c1097ab
6 changed files with 32 additions and 57 deletions

View file

@ -2107,10 +2107,7 @@ gimp_drawable_end_paint (GimpDrawable *drawable)
if (gimp_drawable_has_visible_filters (drawable) &&
drawable->private->paint_count == 0)
{
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_set_visible (GIMP_ITEM (drawable),TRUE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_refresh_filters (GIMP_ITEM (drawable));
}
return result;

View file

@ -242,10 +242,7 @@ gimp_drawable_filter_undo_pop (GimpUndo *undo,
{
gimp_drawable_remove_filter (drawable, GIMP_FILTER (filter));
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (undo->image);
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (undo->image);
gimp_item_refresh_filters (GIMP_ITEM (drawable));
}
}
if ((undo_mode == GIMP_UNDO_MODE_UNDO &&

View file

@ -2786,3 +2786,20 @@ gimp_item_is_in_set (GimpItem *item,
return FALSE;
}
/* Hack to make the effects visibly change */
void
gimp_item_refresh_filters (GimpItem *item)
{
g_return_if_fail (GIMP_IS_ITEM (item));
if (gimp_item_is_visible (item))
{
GimpImage *image = gimp_item_get_image (item);
gimp_item_set_visible (item, FALSE, FALSE);
gimp_image_flush (image);
gimp_item_set_visible (item, TRUE, FALSE);
gimp_image_flush (image);
}
}

View file

@ -410,5 +410,7 @@ gboolean gimp_item_mask_intersect (GimpItem *item,
gboolean gimp_item_is_in_set (GimpItem *item,
GimpItemSet set);
void gimp_item_refresh_filters (GimpItem *item);
#endif /* __GIMP_ITEM_H__ */

View file

@ -924,10 +924,7 @@ gimp_filter_tool_options_notify (GimpTool *tool,
gimp_container_reorder (filters, GIMP_OBJECT (filter_tool->filter),
0);
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_refresh_filters (GIMP_ITEM (drawable));
}
g_object_set (filter_tool->filter,
@ -1199,10 +1196,7 @@ gimp_filter_tool_halt (GimpFilterTool *filter_tool)
gimp_filter_set_active (GIMP_FILTER (filter_tool->existing_filter), TRUE);
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_refresh_filters (GIMP_ITEM (drawable));
/* Restore buttons in layer tree view */
gimp_drawable_filters_changed (gimp_drawable_filter_get_drawable (filter_tool->existing_filter));
@ -1361,9 +1355,7 @@ gimp_filter_tool_commit (GimpFilterTool *filter_tool,
/* TODO: Review when we can apply NDE filters to channels/layer masks */
if (GIMP_IS_LAYER (drawable))
{
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (gimp_display_get_image (tool->display));
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_item_refresh_filters (GIMP_ITEM (drawable));
}
gimp_image_flush (gimp_display_get_image (tool->display));
@ -1383,10 +1375,7 @@ gimp_filter_tool_commit (GimpFilterTool *filter_tool,
gimp_filter_set_active (GIMP_FILTER (filter_tool->existing_filter), TRUE);
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_refresh_filters (GIMP_ITEM (drawable));
}
filter_tool->existing_filter = NULL;
@ -1569,10 +1558,7 @@ gimp_filter_tool_create_filter (GimpFilterTool *filter_tool)
{
gimp_container_reorder (filters, GIMP_OBJECT (filter_tool->filter),
count - 1);
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
gimp_item_refresh_filters ((GIMP_ITEM (drawable)));
}
}
}

View file

@ -2597,11 +2597,7 @@ gimp_item_tree_view_effects_visible_toggled (GtkCellRendererToggle *toggle,
gimp_filter_set_active (GIMP_FILTER (filter), ! visible);
/* Refresh the drawable */
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (image);
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (image);
gimp_item_refresh_filters (GIMP_ITEM (drawable));
}
}
}
@ -2632,11 +2628,7 @@ gimp_item_tree_view_effects_visible_all_toggled (GtkWidget *widget,
}
}
/* Hack to make the effects visibly change */
gimp_item_set_visible (GIMP_ITEM (view->priv->effects_drawable), FALSE, FALSE);
gimp_image_flush (image);
gimp_item_set_visible (GIMP_ITEM (view->priv->effects_drawable), TRUE, FALSE);
gimp_image_flush (image);
gimp_item_refresh_filters (GIMP_ITEM (view->priv->effects_drawable));
}
}
@ -2762,11 +2754,7 @@ gimp_item_tree_view_effects_raised_clicked (GtkWidget *widget,
gtk_widget_set_sensitive (view->priv->effects_raise_button, FALSE);
}
/* Hack to make the effects visibly change */
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (image);
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (image);
gimp_item_refresh_filters (GIMP_ITEM (view->priv->effects_drawable));
}
}
}
@ -2822,11 +2810,7 @@ gimp_item_tree_view_effects_lowered_clicked (GtkWidget *widget,
gtk_widget_set_sensitive (view->priv->effects_lower_button, FALSE);
}
/* Hack to make the effects visibly change */
gimp_item_set_visible (GIMP_ITEM (drawable), FALSE, FALSE);
gimp_image_flush (image);
gimp_item_set_visible (GIMP_ITEM (drawable), TRUE, FALSE);
gimp_image_flush (image);
gimp_item_refresh_filters (GIMP_ITEM (drawable));
}
}
}
@ -2876,11 +2860,7 @@ gimp_item_tree_view_effects_merged_clicked (GtkWidget *widget,
/* Close NDE pop-over on successful merge */
gtk_widget_set_visible (view->priv->effects_popover, FALSE);
/* Hack to make the effects visibly change */
gimp_item_set_visible (GIMP_ITEM (view->priv->effects_drawable), FALSE, FALSE);
gimp_image_flush (image);
gimp_item_set_visible (GIMP_ITEM (view->priv->effects_drawable), TRUE, FALSE);
gimp_image_flush (image);
gimp_item_refresh_filters (GIMP_ITEM (view->priv->effects_drawable));
}
}
@ -2909,11 +2889,7 @@ gimp_item_tree_view_effects_removed_clicked (GtkWidget *widget,
gtk_widget_set_visible (view->priv->effects_popover, FALSE);
}
/* Hack to make the effects visibly change */
gimp_item_set_visible (GIMP_ITEM (view->priv->effects_drawable), FALSE, FALSE);
gimp_image_flush (image);
gimp_item_set_visible (GIMP_ITEM (view->priv->effects_drawable), TRUE, FALSE);
gimp_image_flush (image);
gimp_item_refresh_filters (GIMP_ITEM (view->priv->effects_drawable));
}
}