app: factorize auto-rename code into GimpRasterizable.

Rasterizable objects are all created from some side data and can be
renamed automatically based on this data (from the link file for link
layers; from the path for vector layers; from the text for text layers).

So let's share code.
This commit is contained in:
Jehan 2025-10-22 22:29:19 +02:00
parent 5356e86a06
commit 1235bf00bd
9 changed files with 144 additions and 155 deletions

View file

@ -2572,12 +2572,9 @@ layers_edit_attributes_callback (GtkWidget *dialog,
gimp_image_flush (image);
}
if (gimp_item_is_text_layer (GIMP_ITEM (layer)))
{
g_object_set (layer,
"auto-rename", rename_text_layer,
NULL);
}
if (GIMP_IS_RASTERIZABLE (layer))
gimp_rasterizable_set_auto_rename (GIMP_RASTERIZABLE (layer),
rename_text_layer);
gtk_widget_destroy (dialog);
}

View file

@ -42,7 +42,6 @@
#include "gimpimage-color-profile.h"
#include "gimpimage-undo.h"
#include "gimpimage-undo-push.h"
#include "gimpitemtree.h"
#include "gimplink.h"
#include "gimplinklayer.h"
#include "gimpobjectqueue.h"
@ -65,7 +64,6 @@ enum
{
PROP_0,
PROP_LINK,
PROP_AUTO_RENAME,
PROP_SCALED_ONLY,
N_PROPS
};
@ -74,7 +72,6 @@ struct _GimpLinkLayerPrivate
{
GimpLink *link;
gboolean scaled_only;
gboolean auto_rename;
GimpMatrix3 matrix;
gint offset_x;
@ -105,10 +102,6 @@ static gint64 gimp_link_layer_get_memsize (GimpObject *object,
static GimpItem * gimp_link_layer_duplicate (GimpItem *item,
GType new_type);
static gboolean gimp_link_layer_rename (GimpItem *item,
const gchar *new_name,
const gchar *undo_desc,
GError **error);
static void gimp_link_layer_translate (GimpItem *item,
gdouble offset_x,
@ -199,7 +192,7 @@ gimp_link_layer_class_init (GimpLinkLayerClass *klass)
viewable_class->default_name = _("Link Layer");
item_class->duplicate = gimp_link_layer_duplicate;
item_class->rename = gimp_link_layer_rename;
item_class->rename = gimp_rasterizable_rename;
item_class->translate = gimp_link_layer_translate;
item_class->scale = gimp_link_layer_scale;
item_class->transform = gimp_link_layer_transform;
@ -223,12 +216,6 @@ gimp_link_layer_class_init (GimpLinkLayerClass *klass)
GIMP_PARAM_READWRITE |
GIMP_PARAM_STATIC_STRINGS);
link_layer_props[PROP_AUTO_RENAME] = g_param_spec_boolean ("auto-rename",
NULL, NULL,
TRUE,
GIMP_PARAM_READWRITE |
GIMP_PARAM_STATIC_STRINGS);
link_layer_props[PROP_SCALED_ONLY] = g_param_spec_boolean ("scaled-only",
NULL, NULL,
FALSE,
@ -246,7 +233,6 @@ gimp_link_layer_init (GimpLinkLayer *layer)
gimp_matrix3_identity (&layer->p->matrix);
layer->p->scaled_only = FALSE;
layer->p->auto_rename = FALSE;
layer->p->offset_x = 0;
layer->p->offset_y = 0;
layer->p->interpolation = GIMP_INTERPOLATION_NONE;
@ -283,9 +269,6 @@ gimp_link_layer_get_property (GObject *object,
case PROP_LINK:
g_value_set_object (value, layer->p->link);
break;
case PROP_AUTO_RENAME:
g_value_set_boolean (value, layer->p->auto_rename);
break;
case PROP_SCALED_ONLY:
g_value_set_boolean (value, layer->p->scaled_only);
break;
@ -309,9 +292,6 @@ gimp_link_layer_set_property (GObject *object,
case PROP_LINK:
gimp_link_layer_set_link (layer, g_value_get_object (value), FALSE);
break;
case PROP_AUTO_RENAME:
layer->p->auto_rename = g_value_get_boolean (value);
break;
case PROP_SCALED_ONLY:
layer->p->scaled_only = g_value_get_boolean (value);
break;
@ -389,7 +369,8 @@ gimp_link_layer_duplicate (GimpItem *item,
gimp_drawable_get_buffer (GIMP_DRAWABLE (new_layer)), NULL);
new_layer->p->scaled_only = layer->p->scaled_only;
new_layer->p->auto_rename = layer->p->auto_rename;
gimp_rasterizable_set_auto_rename (GIMP_RASTERIZABLE (new_layer),
gimp_rasterizable_get_auto_rename (GIMP_RASTERIZABLE (layer)));
new_layer->p->matrix = layer->p->matrix;
new_layer->p->offset_x = layer->p->offset_x;
new_layer->p->offset_y = layer->p->offset_y;
@ -406,22 +387,6 @@ gimp_link_layer_duplicate (GimpItem *item,
return new_item;
}
static gboolean
gimp_link_layer_rename (GimpItem *item,
const gchar *new_name,
const gchar *undo_desc,
GError **error)
{
if (GIMP_ITEM_CLASS (parent_class)->rename (item, new_name, undo_desc, error))
{
g_object_set (item, "auto-rename", FALSE, NULL);
return TRUE;
}
return FALSE;
}
static void
gimp_link_layer_translate (GimpItem *item,
gdouble offset_x,
@ -945,9 +910,8 @@ gimp_link_layer_set_xcf_flags (GimpLinkLayer *layer,
{
g_return_if_fail (GIMP_IS_LINK_LAYER (layer));
g_object_set (layer,
"auto-rename", (flags & LINK_LAYER_XCF_DONT_AUTO_RENAME) == 0,
NULL);
gimp_rasterizable_set_auto_rename (GIMP_RASTERIZABLE (layer),
(flags & LINK_LAYER_XCF_DONT_AUTO_RENAME) == 0);
if ((flags & LINK_LAYER_XCF_MODIFIED) != 0)
gimp_link_freeze (layer->p->link);
@ -960,7 +924,7 @@ gimp_link_layer_get_xcf_flags (GimpLinkLayer *link_layer)
g_return_val_if_fail (GIMP_IS_LINK_LAYER (link_layer), 0);
if (! link_layer->p->auto_rename)
if (! gimp_rasterizable_get_auto_rename (GIMP_RASTERIZABLE (link_layer)))
flags |= LINK_LAYER_XCF_DONT_AUTO_RENAME;
if (! gimp_link_is_monitored (link_layer->p->link))
@ -1060,33 +1024,9 @@ gimp_link_layer_render_link (GimpLinkLayer *layer)
}
}
if (layer->p->auto_rename)
{
GimpItem *item = GIMP_ITEM (layer);
gchar *name = NULL;
if (layer->p->link)
{
name = g_strdup (gimp_object_get_name (layer->p->link));
}
if (! name || ! name[0])
{
g_free (name);
name = g_strdup (_("Link Layer"));
}
if (gimp_item_is_attached (item))
{
gimp_item_tree_rename_item (gimp_item_get_tree (item), item,
name, FALSE, NULL);
g_free (name);
}
else
{
gimp_object_take_name (GIMP_OBJECT (layer), name);
}
}
gimp_rasterizable_auto_rename (GIMP_RASTERIZABLE (layer),
GIMP_OBJECT (layer->p->link),
NULL);
gimp_gegl_buffer_copy (buffer, NULL, GEGL_ABYSS_NONE,
gimp_drawable_get_buffer (drawable), NULL);

View file

@ -27,6 +27,7 @@
#include "gimpimage.h"
#include "gimpimage-undo.h"
#include "gimpimage-undo-push.h"
#include "gimpitemtree.h"
#include "gimprasterizable.h"
#include "gimp-intl.h"
@ -44,6 +45,7 @@ typedef struct _GimpRasterizablePrivate GimpRasterizablePrivate;
struct _GimpRasterizablePrivate
{
gboolean rasterized;
gboolean auto_rename;
};
#define GIMP_RASTERIZABLE_GET_PRIVATE(obj) (gimp_rasterizable_get_private ((GimpRasterizable *) (obj)))
@ -165,6 +167,85 @@ gimp_rasterizable_is_rasterized (GimpRasterizable *rasterizable)
return private->rasterized;
}
void
gimp_rasterizable_set_auto_rename (GimpRasterizable *rasterizable,
gboolean auto_rename)
{
GimpRasterizablePrivate *private;
g_return_if_fail (GIMP_IS_RASTERIZABLE (rasterizable));
private = GIMP_RASTERIZABLE_GET_PRIVATE (rasterizable);
private->auto_rename = auto_rename;
}
gboolean
gimp_rasterizable_get_auto_rename (GimpRasterizable *rasterizable)
{
GimpRasterizablePrivate *private;
g_return_val_if_fail (GIMP_IS_RASTERIZABLE (rasterizable), TRUE);
private = GIMP_RASTERIZABLE_GET_PRIVATE (rasterizable);
return private->auto_rename;
}
gboolean
gimp_rasterizable_rename (GimpItem *item,
const gchar *new_name,
const gchar *undo_desc,
GError **error)
{
GTypeClass *klass;
GTypeClass *parent_class;
klass = g_type_class_peek (G_TYPE_FROM_INSTANCE (item));
parent_class = g_type_class_peek_parent (klass);
if (GIMP_ITEM_CLASS (parent_class)->rename (item, new_name, undo_desc, error))
{
gimp_rasterizable_set_auto_rename (GIMP_RASTERIZABLE (item), FALSE);
return TRUE;
}
return FALSE;
}
void
gimp_rasterizable_auto_rename (GimpRasterizable *rasterizable,
GimpObject *rename_data,
const gchar *rename_string)
{
if (gimp_rasterizable_get_auto_rename (rasterizable))
{
GimpItem *item = GIMP_ITEM (rasterizable);
gchar *name = NULL;
if (rename_data)
name = g_strdup (gimp_object_get_name (rename_data));
else if (rename_string)
name = g_strdup (rename_string);
if (! name || ! name[0])
{
g_free (name);
name = g_strdup (GIMP_VIEWABLE_GET_CLASS (rasterizable)->default_name);
}
if (gimp_item_is_attached (item))
{
gimp_item_tree_rename_item (gimp_item_get_tree (item), item,
name, FALSE, NULL);
g_free (name);
}
else
{
gimp_object_take_name (GIMP_OBJECT (rasterizable), name);
}
}
}
void
gimp_rasterizable_set_undo_rasterized (GimpRasterizable *rasterizable,
gboolean rasterized)
@ -198,6 +279,9 @@ gimp_rasterizable_get_private (GimpRasterizable *rasterizable)
{
private = g_slice_new0 (GimpRasterizablePrivate);
private->rasterized = FALSE;
private->auto_rename = TRUE;
g_object_set_qdata_full ((GObject *) rasterizable, private_key, private,
(GDestroyNotify) gimp_rasterizable_private_finalize);
}

View file

@ -31,17 +31,31 @@ struct _GimpRasterizableInterface
GTypeInterface base_iface;
/* signals */
void (* set_rasterized) (GimpRasterizable *rasterizable,
gboolean rasterized);
void (* set_rasterized) (GimpRasterizable *rasterizable,
gboolean rasterized);
};
void gimp_rasterizable_rasterize (GimpRasterizable *rasterizable);
void gimp_rasterizable_restore (GimpRasterizable *rasterizable);
void gimp_rasterizable_rasterize (GimpRasterizable *rasterizable);
void gimp_rasterizable_restore (GimpRasterizable *rasterizable);
gboolean gimp_rasterizable_is_rasterized (GimpRasterizable *rasterizable);
gboolean gimp_rasterizable_is_rasterized (GimpRasterizable *rasterizable);
void gimp_rasterizable_set_auto_rename (GimpRasterizable *rasterizable,
gboolean auto_rename);
gboolean gimp_rasterizable_get_auto_rename (GimpRasterizable *rasterizable);
/* Overwrite rename() of GimpItemClass of all children. */
gboolean gimp_rasterizable_rename (GimpItem *item,
const gchar *new_name,
const gchar *undo_desc,
GError **error);
/* Shared code to rename the rasterizable. */
void gimp_rasterizable_auto_rename (GimpRasterizable *rasterizable,
GimpObject *rename_data,
const gchar *rename_string);
/* To be used for undo steps only */
void gimp_rasterizable_set_undo_rasterized (GimpRasterizable *rasterizable,
gboolean rasterize);
void gimp_rasterizable_set_undo_rasterized (GimpRasterizable *rasterizable,
gboolean rasterize);

View file

@ -34,6 +34,7 @@
#include "core/gimplayer.h"
#include "core/gimplink.h"
#include "core/gimplinklayer.h"
#include "core/gimprasterizable.h"
#include "path/gimppath.h"
#include "path/gimpvectorlayer.h"
@ -179,7 +180,7 @@ layer_options_dialog_new (GimpImage *image,
private->initial_path = NULL;
if (layer && gimp_item_is_text_layer (GIMP_ITEM (layer)))
private->rename_text_layers = GIMP_TEXT_LAYER (layer)->auto_rename;
private->rename_text_layers = gimp_rasterizable_get_auto_rename (GIMP_RASTERIZABLE (layer));
dialog = item_options_dialog_new (image, GIMP_ITEM (layer), context,
parent, title, role,

View file

@ -174,6 +174,7 @@ gimp_vector_layer_class_init (GimpVectorLayerClass *klass)
item_class->removed = gimp_vector_layer_removed;
item_class->duplicate = gimp_vector_layer_duplicate;
item_class->rename = gimp_rasterizable_rename;
item_class->scale = gimp_vector_layer_scale;
item_class->flip = gimp_vector_layer_flip;
item_class->rotate = gimp_vector_layer_rotate;
@ -795,6 +796,10 @@ gimp_vector_layer_render_path (GimpVectorLayer *layer)
g_list_free (drawables);
gimp_rasterizable_auto_rename (GIMP_RASTERIZABLE (layer),
GIMP_OBJECT (layer->options->path),
NULL);
gimp_selection_resume (GIMP_SELECTION (selection));
}

View file

@ -151,7 +151,7 @@ gimp_text_layer_get_xcf_flags (GimpTextLayer *text_layer)
g_return_val_if_fail (GIMP_IS_TEXT_LAYER (text_layer), 0);
if (! text_layer->auto_rename)
if (! gimp_rasterizable_get_auto_rename (GIMP_RASTERIZABLE (text_layer)))
flags |= TEXT_LAYER_XCF_DONT_AUTO_RENAME;
if (gimp_rasterizable_is_rasterized (GIMP_RASTERIZABLE (text_layer)))
@ -166,9 +166,8 @@ gimp_text_layer_set_xcf_flags (GimpTextLayer *text_layer,
{
g_return_if_fail (GIMP_IS_TEXT_LAYER (text_layer));
g_object_set (text_layer,
"auto-rename", (flags & TEXT_LAYER_XCF_DONT_AUTO_RENAME) == 0,
NULL);
gimp_rasterizable_set_auto_rename (GIMP_RASTERIZABLE (text_layer),
(flags & TEXT_LAYER_XCF_DONT_AUTO_RENAME) == 0);
if ((flags & TEXT_LAYER_XCF_MODIFIED) != 0)
gimp_rasterizable_rasterize (GIMP_RASTERIZABLE (text_layer));

View file

@ -46,7 +46,6 @@
#include "core/gimpimage-color-profile.h"
#include "core/gimpimage-undo.h"
#include "core/gimpimage-undo-push.h"
#include "core/gimpitemtree.h"
#include "core/gimpparasitelist.h"
#include "core/gimppattern.h"
#include "core/gimprasterizable.h"
@ -64,7 +63,6 @@ enum
{
PROP_0,
PROP_TEXT,
PROP_AUTO_RENAME,
};
struct _GimpTextLayerPrivate
@ -95,10 +93,6 @@ static void gimp_text_layer_size_changed (GimpViewable *viewable);
static GimpItem * gimp_text_layer_duplicate (GimpItem *item,
GType new_type);
static gboolean gimp_text_layer_rename (GimpItem *item,
const gchar *new_name,
const gchar *undo_desc,
GError **error);
static void gimp_text_layer_set_buffer (GimpDrawable *drawable,
gboolean push_undo,
@ -158,7 +152,7 @@ gimp_text_layer_class_init (GimpTextLayerClass *klass)
viewable_class->size_changed = gimp_text_layer_size_changed;
item_class->duplicate = gimp_text_layer_duplicate;
item_class->rename = gimp_text_layer_rename;
item_class->rename = gimp_rasterizable_rename;
#if 0
item_class->scale = gimp_text_layer_scale;
@ -185,12 +179,6 @@ gimp_text_layer_class_init (GimpTextLayerClass *klass)
NULL, NULL,
GIMP_TYPE_TEXT,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_AUTO_RENAME,
"auto-rename",
NULL, NULL,
TRUE,
GIMP_PARAM_STATIC_STRINGS);
}
static void
@ -231,9 +219,6 @@ gimp_text_layer_get_property (GObject *object,
case PROP_TEXT:
g_value_set_object (value, text_layer->text);
break;
case PROP_AUTO_RENAME:
g_value_set_boolean (value, text_layer->auto_rename);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@ -254,9 +239,6 @@ gimp_text_layer_set_property (GObject *object,
case PROP_TEXT:
gimp_text_layer_set_text (text_layer, g_value_get_object (value));
break;
case PROP_AUTO_RENAME:
text_layer->auto_rename = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@ -333,6 +315,8 @@ gimp_text_layer_duplicate (GimpItem *item,
}
new_layer->private->base_dir = layer->private->base_dir;
gimp_rasterizable_set_auto_rename (GIMP_RASTERIZABLE (new_layer),
gimp_rasterizable_get_auto_rename (GIMP_RASTERIZABLE (layer)));
if (gimp_rasterizable_is_rasterized (GIMP_RASTERIZABLE (layer)))
gimp_rasterizable_set_undo_rasterized (GIMP_RASTERIZABLE (new_layer), TRUE);
@ -341,22 +325,6 @@ gimp_text_layer_duplicate (GimpItem *item,
return new_item;
}
static gboolean
gimp_text_layer_rename (GimpItem *item,
const gchar *new_name,
const gchar *undo_desc,
GError **error)
{
if (GIMP_ITEM_CLASS (parent_class)->rename (item, new_name, undo_desc, error))
{
g_object_set (item, "auto-rename", FALSE, NULL);
return TRUE;
}
return FALSE;
}
static void
gimp_text_layer_set_buffer (GimpDrawable *drawable,
gboolean push_undo,
@ -700,6 +668,7 @@ gimp_text_layer_render (GimpTextLayer *layer)
GimpImage *image;
GimpContainer *container;
GimpTextLayout *layout;
gchar *name = NULL;
gdouble xres;
gdouble yres;
gint width;
@ -763,39 +732,19 @@ gimp_text_layer_render (GimpTextLayer *layer)
}
}
if (layer->auto_rename)
if (layer->text->text)
{
GimpItem *item = GIMP_ITEM (layer);
gchar *name = NULL;
if (layer->text->text)
{
name = gimp_utf8_strtrim (layer->text->text, 30);
}
else if (layer->text->markup)
{
gchar *tmp = gimp_markup_extract_text (layer->text->markup);
name = gimp_utf8_strtrim (tmp, 30);
g_free (tmp);
}
if (! name || ! name[0])
{
g_free (name);
name = g_strdup (_("Empty Text Layer"));
}
if (gimp_item_is_attached (item))
{
gimp_item_tree_rename_item (gimp_item_get_tree (item), item,
name, FALSE, NULL);
g_free (name);
}
else
{
gimp_object_take_name (GIMP_OBJECT (layer), name);
}
name = gimp_utf8_strtrim (layer->text->text, 30);
}
else if (layer->text->markup)
{
gchar *tmp = gimp_markup_extract_text (layer->text->markup);
name = gimp_utf8_strtrim (tmp, 30);
g_free (tmp);
}
gimp_rasterizable_auto_rename (GIMP_RASTERIZABLE (layer), NULL, name);
g_free (name);
if (width > 0 && height > 0)
gimp_text_layer_render_layout (layer, layout);

View file

@ -330,7 +330,7 @@ gimp_text_tool_remove_empty_text_layer (GimpTextTool *text_tool)
{
GimpTextLayer *text_layer = text_tool->layer;
if (text_layer && text_layer->auto_rename)
if (text_layer && gimp_rasterizable_get_auto_rename (GIMP_RASTERIZABLE (text_layer)))
{
GimpText *text = gimp_text_layer_get_text (text_layer);