inspector: Show tree model contents
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user