[gimp] Bug 343090 - Most brushes and all patterns appear renameable but aren't



commit 82a27545406480235d874dc91b0d2803cf492905
Author: Michael Natterer <mitch gimp org>
Date:   Wed Nov 16 15:13:08 2016 +0100

    Bug 343090 - Most brushes and all patterns appear renameable but aren't
    
    Introduce virtual function GimpViewable::is_name_editable() and class
    member "gboolean name_editable" for the default value. Default to
    FALSE and only return TRUE if the name can actually be edited by the
    user.
    
    When attemting an edit, check the new API and beep instead of starting
    the edit.

 app/core/gimpbuffer.c               |    1 +
 app/core/gimpdata.c                 |   36 +++++++++++++++++++---------
 app/core/gimpitem.c                 |    2 +
 app/core/gimpsettings.c             |    9 ++++--
 app/core/gimptemplate.c             |    1 +
 app/core/gimpviewable.c             |   23 ++++++++++++++++++
 app/core/gimpviewable.h             |    6 ++++
 app/widgets/gimpcontainertreeview.c |   44 +++++++++++++++++++++++++++-------
 8 files changed, 98 insertions(+), 24 deletions(-)
---
diff --git a/app/core/gimpbuffer.c b/app/core/gimpbuffer.c
index 7889105..800408d 100644
--- a/app/core/gimpbuffer.c
+++ b/app/core/gimpbuffer.c
@@ -95,6 +95,7 @@ gimp_buffer_class_init (GimpBufferClass *klass)
   gimp_object_class->get_memsize    = gimp_buffer_get_memsize;
 
   viewable_class->default_icon_name = "edit-paste";
+  viewable_class->name_editable     = TRUE;
   viewable_class->get_size          = gimp_buffer_get_size;
   viewable_class->get_preview_size  = gimp_buffer_get_preview_size;
   viewable_class->get_popup_size    = gimp_buffer_get_popup_size;
diff --git a/app/core/gimpdata.c b/app/core/gimpdata.c
index 85073cd..8af8160 100644
--- a/app/core/gimpdata.c
+++ b/app/core/gimpdata.c
@@ -98,6 +98,8 @@ static void      gimp_data_name_changed      (GimpObject          *object);
 static gint64    gimp_data_get_memsize       (GimpObject          *object,
                                               gint64              *gui_size);
 
