[glade] GladeGtkComboBoxText / GladeStringList: Support editing the <item> "id" attributes



commit 4a65620ac5a56cc781594eb56c7d68fb7e49678f
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Mon May 13 17:18:49 2013 +0900

    GladeGtkComboBoxText / GladeStringList: Support editing the <item> "id" attributes
    
    Let users specify "id"s for the text they add to a GtkComboBoxText
    
    This patch updates a couple other files which use GladeStringList without
    the "ID" feature.

 plugins/gtk+/glade-gtk-combo-box-text.c     |   14 ++-
 plugins/gtk+/glade-gtk-recent-file-filter.c |    4 +-
 plugins/gtk+/glade-gtk-widget.c             |    4 +-
 plugins/gtk+/glade-string-list.c            |  174 +++++++++++++++++++++++----
 plugins/gtk+/glade-string-list.h            |   21 ++--
 5 files changed, 180 insertions(+), 37 deletions(-)
---
diff --git a/plugins/gtk+/glade-gtk-combo-box-text.c b/plugins/gtk+/glade-gtk-combo-box-text.c
index b8b97a9..64702ed 100644
--- a/plugins/gtk+/glade-gtk-combo-box-text.c
+++ b/plugins/gtk+/glade-gtk-combo-box-text.c
@@ -71,7 +71,7 @@ glade_gtk_combo_box_text_create_eprop (GladeWidgetAdaptor * adaptor,
 
   if (pspec->value_type == GLADE_TYPE_STRING_LIST)
     {
-      eprop = glade_eprop_string_list_new (klass, use_command, TRUE);
+      eprop = glade_eprop_string_list_new (klass, use_command, TRUE, TRUE);
     }
   else
     eprop = GWA_GET_CLASS
@@ -122,7 +122,7 @@ glade_gtk_combo_box_text_set_property (GladeWidgetAdaptor * adaptor,
        {
          string = l->data;
 
-         gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (object), string->string);
+         gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (object), string->id, string->string);
        }
 
       gtk_combo_box_set_active (GTK_COMBO_BOX (object),
@@ -147,6 +147,7 @@ glade_gtk_combo_box_text_read_items (GladeWidget * widget, GladeXmlNode * node)
           item_node; item_node = glade_xml_node_next (item_node))
        {
          gchar *str, *comment, *context;
+         gchar *id;
          gboolean translatable;
 
          if (!glade_xml_node_verify (item_node, GLADE_TAG_ITEM))
@@ -155,17 +156,19 @@ glade_gtk_combo_box_text_read_items (GladeWidget * widget, GladeXmlNode * node)
           if ((str = glade_xml_get_content (item_node)) == NULL)
            continue;
 
+         id           = glade_xml_get_property_string (item_node, GLADE_TAG_ID);
          context      = glade_xml_get_property_string (item_node, GLADE_TAG_CONTEXT);
          comment      = glade_xml_get_property_string (item_node, GLADE_TAG_COMMENT);
           translatable = glade_xml_get_property_boolean (item_node, GLADE_TAG_TRANSLATABLE, FALSE);
 
          string_list = 
            glade_string_list_append (string_list,
-                                     str, comment, context, translatable);
+                                     str, comment, context, translatable, id);
 
          g_free (str);
          g_free (context);
          g_free (comment);
+         g_free (id);
        }
 
       glade_widget_property_set (widget, "glade-items", string_list);
