diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c index 6157a4ff24..e33d42db76 100644 --- a/app/actions/layers-commands.c +++ b/app/actions/layers-commands.c @@ -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); } diff --git a/app/core/gimplinklayer.c b/app/core/gimplinklayer.c index 9e4c61b39b..f4fc7efa53 100644 --- a/app/core/gimplinklayer.c +++ b/app/core/gimplinklayer.c @@ -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); diff --git a/app/core/gimprasterizable.c b/app/core/gimprasterizable.c index 8a96e75111..ee8122f31b 100644 --- a/app/core/gimprasterizable.c +++ b/app/core/gimprasterizable.c @@ -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); } diff --git a/app/core/gimprasterizable.h b/app/core/gimprasterizable.h index d9920e18ec..b5eb0c2705 100644 --- a/app/core/gimprasterizable.h +++ b/app/core/gimprasterizable.h @@ -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); diff --git a/app/dialogs/layer-options-dialog.c b/app/dialogs/layer-options-dialog.c index 1ee42b95f5..16d3e99b74 100644 --- a/app/dialogs/layer-options-dialog.c +++ b/app/dialogs/layer-options-dialog.c @@ -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, diff --git a/app/path/gimpvectorlayer.c b/app/path/gimpvectorlayer.c index 9da241ea3f..24ed8e7f5d 100644 --- a/app/path/gimpvectorlayer.c +++ b/app/path/gimpvectorlayer.c @@ -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)); } diff --git a/app/text/gimptextlayer-xcf.c b/app/text/gimptextlayer-xcf.c index 313e17d8ae..1e44bb6044 100644 --- a/app/text/gimptextlayer-xcf.c +++ b/app/text/gimptextlayer-xcf.c @@ -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)); diff --git a/app/text/gimptextlayer.c b/app/text/gimptextlayer.c index 890fd33db9..f08b446e7d 100644 --- a/app/text/gimptextlayer.c +++ b/app/text/gimptextlayer.c @@ -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); diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c index c419e4ce30..0a2b202822 100644 --- a/app/tools/gimptexttool.c +++ b/app/tools/gimptexttool.c @@ -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);