app: add accessors for GimpDrawableFilter::temporary and use them

instead of using the property dirtectly.  Also make sure temporary
filters don't go to the undo stack or to the XCF.
This commit is contained in:
Michael Natterer 2025-05-31 14:14:02 +02:00
parent ac01289824
commit 2baab5aa74
15 changed files with 62 additions and 29 deletions

View file

@ -112,18 +112,10 @@ gimp_drawable_n_editable_filters (GimpDrawable *drawable,
GimpFilter *filter = list->data; GimpFilter *filter = list->data;
gboolean editable = FALSE; gboolean editable = FALSE;
if (GIMP_IS_DRAWABLE_FILTER (filter)) if (GIMP_IS_DRAWABLE_FILTER (filter) &&
! gimp_drawable_filter_get_temporary (GIMP_DRAWABLE_FILTER (filter)))
{ {
gboolean temporary; editable = TRUE;
g_object_get (filter,
"temporary", &temporary,
NULL);
if (temporary)
editing_blocked = TRUE;
else
editable = TRUE;
} }
else else
{ {

View file

@ -115,7 +115,7 @@ struct _GimpDrawableFilter
GeglNode *crop_after; GeglNode *crop_after;
GimpApplicator *applicator; GimpApplicator *applicator;
gboolean is_temporary; gboolean temporary;
/* This is mirroring merge_filter option of GimpFilterOptions. */ /* This is mirroring merge_filter option of GimpFilterOptions. */
gboolean to_be_merged; gboolean to_be_merged;
}; };
@ -291,7 +291,7 @@ gimp_drawable_filter_set_property (GObject *object,
break; break;
case PROP_TEMPORARY: case PROP_TEMPORARY:
filter->is_temporary = g_value_get_boolean (value); filter->temporary = g_value_get_boolean (value);
break; break;
case PROP_TO_BE_MERGED: case PROP_TO_BE_MERGED:
@ -325,7 +325,7 @@ gimp_drawable_filter_get_property (GObject *object,
g_value_set_boolean (value, filter->has_custom_name); g_value_set_boolean (value, filter->has_custom_name);
break; break;
case PROP_TEMPORARY: case PROP_TEMPORARY:
g_value_set_boolean (value, filter->is_temporary); g_value_set_boolean (value, filter->temporary);
break; break;
case PROP_TO_BE_MERGED: case PROP_TO_BE_MERGED:
g_value_set_boolean (value, filter->to_be_merged); g_value_set_boolean (value, filter->to_be_merged);
@ -590,6 +590,30 @@ gimp_drawable_filter_get_mask (GimpDrawableFilter *filter)
return filter->mask; return filter->mask;
} }
void
gimp_drawable_filter_set_temporary (GimpDrawableFilter *filter,
gboolean temporary)
{
g_return_if_fail (GIMP_IS_DRAWABLE_FILTER (filter));
temporary = temporary ? TRUE : FALSE;
if (temporary != filter->temporary)
{
g_object_set (filter,
"temporary", temporary,
NULL);
}
}
gboolean
gimp_drawable_filter_get_temporary (GimpDrawableFilter *filter)
{
g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), FALSE);
return filter->temporary;
}
void void
gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter, gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter,
gdouble opacity) gdouble opacity)

View file

@ -69,6 +69,10 @@ GeglNode * gimp_drawable_filter_get_operation (GimpDrawableFilter *filter)
GimpDrawableFilterMask * GimpDrawableFilterMask *
gimp_drawable_filter_get_mask (GimpDrawableFilter *filter); gimp_drawable_filter_get_mask (GimpDrawableFilter *filter);
void gimp_drawable_filter_set_temporary (GimpDrawableFilter *filter,
gboolean temporary);
gboolean gimp_drawable_filter_get_temporary (GimpDrawableFilter *filter);
void gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter, void gimp_drawable_filter_set_opacity (GimpDrawableFilter *filter,
gdouble opacity); gdouble opacity);
gdouble gimp_drawable_filter_get_opacity (GimpDrawableFilter *filter); gdouble gimp_drawable_filter_get_opacity (GimpDrawableFilter *filter);

View file

@ -106,7 +106,8 @@ gimp_drawable_filter_undo_constructed (GObject *object)
G_OBJECT_CLASS (parent_class)->constructed (object); G_OBJECT_CLASS (parent_class)->constructed (object);
gimp_assert (GIMP_IS_DRAWABLE_FILTER (df_undo->filter)); gimp_assert (GIMP_IS_DRAWABLE_FILTER (df_undo->filter) &&
! gimp_drawable_filter_get_temporary (df_undo->filter));
drawable = gimp_drawable_filter_get_drawable (df_undo->filter); drawable = gimp_drawable_filter_get_drawable (df_undo->filter);
if (drawable) if (drawable)

View file