@@ -208,6 +211,11 @@ glade_gtk_combo_box_text_write_items (GladeWidget * widget,
 
       glade_xml_set_content (item_node, string->string);
 
+      if (string->id)
+        glade_xml_node_set_property_string (item_node,
+                                            GLADE_TAG_ID,
+                                            string->id);
+
       if (string->translatable)
         glade_xml_node_set_property_string (item_node,
                                             GLADE_TAG_TRANSLATABLE,
diff --git a/plugins/gtk+/glade-gtk-recent-file-filter.c b/plugins/gtk+/glade-gtk-recent-file-filter.c
index 3ba0e76..829c92c 100644
--- a/plugins/gtk+/glade-gtk-recent-file-filter.c
+++ b/plugins/gtk+/glade-gtk-recent-file-filter.c
@@ -86,7 +86,7 @@ glade_gtk_filter_read_strings (GladeWidget  *widget,
           if ((str = glade_xml_get_content (item_node)) == NULL)
            continue;
 
-         string_list = glade_string_list_append (string_list, str, NULL, NULL, FALSE);
+         string_list = glade_string_list_append (string_list, str, NULL, NULL, FALSE, NULL);
          g_free (str);
        }
 
@@ -143,7 +143,7 @@ glade_gtk_recent_file_filter_create_eprop (GladeWidgetAdaptor * adaptor,
 
   if (pspec->value_type == GLADE_TYPE_STRING_LIST)
     {
-      eprop = glade_eprop_string_list_new (klass, use_command, FALSE);
+      eprop = glade_eprop_string_list_new (klass, use_command, FALSE, FALSE);
     }
   else
     eprop = GWA_GET_CLASS
diff --git a/plugins/gtk+/glade-gtk-widget.c b/plugins/gtk+/glade-gtk-widget.c
index 86e3c42..e97e6f2 100644
--- a/plugins/gtk+/glade-gtk-widget.c
+++ b/plugins/gtk+/glade-gtk-widget.c
@@ -313,7 +313,7 @@ glade_gtk_widget_read_style_classes (GladeWidget * widget, GladeXmlNode * node)
 
          name = glade_xml_get_property_string (class_node, GLADE_TAG_NAME);
 
-         string_list = glade_string_list_append (string_list, name, NULL, NULL, FALSE);
+         string_list = glade_string_list_append (string_list, name, NULL, NULL, FALSE, NULL);
 
          g_free (name);
        }
@@ -628,7 +628,7 @@ glade_gtk_widget_create_eprop (GladeWidgetAdaptor * adaptor,
                           "property-class", klass,
                           "use-command", use_command, NULL);
   else if (pspec->value_type == GLADE_TYPE_STRING_LIST)
-    eprop = glade_eprop_string_list_new (klass, use_command, FALSE);
+    eprop = glade_eprop_string_list_new (klass, use_command, FALSE, FALSE);
   else
     eprop = GWA_GET_CLASS
         (G_TYPE_OBJECT)->create_eprop (adaptor, klass, use_command);
diff --git a/plugins/gtk+/glade-string-list.c b/plugins/gtk+/glade-string-list.c
index aad2482..81118eb 100644
--- a/plugins/gtk+/glade-string-list.c
+++ b/plugins/gtk+/glade-string-list.c
@@ -39,7 +39,8 @@ static GladeString *
 glade_string_new (const gchar *string,
                  const gchar *comment,
                  const gchar *context,
-                 gboolean     translatable)
+                 gboolean     translatable,
+                 const gchar *id)
 {
   GladeString *gstring = g_slice_new0 (GladeString);
 
@@ -47,6 +48,7 @@ glade_string_new (const gchar *string,
   gstring->comment      = g_strdup (comment);
   gstring->context      = g_strdup (context);
   gstring->translatable = translatable;
+  gstring->id           = g_strdup (id);
 
   return gstring;
 }
@@ -57,7 +59,8 @@ glade_string_copy (GladeString *string)
   return glade_string_new (string->string, 
                           string->comment, 
                           string->context, 
-                          string->translatable);
+                          string->translatable,
+                          string->id);
 }
 
 static void
@@ -66,19 +69,21 @@ glade_string_free (GladeString *string)
   g_free (string->string);
   g_free (string->comment);
   g_free (string->context);
+  g_free (string->id);
   g_slice_free (GladeString, string);
 }
 
 GList *