+static gboolean  gimp_data_is_name_editable  (GimpViewable        *viewable);
+
 static void      gimp_data_real_dirty        (GimpData            *data);
 
 static gboolean  gimp_data_add_tag           (GimpTagged          *tagged,
@@ -154,8 +156,9 @@ gimp_data_get_type (void)
 static void
 gimp_data_class_init (GimpDataClass *klass)
 {
-  GObjectClass    *object_class      = G_OBJECT_CLASS (klass);
-  GimpObjectClass *gimp_object_class = GIMP_OBJECT_CLASS (klass);
+  GObjectClass      *object_class      = G_OBJECT_CLASS (klass);
+  GimpObjectClass   *gimp_object_class = GIMP_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class    = GIMP_VIEWABLE_CLASS (klass);
 
   parent_class = g_type_class_peek_parent (klass);
 
@@ -168,18 +171,21 @@ gimp_data_class_init (GimpDataClass *klass)
                   gimp_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
 
-  object_class->constructed       = gimp_data_constructed;
-  object_class->finalize          = gimp_data_finalize;
-  object_class->set_property      = gimp_data_set_property;
-  object_class->get_property      = gimp_data_get_property;
+  object_class->constructed        = gimp_data_constructed;
+  object_class->finalize           = gimp_data_finalize;
+  object_class->set_property       = gimp_data_set_property;
+  object_class->get_property       = gimp_data_get_property;
+
+  gimp_object_class->name_changed  = gimp_data_name_changed;
+  gimp_object_class->get_memsize   = gimp_data_get_memsize;
 
-  gimp_object_class->name_changed = gimp_data_name_changed;
-  gimp_object_class->get_memsize  = gimp_data_get_memsize;
+  viewable_class->name_editable    = TRUE;
+  viewable_class->is_name_editable = gimp_data_is_name_editable;
 
-  klass->dirty                    = gimp_data_real_dirty;
-  klass->save                     = NULL;
-  klass->get_extension            = NULL;
-  klass->duplicate                = NULL;
+  klass->dirty                     = gimp_data_real_dirty;
+  klass->save                      = NULL;
+  klass->get_extension             = NULL;
+  klass->duplicate                 = NULL;
 
   g_object_class_install_property (object_class, PROP_FILE,
                                    g_param_spec_object ("file", NULL, NULL,
@@ -364,6 +370,12 @@ gimp_data_get_memsize (GimpObject *object,
                                                                   gui_size);
 }
 
+static gboolean
+gimp_data_is_name_editable (GimpViewable *viewable)
+{
+  return gimp_data_is_writable (GIMP_DATA (viewable));
+}
+
 static void
 gimp_data_real_dirty (GimpData *data)
 {
diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c
index 7d705af..ab36f52 100644
--- a/app/core/gimpitem.c
+++ b/app/core/gimpitem.c
@@ -158,6 +158,7 @@ static void       gimp_item_real_resize             (GimpItem       *item,
                                                      gint            offset_y);
 
 
+
 G_DEFINE_TYPE (GimpItem, gimp_item, GIMP_TYPE_FILTER)
 
 #define parent_class gimp_item_parent_class
@@ -224,6 +225,7 @@ gimp_item_class_init (GimpItemClass *klass)
 
   gimp_object_class->get_memsize   = gimp_item_get_memsize;
 
+  viewable_class->name_editable    = TRUE;
   viewable_class->get_preview_size = gimp_item_get_preview_size;
   viewable_class->get_popup_size   = gimp_item_get_popup_size;
 
diff --git a/app/core/gimpsettings.c b/app/core/gimpsettings.c
index 1a7db22..9e89f0b 100644
--- a/app/core/gimpsettings.c
+++ b/app/core/gimpsettings.c
@@ -57,10 +57,13 @@ G_DEFINE_TYPE (GimpSettings, gimp_settings, GIMP_TYPE_VIEWABLE)
 static void
 gimp_settings_class_init (GimpSettingsClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
 
-  object_class->set_property = gimp_settings_set_property;
-  object_class->get_property = gimp_settings_get_property;
+  object_class->set_property    = gimp_settings_set_property;
+  object_class->get_property    = gimp_settings_get_property;
+
+  viewable_class->name_editable = TRUE;
 
   GIMP_CONFIG_PROP_UINT (object_class, PROP_TIME,
                          "time",
diff --git a/app/core/gimptemplate.c b/app/core/gimptemplate.c
index cd19cf4..3984030 100644
--- a/app/core/gimptemplate.c
+++ b/app/core/gimptemplate.c
@@ -128,6 +128,7 @@ gimp_template_class_init (GimpTemplateClass *klass)
   object_class->notify       = gimp_template_notify;
 
   viewable_class->default_icon_name = "gimp-template";
+  viewable_class->name_editable     = TRUE;
 
   GIMP_CONFIG_PROP_INT (object_class, PROP_WIDTH,
                         "width",
diff --git a/app/core/gimpviewable.c b/app/core/gimpviewable.c
index bdb535a..b6d7ee2 100644
--- a/app/core/gimpviewable.c
+++ b/app/core/gimpviewable.c
@@ -111,6 +111,7 @@ static gboolean gimp_viewable_real_get_popup_size    (GimpViewable  *viewable,
                                                       gint          *popup_height);
 static gchar * gimp_viewable_real_get_description    (GimpViewable  *viewable,
                                                       gchar        **tooltip);
+static gboolean gimp_viewable_real_is_name_editable  (GimpViewable  *viewable);
 static GimpContainer * gimp_viewable_real_get_children (GimpViewable *viewable);
 
 static gboolean gimp_viewable_serialize_property     (GimpConfig    *config,
@@ -167,6 +168,7 @@ gimp_viewable_class_init (GimpViewableClass *klass)
 
   klass->default_icon_name       = "gimp-question";
   klass->name_changed_signal     = "name-changed";
+  klass->name_editable           = FALSE;
 
   klass->invalidate_preview      = gimp_viewable_real_invalidate_preview;
   klass->size_changed            = NULL;
@@ -179,6 +181,7 @@ gimp_viewable_class_init (GimpViewableClass *klass)
   klass->get_pixbuf              = NULL;
   klass->get_new_pixbuf          = gimp_viewable_real_get_new_pixbuf;
   klass->get_description         = gimp_viewable_real_get_description;
+  klass->is_name_editable        = gimp_viewable_real_is_name_editable;
   klass->get_children            = gimp_viewable_real_get_children;
   klass->set_expanded            = NULL;
   klass->get_expanded            = NULL;
@@ -421,6 +424,12 @@ gimp_viewable_real_get_description (GimpViewable  *viewable,
   return g_strdup (gimp_object_get_name (viewable));
 }
 
+static gboolean
+gimp_viewable_real_is_name_editable (GimpViewable *viewable)
+{
+  return GIMP_VIEWABLE_GET_CLASS (viewable)->name_editable;
+}
+
 static GimpContainer *
 gimp_viewable_real_get_children (GimpViewable *viewable)
 {
@@ -1150,6 +1159,20 @@ gimp_viewable_get_description (GimpViewable  *viewable,
 }
 
 /**
+ * gimp_viewable_is_name_editable:
+ * @viewable: viewable object for which to retrieve a description.
+ *
+ * Returns: whether the viewable's name is editable by the user.
+ **/
+gboolean
+gimp_viewable_is_name_editable (GimpViewable *viewable)
+{
+  g_return_val_if_fail (GIMP_IS_VIEWABLE (viewable), FALSE);
+
+  return GIMP_VIEWABLE_GET_CLASS (viewable)->is_name_editable (viewable);
+}
+
+/**
  * gimp_viewable_get_icon_name:
  * @viewable: viewable object for which to retrieve a icon name.
  *
diff --git a/app/core/gimpviewable.h b/app/core/gimpviewable.h
index cb55175..2d42ec8 100644
--- a/app/core/gimpviewable.h
+++ b/app/core/gimpviewable.h
@@ -52,6 +52,7 @@ struct _GimpViewableClass
 
   const gchar     *default_icon_name;
   const gchar     *name_changed_signal;
+  gboolean         name_editable;
 
   /*  signals  */
   void            (* invalidate_preview) (GimpViewable  *viewable);
@@ -92,6 +93,8 @@ struct _GimpViewableClass
   gchar         * (* get_description)    (GimpViewable  *viewable,
                                           gchar        **tooltip);
 
+  gboolean        (* is_name_editable)   (GimpViewable  *viewable);
+
   GimpContainer * (* get_children)       (GimpViewable  *viewable);
 
   void            (* set_expanded)       (GimpViewable  *viewable,
@@ -163,6 +166,8 @@ GdkPixbuf     * gimp_viewable_get_dummy_pixbuf   (GimpViewable  *viewable,
 gchar         * gimp_viewable_get_description    (GimpViewable  *viewable,
                                                   gchar        **tooltip);
 
+gboolean        gimp_viewable_is_name_editable   (GimpViewable  *viewable);
+
 const gchar   * gimp_viewable_get_icon_name      (GimpViewable  *viewable);
 void            gimp_viewable_set_icon_name      (GimpViewable  *viewable,
                                                   const gchar   *icon_name);
@@ -176,6 +181,7 @@ void            gimp_viewable_set_parent         (GimpViewable  *viewable,
                                                   GimpViewable  *parent);
 
 GimpContainer * gimp_viewable_get_children       (GimpViewable  *viewable);
+
 gboolean        gimp_viewable_get_expanded       (GimpViewable  *viewable);
 void            gimp_viewable_set_expanded       (GimpViewable  *viewable,
                                                   gboolean       expanded);
diff --git a/app/widgets/gimpcontainertreeview.c b/app/widgets/gimpcontainertreeview.c
index 87e6a24..b679de3 100644
--- a/app/widgets/gimpcontainertreeview.c
+++ b/app/widgets/gimpcontainertreeview.c
@@ -882,23 +882,40 @@ static void
 gimp_container_tree_view_real_edit_name (GimpContainerTreeView *tree_view)
 {
   GtkTreeIter selected_iter;
+  gboolean    success = FALSE;
 
   if (g_list_find (tree_view->priv->editable_cells,
                    tree_view->priv->name_cell) &&
       gimp_container_tree_view_get_selected_single (tree_view,
                                                     &selected_iter))
     {
-      GtkTreePath *path;
+      GimpViewRenderer *renderer;
 
-      path = gtk_tree_model_get_path (tree_view->model, &selected_iter);
+      gtk_tree_model_get (tree_view->model, &selected_iter,
+                          GIMP_CONTAINER_TREE_STORE_COLUMN_RENDERER, &renderer,
+                          -1);
 
-      gtk_tree_view_set_cursor_on_cell (tree_view->view, path,
-                                        tree_view->main_column,
-                                        tree_view->priv->name_cell,
-                                        TRUE);
+      if (gimp_viewable_is_name_editable (renderer->viewable))
+        {
+          GtkTreePath *path;
 
-      gtk_tree_path_free (path);
+          path = gtk_tree_model_get_path (tree_view->model, &selected_iter);
+
+          gtk_tree_view_set_cursor_on_cell (tree_view->view, path,
+                                            tree_view->main_column,
+                                            tree_view->priv->name_cell,
+                                            TRUE);
+
+          gtk_tree_path_free (path);
+
+          success = TRUE;
+        }
+
+      g_object_unref (renderer);
     }
+
+  if (! success)
+    gtk_widget_error_bell (GTK_WIDGET (tree_view));
 }
 
 
@@ -1236,8 +1253,17 @@ gimp_container_tree_view_button_press (GtkWidget             *widget,
                 {
                   if (edit_cell)
                     {
-                      gtk_tree_view_set_cursor_on_cell (tree_view->view, path,
-                                                        column, edit_cell, TRUE);
+                      if (gimp_viewable_is_name_editable (renderer->viewable))
+                        {
+                          gtk_tree_view_set_cursor_on_cell (tree_view->view,
+                                                            path,
+                                                            column, edit_cell,
+                                                            TRUE);
+                        }
+                      else
+                        {
+                          gtk_widget_error_bell (widget);
+                        }
                     }
                   else if (! toggled_cell &&
                            ! (bevent->state & gimp_get_all_modifiers_mask ()))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]