diff options
author | Matthias Clasen <mclasen@redhat.com> | 2007-11-19 05:47:36 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2007-11-19 05:47:36 +0000 |
commit | e888b75e1b250ce122888a4b7cdb85fb2f5427e8 (patch) | |
tree | 8ba300c48617ca5d0818b7068854014c6f833e82 /gtk/gtktreestore.c | |
parent | 5f4e93fe0a84b1c38b9780b78785e27fd7163b61 (diff) | |
download | gtk+-e888b75e1b250ce122888a4b7cdb85fb2f5427e8.tar.gz |
Fix the GtkBuildable implementation to allow setting column types.
2007-11-19 Matthias Clasen <mclasen@redhat.com>
* gtk/gtktreestore.c: Fix the GtkBuildable implementation
to allow setting column types. (#496795, James Stephenson)
svn path=/trunk/; revision=19001
Diffstat (limited to 'gtk/gtktreestore.c')
-rw-r--r-- | gtk/gtktreestore.c | 74 |
1 files changed, 49 insertions, 25 deletions
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index 730c942f5b..ecc4271547 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -3207,6 +3207,7 @@ validate_gnode (GNode* node) * </columns> */ typedef struct { + GtkBuilder *builder; GObject *object; GSList *items; } GSListSubParserData; @@ -3229,9 +3230,55 @@ tree_model_start_element (GMarkupParseContext *context, } } +static void +tree_model_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + guint i; + GSListSubParserData *data = (GSListSubParserData*)user_data; + + g_assert(data->builder); + + if (strcmp (element_name, "columns") == 0) + { + GSList *l; + GType *types; + int i; + GType type; + + data = (GSListSubParserData*)user_data; + data->items = g_slist_reverse (data->items); + types = g_new0 (GType, g_slist_length (data->items)); + + for (l = data->items, i = 0; l; l = l->next, i++) + { + type = gtk_builder_get_type_from_name (data->builder, l->data); + if (type == G_TYPE_INVALID) + { + g_warning ("Unknown type %s specified in treemodel %s", + (const gchar*)l->data, + gtk_buildable_get_name (GTK_BUILDABLE (data->object))); + continue; + } + types[i] = type; + + g_free (l->data); + } + + gtk_tree_store_set_column_types (GTK_TREE_STORE (data->object), i, types); + + g_free (types); + } + else if (strcmp (element_name, "column") == 0) + ; +} + static const GMarkupParser tree_model_parser = { - tree_model_start_element + tree_model_start_element, + tree_model_end_element }; @@ -3251,6 +3298,7 @@ gtk_tree_store_buildable_custom_tag_start (GtkBuildable *buildable, if (strcmp (tagname, "columns") == 0) { parser_data = g_slice_new0 (GSListSubParserData); + parser_data->builder = builder; parser_data->items = NULL; parser_data->object = G_OBJECT (buildable); @@ -3269,37 +3317,13 @@ gtk_tree_store_buildable_custom_finished (GtkBuildable *buildable, const gchar *tagname, gpointer user_data) { - GSList *l; GSListSubParserData *data; - GType *types; - int i; - GType type; if (strcmp (tagname, "columns")) return; data = (GSListSubParserData*)user_data; - data->items = g_slist_reverse (data->items); - types = g_new0 (GType, g_slist_length (data->items)); - - for (l = data->items, i = 0; l; l = l->next, i++) - { - type = gtk_builder_get_type_from_name (builder, l->data); - if (type == G_TYPE_INVALID) - { - g_warning ("Unknown type %s specified in treemodel %s", - (const gchar*)l->data, - gtk_buildable_get_name (GTK_BUILDABLE (data->object))); - continue; - } - types[i] = type; - - g_free (l->data); - } - - gtk_tree_store_set_column_types (GTK_TREE_STORE (data->object), i, types); - g_free (types); g_slist_free (data->items); g_slice_free (GSListSubParserData, data); } |