-glade_string_list_append (GList   *list,
-                         gchar   *string,
-                         gchar   *comment,
-                         gchar   *context,
-                         gboolean translatable)
+glade_string_list_append (GList       *list,
+                         const gchar *string,
+                         const gchar *comment,
+                         const gchar *context,
+                         gboolean     translatable,
+                         const gchar *id)
 {
   GladeString *gstring;
 
-  gstring = glade_string_new (string, comment, context, translatable);
+  gstring = glade_string_new (string, comment, context, translatable, id);
 
   return g_list_append (list, gstring);
 }
@@ -135,11 +140,12 @@ glade_string_list_to_string (GList   *list)
       if (l != list)
        g_string_append_c (string, ',');
 
-      g_string_append_printf (string, "%s:%s:%s:%d", 
+      g_string_append_printf (string, "%s:%s:%s:%d:%s", 
                              str->string,
                              str->comment ? str->comment : "",
                              str->context ? str->context : "",
-                             str->translatable);
+                             str->translatable,
+                             str->id ? str->id : "");
     }
 
   return g_string_free (string, FALSE);
@@ -156,6 +162,7 @@ typedef struct
   GtkWidget    *view;
 
   guint  translatable : 1;
+  guint  with_id : 1;
   guint  want_focus : 1;
 
   guint  editing_index;
@@ -170,6 +177,7 @@ enum
   COLUMN_STRING,
   COLUMN_INDEX,
   COLUMN_DUMMY,
+  COLUMN_ID,
   NUM_COLUMNS
 };
 
@@ -317,6 +325,7 @@ glade_eprop_string_list_load (GladeEditorProperty * eprop, GladeProperty * prope
                          COLUMN_STRING, string->string,
                          COLUMN_INDEX, i,
                          COLUMN_DUMMY, FALSE,
+                         COLUMN_ID, string->id,
                          -1);
     }
 
@@ -325,6 +334,7 @@ glade_eprop_string_list_load (GladeEditorProperty * eprop, GladeProperty * prope
                      COLUMN_STRING, _("<Type Here>"),
                      COLUMN_INDEX, i,
                      COLUMN_DUMMY, TRUE,
+                     COLUMN_ID, NULL,
                      -1);
 
   if (eprop_string_list->want_focus)
