[gtk+] inspector: Show tree model contents
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] inspector: Show tree model contents
- Date: Fri, 16 May 2014 04:28:32 +0000 (UTC)
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]