inspector: Show tree model contents

This commit is contained in:
Matthias Clasen
2014-05-16 00:27:28 -04:00
parent 58b48fa209
commit 63e7fe3d60
2 changed files with 105 additions and 79 deletions

View File

@@ -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)
{
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:

View File

@@ -1,13 +1,21 @@
<?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>
@@ -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>