From 63e7fe3d605e604b3211a8f53e190043bc3e9d85 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 16 May 2014 00:27:28 -0400 Subject: [PATCH] inspector: Show tree model contents --- gtk/inspector/data-list.c | 135 ++++++++++++++++++++++++------------- gtk/inspector/data-list.ui | 49 +++++--------- 2 files changed, 105 insertions(+), 79 deletions(-) diff --git a/gtk/inspector/data-list.c b/gtk/inspector/data-list.c index 1cac9f46d3..7e3e11f969 100644 --- a/gtk/inspector/data-list.c +++ b/gtk/inspector/data-list.c @@ -19,55 +19,96 @@ #include #include "data-list.h" -enum -{ - COLUMN_NUMBER, - COLUMN_TYPE -}; - struct _GtkInspectorDataListPrivate { - GtkListStore *model; - GtkTreeViewColumn *number_column; - GtkCellRenderer *number_renderer; + GtkTreeModel *object; + GtkTreeModel *types; + GtkTreeView *view; + gboolean show_data; }; G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorDataList, gtk_inspector_data_list, GTK_TYPE_BOX) -static void -render_number (GtkTreeViewColumn *column, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data) -{ - gint number; - gchar text[100]; - - gtk_tree_model_get (model, iter, COLUMN_NUMBER, &number, -1); - g_snprintf (text, 100, "%d", number); - g_object_set (renderer, "text", text, NULL); -} - static void gtk_inspector_data_list_init (GtkInspectorDataList *sl) { sl->priv = gtk_inspector_data_list_get_instance_private (sl); gtk_widget_init_template (GTK_WIDGET (sl)); - gtk_tree_view_column_set_cell_data_func (sl->priv->number_column, - sl->priv->number_renderer, - render_number, - NULL, NULL); +} + +static void +cell_data_func (GtkTreeViewColumn *col, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + gint num; + GValue gvalue = { 0, }; + gchar *value; + + num = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (col), "num")); + gtk_tree_model_get_value (model, iter, num, &gvalue); + value = g_strdup_value_contents (&gvalue); + g_object_set (cell, "text", value ? value : "", NULL); + g_free (value); + g_value_unset (&gvalue); +} + +static void +add_columns (GtkInspectorDataList *sl) +{ + gint n_columns; + GtkCellRenderer *cell; + GType type; + gchar *title; + GtkTreeViewColumn *col; + gint i; + + n_columns = gtk_tree_model_get_n_columns (sl->priv->object); + for (i = 0; i < n_columns; i++) + { + cell = gtk_cell_renderer_text_new (); + type = gtk_tree_model_get_column_type (sl->priv->object, i); + title = g_strdup_printf ("%d: %s", i, g_type_name (type)); + col = gtk_tree_view_column_new_with_attributes (title, cell, NULL); + g_object_set_data (G_OBJECT (col), "num", GINT_TO_POINTER (i)); + gtk_tree_view_column_set_cell_data_func (col, cell, cell_data_func, sl, NULL); + gtk_tree_view_append_column (sl->priv->view, col); + g_free (title); + } +} + +static void +show_types (GtkInspectorDataList *sl) +{ + gtk_tree_view_set_model (sl->priv->view, NULL); + sl->priv->show_data = FALSE; +} + +static void +show_data (GtkInspectorDataList *sl) +{ + gtk_tree_view_set_model (sl->priv->view, sl->priv->object); + sl->priv->show_data = TRUE; +} + +static void +clear_view (GtkInspectorDataList *sl) +{ + gtk_tree_view_set_model (sl->priv->view, NULL); + while (gtk_tree_view_get_n_columns (sl->priv->view) > 0) + gtk_tree_view_remove_column (sl->priv->view, + gtk_tree_view_get_column (sl->priv->view, 0)); } void gtk_inspector_data_list_set_object (GtkInspectorDataList *sl, GObject *object) { - GtkTreeIter iter; - gint i; - - gtk_list_store_clear (sl->priv->model); + clear_view (sl); + sl->priv->object = NULL; + sl->priv->show_data = FALSE; if (!GTK_IS_TREE_MODEL (object)) { @@ -77,17 +118,22 @@ gtk_inspector_data_list_set_object (GtkInspectorDataList *sl, gtk_widget_show (GTK_WIDGET (sl)); - for (i = 0; i < gtk_tree_model_get_n_columns (GTK_TREE_MODEL (object)); i++) - { - GType type; - type = gtk_tree_model_get_column_type (GTK_TREE_MODEL (object), i); + sl->priv->object = GTK_TREE_MODEL (object); + add_columns (sl); + show_types (sl); +} - gtk_list_store_append (sl->priv->model, &iter); - gtk_list_store_set (sl->priv->model, &iter, - COLUMN_NUMBER, i, - COLUMN_TYPE, g_type_name (type), - -1); - } +static void +toggle_show (GtkToggleToolButton *button, + GtkInspectorDataList *sl) +{ + if (gtk_toggle_tool_button_get_active (button) == sl->priv->show_data) + return; + + if (gtk_toggle_tool_button_get_active (button)) + show_data (sl); + else + show_types (sl); } static void @@ -96,9 +142,8 @@ gtk_inspector_data_list_class_init (GtkInspectorDataListClass *klass) GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/data-list.ui"); - gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorDataList, model); - gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorDataList, number_column); - gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorDataList, number_renderer); + gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorDataList, view); + gtk_widget_class_bind_template_callback (widget_class, toggle_show); } // vim: set et sw=2 ts=2: diff --git a/gtk/inspector/data-list.ui b/gtk/inspector/data-list.ui index bd2786d485..d2ee69557a 100644 --- a/gtk/inspector/data-list.ui +++ b/gtk/inspector/data-list.ui @@ -1,13 +1,21 @@ - - - - - -