@ -320,6 +320,8 @@ gimp_image_undo_push_filter_add (GimpImage *image,
{ {
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL); g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL);
g_return_val_if_fail (gimp_drawable_filter_get_temporary (filter) == FALSE,
NULL);
return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO, return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO,
GIMP_UNDO_FILTER_ADD, undo_desc, GIMP_UNDO_FILTER_ADD, undo_desc,
@ -336,6 +338,8 @@ gimp_image_undo_push_filter_remove (GimpImage *image,
{ {
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL); g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL);
g_return_val_if_fail (gimp_drawable_filter_get_temporary (filter) == FALSE,
NULL);
return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO, return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO,
GIMP_UNDO_FILTER_REMOVE, undo_desc, GIMP_UNDO_FILTER_REMOVE, undo_desc,
@ -352,6 +356,8 @@ gimp_image_undo_push_filter_reorder (GimpImage *image,
{ {
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL); g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL);
g_return_val_if_fail (gimp_drawable_filter_get_temporary (filter) == FALSE,
NULL);
return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO, return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO,
GIMP_UNDO_FILTER_REORDER, undo_desc, GIMP_UNDO_FILTER_REORDER, undo_desc,
@ -368,6 +374,8 @@ gimp_image_undo_push_filter_modified (GimpImage *image,
{ {
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL); g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL); g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter), NULL);
g_return_val_if_fail (gimp_drawable_filter_get_temporary (filter) == FALSE,
NULL);
return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO, return gimp_image_undo_push (image, GIMP_TYPE_DRAWABLE_FILTER_UNDO,
GIMP_UNDO_FILTER_MODIFIED, undo_desc, GIMP_UNDO_FILTER_MODIFIED, undo_desc,

View file

@ -2063,7 +2063,8 @@ gimp_image_rec_filter_remove_undo (GimpImage *image,
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list)) filter_list = g_list_previous (filter_list))
{ {
if (GIMP_IS_DRAWABLE_FILTER (filter_list->data)) if (GIMP_IS_DRAWABLE_FILTER (filter_list->data) &&
! gimp_drawable_filter_get_temporary (filter_list->data))
{ {
GimpDrawableFilter *filter = filter_list->data; GimpDrawableFilter *filter = filter_list->data;

View file

@ -371,7 +371,7 @@ gimp_bucket_fill_tool_start (GimpBucketFillTool *tool,
tool->priv->filter = gimp_drawable_filter_new (drawables->data, _("Bucket fill"), tool->priv->filter = gimp_drawable_filter_new (drawables->data, _("Bucket fill"),
tool->priv->graph, tool->priv->graph,
GIMP_ICON_TOOL_BUCKET_FILL); GIMP_ICON_TOOL_BUCKET_FILL);
g_object_set (tool->priv->filter, "temporary", TRUE, NULL); gimp_drawable_filter_set_temporary (tool->priv->filter, TRUE);
gimp_drawable_filter_set_region (tool->priv->filter, gimp_drawable_filter_set_region (tool->priv->filter,
GIMP_FILTER_REGION_DRAWABLE); GIMP_FILTER_REGION_DRAWABLE);

View file

@ -1301,8 +1301,8 @@ gimp_cage_tool_create_filter (GimpCageTool *ct)
_("Cage transform"), _("Cage transform"),
ct->render_node, ct->render_node,
GIMP_ICON_TOOL_CAGE); GIMP_ICON_TOOL_CAGE);
gimp_drawable_filter_set_temporary (ct->filter, TRUE);
gimp_drawable_filter_set_region (ct->filter, GIMP_FILTER_REGION_DRAWABLE); gimp_drawable_filter_set_region (ct->filter, GIMP_FILTER_REGION_DRAWABLE);
g_object_set (ct->filter, "temporary", TRUE, NULL);
g_signal_connect (ct->filter, "flush", g_signal_connect (ct->filter, "flush",
G_CALLBACK (gimp_cage_tool_filter_flush), G_CALLBACK (gimp_cage_tool_filter_flush),

View file

@ -2200,12 +2200,13 @@ gimp_filter_tool_set_config (GimpFilterTool *filter_tool,
index); index);
} }
gimp_drawable_filter_set_temporary (filter_tool->filter, TRUE);
name = g_strdup_printf (_("Editing '%s'..."), name = g_strdup_printf (_("Editing '%s'..."),
gimp_object_get_name (filter_tool->existing_filter)); gimp_object_get_name (filter_tool->existing_filter));
g_object_set (filter_tool->filter, g_object_set (filter_tool->filter,
"name", name, "name", name,
"mask", mask, "mask", mask,
"temporary", TRUE,
NULL); NULL);
g_free (name); g_free (name);

View file

@ -1105,7 +1105,7 @@ gimp_gradient_tool_create_filter (GimpGradientTool *gradient_tool,
C_("undo-type", "Gradient"), C_("undo-type", "Gradient"),
gradient_tool->graph, gradient_tool->graph,
GIMP_ICON_TOOL_GRADIENT); GIMP_ICON_TOOL_GRADIENT);
g_object_set (gradient_tool->filter, "temporary", TRUE, NULL); gimp_drawable_filter_set_temporary (gradient_tool->filter, TRUE);
gimp_drawable_filter_set_region (gradient_tool->filter, gimp_drawable_filter_set_region (gradient_tool->filter,
GIMP_FILTER_REGION_DRAWABLE); GIMP_FILTER_REGION_DRAWABLE);

View file

@ -755,7 +755,7 @@ gimp_seamless_clone_tool_create_filter (GimpSeamlessCloneTool *sc,
_("Seamless Clone"), _("Seamless Clone"),
sc->render_node, sc->render_node,
GIMP_ICON_TOOL_SEAMLESS_CLONE); GIMP_ICON_TOOL_SEAMLESS_CLONE);
g_object_set (sc->filter, "temporary", TRUE, NULL); gimp_drawable_filter_set_temporary (sc->filter, TRUE);
gimp_drawable_filter_set_region (sc->filter, GIMP_FILTER_REGION_DRAWABLE); gimp_drawable_filter_set_region (sc->filter, GIMP_FILTER_REGION_DRAWABLE);

View file

@ -2045,7 +2045,7 @@ filter_new (GimpTransformGridTool *tg_tool,
GIMP_TRANSFORM_TOOL_GET_CLASS (tg_tool)->undo_desc, GIMP_TRANSFORM_TOOL_GET_CLASS (tg_tool)->undo_desc,
node, node,
gimp_tool_get_icon_name (GIMP_TOOL (tg_tool))); gimp_tool_get_icon_name (GIMP_TOOL (tg_tool)));
g_object_set (filter->filter, "temporary", TRUE, NULL); gimp_drawable_filter_set_temporary (filter->filter, TRUE);
gimp_drawable_filter_set_clip (filter->filter, FALSE); gimp_drawable_filter_set_clip (filter->filter, FALSE);
gimp_drawable_filter_set_override_constraints (filter->filter, TRUE); gimp_drawable_filter_set_override_constraints (filter->filter, TRUE);

