[glade] GladeGtkComboBoxText / GladeStringList: Support editing the <item> "id" attributes
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glade] GladeGtkComboBoxText / GladeStringList: Support editing the <item> "id" attributes
- Date: Mon, 13 May 2013 08:20:07 +0000 (UTC)
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]