@@ -370,7 +380,8 @@ string_edited (GtkCellRendererText *renderer,
        string_list = 
          glade_string_list_append (string_list,
                                    new_text, NULL, NULL, 
-                                   eprop_string_list->translatable);
+                                   eprop_string_list->translatable,
+                                   NULL);
     }
   else if (new_text && new_text[0])
     {
@@ -402,6 +413,52 @@ string_edited (GtkCellRendererText *renderer,
 }
 
 static void
+id_edited (GtkCellRendererText *renderer,
+          gchar               *path,
+          gchar               *new_text,
+          GladeEditorProperty *eprop)
+{
+  GladeEPropStringList *eprop_string_list = GLADE_EPROP_STRING_LIST (eprop);
+  GtkTreePath          *tree_path = gtk_tree_path_new_from_string (path);
+  GtkTreeIter           iter;
+  guint                 index;
+  GladeProperty        *property = glade_editor_property_get_property (eprop);
+  GList                *string_list = NULL;
+  GladeString          *string;
+
+  gtk_tree_model_get_iter (eprop_string_list->model, &iter, tree_path);
+  gtk_tree_model_get (eprop_string_list->model, &iter,
+                     COLUMN_INDEX, &index,
+                     -1);
+
+  glade_property_get (property, &string_list);
+
+  if (string_list)
+    string_list = glade_string_list_copy (string_list);
+
+  string = g_list_nth_data (string_list, index);
+
+  g_free (string->id);
+
+  if (new_text && new_text[0])
+    string->id = g_strdup (new_text);
+  else
+    string->id = NULL;
+
+  eprop_string_list->editing_index = index;
+
+  if (eprop_string_list->pending_string_list)
+    glade_string_list_free (eprop_string_list->pending_string_list);
+  eprop_string_list->pending_string_list = string_list;
+
+  if (eprop_string_list->update_id == 0)
+    eprop_string_list->update_id = 
+      g_idle_add ((GSourceFunc) update_string_list_idle, eprop);
+
+  gtk_tree_path_free (tree_path);
+}
+
+static void
 i18n_icon_activate (GtkCellRenderer     *renderer,
                    const gchar         *path,
                    GladeEditorProperty *eprop)
@@ -484,6 +541,67 @@ cell_data_func (GtkTreeViewColumn   *column,
     g_object_set (renderer, "visible", !dummy && eprop_string_list->translatable, NULL);
 }
 
+static void
+id_cell_data_func (GtkTreeViewColumn   *column,
+                  GtkCellRenderer     *renderer,
+                  GtkTreeModel        *model,
+                  GtkTreeIter         *iter,
+                  GladeEditorProperty *eprop)
+{
+  GladeEPropStringList *eprop_string_list = GLADE_EPROP_STRING_LIST (eprop);
+
+  if (eprop_string_list->with_id)
+    {
+      GtkStyleContext* context = gtk_widget_get_style_context (eprop_string_list->view);
+      GdkRGBA  color;
+      guint index;
+      gboolean dummy;
+      gchar *id = NULL;
+
+      gtk_tree_model_get (eprop_string_list->model, iter,
+                         COLUMN_INDEX, &index,
+                         COLUMN_DUMMY, &dummy,
+                         COLUMN_ID, &id,
+                         -1);
+
+      /* Dummy, no data yet */
+      if (dummy)
+       {
+         g_object_set (renderer,
+                       "editable", FALSE,
+                       "text", NULL,
+                       NULL);
+       }
+      /* Not dummy, and id already set */
+      else if (id)
+       {
+         gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &color);
+         g_object_set (renderer,
+                       "style", PANGO_STYLE_NORMAL,
+                       "foreground-rgba", &color,
+                       "editable", TRUE,
+                       "text", id,
+                       NULL);
+       }
+      /* Not dummy, but no id yet */
+      else
+       {
+         gtk_style_context_get_color (context, GTK_STATE_FLAG_INSENSITIVE, &color);
+         g_object_set (renderer, 
+                       "style", PANGO_STYLE_ITALIC,
+                       "foreground-rgba", &color,
+                       "editable", TRUE,
+                       "text", _("<Enter ID>"),
+                       NULL);
+       }
+
+      g_free (id);
+    }
+  else
+    g_object_set (renderer, "visible", FALSE, NULL);
+
+}
+
 static gboolean
 treeview_key_press (GtkWidget           *treeview,
                    GdkEventKey         *event, 
@@ -533,8 +651,10 @@ get_tree_view_height (void)
        gtk_widget_create_pango_layout (label, 
                                        "The quick\n"
                                        "brown fox\n"
-                                       "jumped over\n"
-                                       "the lazy dog");
+                                       "jumped\n"
+                                       "over\n"
+                                       "the lazy\n"
+                                       "dog");
 
       pango_layout_get_pixel_size (layout, NULL, &height);
 
@@ -563,17 +683,27 @@ glade_eprop_string_list_create_input (GladeEditorProperty * eprop)
                "editable", TRUE,
                "ellipsize", PANGO_ELLIPSIZE_END,
                NULL);
-  g_signal_connect (G_OBJECT (renderer), "edited",
-                   G_CALLBACK (string_edited), eprop);
+  g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (string_edited), eprop);
 
   gtk_tree_view_column_pack_start (column, renderer, TRUE);
-  gtk_tree_view_column_set_attributes (column, renderer,
-                                      "text", COLUMN_STRING,
-                                      NULL);
+  gtk_tree_view_column_set_attributes (column, renderer, "text", COLUMN_STRING, NULL);
   gtk_tree_view_column_set_cell_data_func (column, renderer,
                                           (GtkTreeCellDataFunc)cell_data_func,
                                           eprop, NULL);
 