View file

@ -1091,7 +1091,7 @@ gimp_warp_tool_create_filter (GimpWarpTool *wt,
_("Warp transform"), _("Warp transform"),
wt->graph, wt->graph,
GIMP_ICON_TOOL_WARP); GIMP_ICON_TOOL_WARP);
g_object_set (wt->filter, "temporary", TRUE, NULL); gimp_drawable_filter_set_temporary (wt->filter, TRUE);
gimp_drawable_filter_set_region (wt->filter, GIMP_FILTER_REGION_DRAWABLE); gimp_drawable_filter_set_region (wt->filter, GIMP_FILTER_REGION_DRAWABLE);

View file

@ -596,7 +596,7 @@ gimp_drawable_filters_editor_view_visible_cell_toggled (GtkCellRendererToggle *t
visible = gimp_filter_get_active (GIMP_FILTER (filter)); visible = gimp_filter_get_active (GIMP_FILTER (filter));
gimp_filter_set_active (GIMP_FILTER (filter), ! visible); gimp_filter_set_active (GIMP_FILTER (filter), ! visible);
gimp_drawable_update (drawable, 0, 0, -1, -1); gimp_drawable_update_bounding_box (drawable);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable))); gimp_image_flush (gimp_item_get_image (GIMP_ITEM (drawable)));
} }
} }
@ -671,7 +671,7 @@ gimp_drawable_filters_editor_visible_all_toggled (GtkWidget *widget,
} }
} }
gimp_drawable_update (editor->drawable, 0, 0, -1, -1); gimp_drawable_update_bounding_box (editor->drawable);
gimp_image_flush (gimp_item_get_image (GIMP_ITEM (editor->drawable))); gimp_image_flush (gimp_item_get_image (GIMP_ITEM (editor->drawable)));
} }

View file

@ -1964,7 +1964,8 @@ xcf_save_layer (XcfInfo *info,
for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list; for (filter_list = GIMP_LIST (filters)->queue->tail; filter_list;
filter_list = g_list_previous (filter_list)) filter_list = g_list_previous (filter_list))
{ {
if (GIMP_IS_DRAWABLE_FILTER (filter_list->data)) if (GIMP_IS_DRAWABLE_FILTER (filter_list->data) &&
! gimp_drawable_filter_get_temporary (filter_list->data))
{ {
GimpDrawableFilter *filter = filter_list->data; GimpDrawableFilter *filter = filter_list->data;
GimpDrawableFilterMask *mask = NULL; GimpDrawableFilterMask *mask = NULL;
@ -2038,7 +2039,8 @@ xcf_save_layer (XcfInfo *info,
for (list = GIMP_LIST (filters)->queue->head; list; for (list = GIMP_LIST (filters)->queue->head; list;
list = g_list_next (list)) list = g_list_next (list))
{ {
if (GIMP_IS_DRAWABLE_FILTER (list->data)) if (GIMP_IS_DRAWABLE_FILTER (list->data) &&
! gimp_drawable_filter_get_temporary (list->data))
{ {
GimpDrawableFilter *filter = list->data; GimpDrawableFilter *filter = list->data;
GimpDrawableFilterMask *mask = NULL; GimpDrawableFilterMask *mask = NULL;