[gtk+] inspector: Show tree model contents



commit 63e7fe3d605e604b3211a8f53e190043bc3e9d85
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri May 16 00:27:28 2014 -0400

    inspector: Show tree model contents

 gtk/inspector/data-list.c  |  133 +++++++++++++++++++++++++++++---------------
 gtk/inspector/data-list.ui |   49 +++++-----------
 2 files changed, 104 insertions(+), 78 deletions(-)
---
diff --git a/gtk/inspector/data-list.c b/gtk/inspector/data-list.c
index 1cac9f4..7e3e11f 100644
--- a/gtk/inspector/data-list.c
+++ b/gtk/inspector/data-list.c
@@ -19,55 +19,96 @@
 #include <glib/gi18n-lib.h>
 #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)
+gtk_inspector_data_list_init (GtkInspectorDataList *sl)
 {
-  gint number;
-  gchar text[100];
+  sl->priv = gtk_inspector_data_list_get_instance_private (sl);
+  gtk_widget_init_template (GTK_WIDGET (sl));
+}
 
-  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
+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
-gtk_inspector_data_list_init (GtkInspectorDataList *sl)
+add_columns (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);
+  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);
-
-      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);
-    }  
+  sl->priv->object = GTK_TREE_MODEL (object);
+  add_columns (sl);
+  show_types (sl);
+}
+
+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 bd2786d..d2ee695 100644
--- a/gtk/inspector/data-list.ui
+++ b/gtk/inspector/data-list.ui
@@ -1,14 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface domain="gtk30">
-  <object class="GtkListStore" id="model">
-    <columns>
-      <column type="gint"/>
-      <column type="gchararray"/>
-    </columns>
-  </object>
   <template class="GtkInspectorDataList" parent="GtkBox">
     <property name="orientation">vertical</property>
     <child>
+      <object class="GtkToolbar" id="toolbar">
+        <property name="visible">True</property>
+        <property name="icon-size">small-toolbar</property>
+        <child>
+          <object class="GtkToggleToolButton" id="show_button">
+            <property name="visible">True</property>
+            <property name="icon-name">reload</property>
+            <property name="tooltip-text" translatable="yes">Show data</property>
+            <signal name="toggled" handler="toggle_show"/>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
       <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="expand">True</property>
@@ -16,35 +24,8 @@
         <property name="vscrollbar-policy">always</property>
         <property name="shadow-type">in</property>
         <child>
-          <object class= "GtkTreeView">
+          <object class= "GtkTreeView" id="view">
             <property name="visible">True</property>
-            <property name="model">model</property>
-            <child>
-              <object class="GtkTreeViewColumn" id="number_column">
-                <property name="title" translatable="yes">Column</property>
-                <child>
-                  <object class="GtkCellRendererText" id="number_renderer">
-                    <property name="scale">0.8</property>
-                  </object>
-                  <attributes>
-                    <attribute name="text">0</attribute>
-                  </attributes>
-                </child>
-              </object>
-            </child>
-            <child>
-              <object class="GtkTreeViewColumn">
-                <property name="title" translatable="yes">Type</property>
-                <child>
-                  <object class="GtkCellRendererText">
-                    <property name="scale">0.8</property>
-                  </object>
-                  <attributes>
-                    <attribute name="text">1</attribute>
-                  </attributes>
-                </child>
-              </object>
-            </child>  
           </object>
         </child>
       </object>


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