+  /* "id" renderer */
+  renderer = gtk_cell_renderer_text_new ();
+  g_object_set (G_OBJECT (renderer), 
+               "editable", TRUE,
+               "ellipsize", PANGO_ELLIPSIZE_END,
+               NULL);
+  g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (id_edited), eprop);
+
+  gtk_tree_view_column_pack_start (column, renderer, TRUE);
+  gtk_tree_view_column_set_cell_data_func (column, renderer,
+                                          (GtkTreeCellDataFunc)id_cell_data_func,
+                                          eprop, NULL);
+
   /* i18n icon renderer */
   renderer = glade_cell_renderer_icon_new ();
   g_object_set (G_OBJECT (renderer), "icon-name", GTK_STOCK_EDIT, NULL);
@@ -588,8 +718,8 @@ glade_eprop_string_list_create_input (GladeEditorProperty * eprop)
   eprop_string_list->model = (GtkTreeModel *)gtk_list_store_new (NUM_COLUMNS,
                                                                 G_TYPE_STRING,
                                                                 G_TYPE_UINT,
-                                                                G_TYPE_BOOLEAN);
-
+                                                                G_TYPE_BOOLEAN,
+                                                                G_TYPE_STRING);
 
   g_signal_connect (G_OBJECT (eprop_string_list->model), "row-deleted",
                    G_CALLBACK (row_deleted), eprop);
@@ -625,7 +755,8 @@ glade_eprop_string_list_create_input (GladeEditorProperty * eprop)
 GladeEditorProperty *
 glade_eprop_string_list_new (GladePropertyClass *pclass,
                             gboolean            use_command,
-                            gboolean            translatable)
+                            gboolean            translatable,
+                            gboolean            with_id)
 {
   GladeEditorProperty *eprop = 
     g_object_new (GLADE_TYPE_EPROP_STRING_LIST, 
@@ -636,6 +767,7 @@ glade_eprop_string_list_new (GladePropertyClass *pclass,
   GladeEPropStringList *eprop_string_list = GLADE_EPROP_STRING_LIST (eprop);
 
   eprop_string_list->translatable = translatable;
+  eprop_string_list->with_id = with_id;
 
   return eprop;
 }
diff --git a/plugins/gtk+/glade-string-list.h b/plugins/gtk+/glade-string-list.h
index 06a0090..44087da 100644
--- a/plugins/gtk+/glade-string-list.h
+++ b/plugins/gtk+/glade-string-list.h
@@ -17,26 +17,29 @@ struct _GladeString {
   gchar    *string;
   gchar    *comment;
   gchar    *context;
+  gchar    *id;
   gboolean  translatable;
 };
 
 GType        glade_eprop_string_list_get_type    (void) G_GNUC_CONST;
 GType        glade_string_list_get_type          (void) G_GNUC_CONST;
 
-void         glade_string_list_free              (GList   *list);
-GList       *glade_string_list_copy              (GList   *list);
+void         glade_string_list_free              (GList         *list);
+GList       *glade_string_list_copy              (GList         *list);
 
-GList       *glade_string_list_append            (GList   *list,
-                                                 gchar   *string,
-                                                 gchar   *comment,
-                                                 gchar   *context,
-                                                 gboolean translatable);
+GList       *glade_string_list_append            (GList         *list,
+                                                 const gchar   *string,
+                                                 const gchar   *comment,
+                                                 const gchar   *context,
+                                                 gboolean       translatable,
+                                                 const gchar   *id);
 
-gchar       *glade_string_list_to_string         (GList   *list);
+gchar       *glade_string_list_to_string         (GList         *list);
 
 GladeEditorProperty *glade_eprop_string_list_new (GladePropertyClass *pclass,
                                                  gboolean            use_command,
-                                                 gboolean            translatable);
+                                                 gboolean            translatable,
+                                                 gboolean            with_id);
 
 G_END_DECLS
 


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