[glade3/signal-tree-model] gladeui: Reduce signal-model columns, add cell_data_funcs instead
- From: Johannes Schmid <jhs src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glade3/signal-tree-model] gladeui: Reduce signal-model columns, add cell_data_funcs instead
- Date: Sun, 9 Jan 2011 18:06:03 +0000 (UTC)
commit 8b5281f5162380e45013cb06e2bf0e4dc3b904e7
Author: Johannes Schmid <jhs gnome org>
Date: Sun Jan 9 19:05:48 2011 +0100
gladeui: Reduce signal-model columns, add cell_data_funcs instead
Fixes a lot of drawing glitches in the tree view.
gladeui/glade-signal-editor.c | 294 ++++++++++++++++++++++++++++++++++++-----
gladeui/glade-signal-model.c | 77 +++---------
gladeui/glade-signal-model.h | 4 -
3 files changed, 276 insertions(+), 99 deletions(-)
---
diff --git a/gladeui/glade-signal-editor.c b/gladeui/glade-signal-editor.c
index fb3ce2a..6236a20 100644
--- a/gladeui/glade-signal-editor.c
+++ b/gladeui/glade-signal-editor.c
@@ -49,6 +49,8 @@
G_DEFINE_TYPE (GladeSignalEditor, glade_signal_editor, GTK_TYPE_VBOX)
+#define DUMMY_DATA "__dummy"
+
struct _GladeSignalEditorPrivate
{
GtkTreeModel *model;
@@ -66,6 +68,16 @@ struct _GladeSignalEditorPrivate
GtkCellRenderer* renderer_userdata;
};
+/* Utils */
+static gboolean
+glade_signal_is_dummy (GladeSignal *signal)
+{
+ gboolean dummy;
+ dummy = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (signal),
+ DUMMY_DATA));
+ return dummy;
+}
+
/* Signal handlers */
static void
on_handler_edited (GtkCellRendererText* renderer,
@@ -77,7 +89,8 @@ on_handler_edited (GtkCellRendererText* renderer,
GtkTreePath* tree_path = gtk_tree_path_new_from_string (path);
GtkTreeIter iter;
gchar* old_handler;
- gboolean not_dummy;
+ GladeSignal* signal;
+ gboolean dummy;
g_return_if_fail (self->priv->widget != NULL);
@@ -86,13 +99,16 @@ on_handler_edited (GtkCellRendererText* renderer,
tree_path);
gtk_tree_model_get (self->priv->model, &iter,
- GLADE_SIGNAL_COLUMN_NOT_DUMMY, ¬_dummy,
- GLADE_SIGNAL_COLUMN_HANDLER, &old_handler, -1);
+ GLADE_SIGNAL_COLUMN_HANDLER, &old_handler,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal, -1);
+
+ dummy = glade_signal_is_dummy (signal);
+ g_object_unref (signal);
/* False alarm ? */
if (handler && !g_str_equal (old_handler, handler))
{
- if (not_dummy)
+ if (!dummy)
{
if (strlen (handler))
{
@@ -167,18 +183,21 @@ on_handler_editing_started (GtkCellRenderer* renderer,
if (GTK_IS_ENTRY (editable))
{
GtkTreeIter iter;
- gboolean not_dummy;
+ GladeSignal* signal;
+ gboolean dummy;
gtk_tree_model_get_iter (self->priv->model,
&iter,
tree_path);
gtk_tree_model_get (self->priv->model,
&iter,
- GLADE_SIGNAL_COLUMN_NOT_DUMMY, ¬_dummy,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
-1);
- if (!not_dummy) /* if (dummy) */
+ dummy = glade_signal_is_dummy (signal);
+ if (dummy)
{
gtk_entry_set_text (GTK_ENTRY (editable), "");
}
+ g_object_unref (signal);
}
gtk_tree_path_free (tree_path);
}
@@ -200,14 +219,14 @@ glade_signal_editor_user_data_activate (GtkCellRenderer * icon_renderer,
GList *selected = NULL;
GList *exception = NULL;
- gboolean not_dummy = FALSE;
+ gboolean dummy;
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_model_get (model, &iter,
- GLADE_SIGNAL_COLUMN_NOT_DUMMY, ¬_dummy,
GLADE_SIGNAL_COLUMN_SIGNAL, &signal, -1);
+ dummy = glade_signal_is_dummy (signal);
- if (not_dummy)
+ if (!dummy)
{
project = glade_widget_get_project (priv->widget);
@@ -497,6 +516,200 @@ glade_signal_editor_drag_begin (GtkWidget* widget,
}
static void
+glade_signal_editor_name_cell_data_func (GtkTreeViewColumn *column,
+ GtkCellRenderer *renderer,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ GladeSignal* signal;
+ gboolean show_name;
+
+ gtk_tree_model_get (model, iter,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
+ GLADE_SIGNAL_COLUMN_SHOW_NAME, &show_name,
+ -1);
+ if (signal)
+ {
+ gboolean dummy;
+
+ dummy = glade_signal_is_dummy (signal);
+ if (!dummy && show_name)
+ {
+ g_object_set (renderer,
+ "weight", PANGO_WEIGHT_BOLD,
+ NULL);
+ }
+ else
+ {
+ g_object_set (renderer,
+ "weight", PANGO_WEIGHT_NORMAL,
+ NULL);
+ }
+ g_object_unref (signal);
+ }
+ else
+ g_object_set (renderer,
+ "weight", PANGO_WEIGHT_NORMAL,
+ NULL);
+
+ g_object_set (renderer,
+ "visible", show_name,
+ NULL);
+}
+
+static void
+glade_signal_editor_handler_cell_data_func (GtkTreeViewColumn *column,
+ GtkCellRenderer *renderer,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ GladeSignalEditor* editor = GLADE_SIGNAL_EDITOR (data);
+ GladeSignal* signal;
+
+ gtk_tree_model_get (model, iter,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
+ -1);
+ if (signal)
+ {
+ gboolean dummy;
+ GtkStyleContext* context = gtk_widget_get_style_context (editor->priv->signal_tree);
+
+ dummy = glade_signal_is_dummy (signal);
+ if (dummy)
+ {
+ /* FIXME: That's invisible...
+ GdkRGBA color;
+ gtk_style_context_get_color (context,
+ GTK_STATE_INSENSITIVE,
+ &color);
+ */
+ g_object_set (renderer,
+ "style", PANGO_STYLE_ITALIC,
+ "foreground", "grey",
+ NULL);
+ }
+ else
+ {
+ GdkRGBA fg_color;
+ gtk_style_context_get_color (context,
+ GTK_STATE_NORMAL,
+ &fg_color);
+ g_object_set (renderer,
+ "style", PANGO_STYLE_NORMAL,
+ "foreground-rgba", &fg_color,
+ NULL);
+ }
+ g_object_set (renderer,
+ "visible", TRUE,
+ "sensitive", TRUE,
+ "editable", TRUE,
+ NULL);
+
+ g_object_unref (signal);
+ }
+ else
+ {
+ g_object_set (renderer,
+ "visible", FALSE,
+ "editable", FALSE,
+ NULL);
+ }
+}
+
+static void
+glade_signal_editor_data_cell_data_func (GtkTreeViewColumn *column,
+ GtkCellRenderer *renderer,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ GladeSignal* signal;
+
+ gtk_tree_model_get (model, iter,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
+ -1);
+ if (signal)
+ {
+ gboolean dummy;
+
+ dummy = glade_signal_is_dummy (signal);
+ g_object_set (renderer,
+ "sensitive", !dummy,
+ "visible", TRUE,
+ NULL);
+ g_object_unref (signal);
+ }
+ else
+ {
+ g_object_set (renderer,
+ "sensitive", FALSE,
+ "visible", FALSE,
+ NULL);
+ }
+}
+
+static void
+glade_signal_editor_warning_cell_data_func (GtkTreeViewColumn *column,
+ GtkCellRenderer *renderer,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ GladeSignal* signal;
+ gboolean visible = FALSE;
+
+ gtk_tree_model_get (model, iter,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
+ -1);
+ if (signal)
+ {
+ const gchar* warning = glade_signal_get_support_warning (signal);
+ visible = warning && strlen (warning);
+ g_object_unref (signal);
+ }
+
+ g_object_set (renderer,
+ "visible", visible,
+ NULL);
+}
+
+static void
+glade_signal_editor_devhelp_cell_data_func (GtkTreeViewColumn *column,
+ GtkCellRenderer *renderer,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ GladeSignal* signal;
+
+ gtk_tree_model_get (model, iter,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
+ -1);
+ if (signal)
+ {
+ const GladeSignalClass* class = glade_signal_get_class (signal);
+ GladeWidgetAdaptor* adaptor = glade_signal_class_get_adaptor (class);
+ gchar* book;
+
+ g_object_get (adaptor, "book", &book, NULL);
+
+ g_object_set (renderer,
+ "visible", book != NULL,
+ NULL);
+ g_free (book);
+ g_object_unref (signal);
+ }
+ else
+ {
+ g_object_set (renderer,
+ "visible", FALSE,
+ NULL);
+ }
+}
+
+static void
glade_signal_editor_init (GladeSignalEditor *self)
{
GtkWidget *scroll;
@@ -513,28 +726,31 @@ glade_signal_editor_init (GladeSignalEditor *self)
/* Create columns */
/* Signal name */
priv->column_name = gtk_tree_view_column_new ();
-
+
/* version warning */
renderer = gtk_cell_renderer_pixbuf_new ();
g_object_set (G_OBJECT (renderer), "icon-name", GTK_STOCK_DIALOG_WARNING,
NULL);
+ gtk_tree_view_column_set_cell_data_func (priv->column_name, renderer,
+ glade_signal_editor_warning_cell_data_func,
+ self,
+ NULL);
gtk_tree_view_column_pack_start (priv->column_name, renderer, FALSE);
- gtk_tree_view_column_set_attributes (priv->column_name, renderer,
- "visible", GLADE_SIGNAL_COLUMN_VERSION_WARNING,
- NULL);
+
/* signal name */
renderer = gtk_cell_renderer_text_new ();
g_object_set (G_OBJECT (renderer),
"ellipsize", PANGO_ELLIPSIZE_END,
- "weight", PANGO_WEIGHT_BOLD,
"width-chars", 20,
NULL);
gtk_tree_view_column_pack_end (priv->column_name, renderer, TRUE);
gtk_tree_view_column_set_attributes (priv->column_name, renderer,
"text", GLADE_SIGNAL_COLUMN_NAME,
- "visible", GLADE_SIGNAL_COLUMN_SHOW_NAME,
- "weight-set", GLADE_SIGNAL_COLUMN_NOT_DUMMY,
NULL);
+ gtk_tree_view_column_set_cell_data_func (priv->column_name, renderer,
+ glade_signal_editor_name_cell_data_func,
+ self,
+ NULL);
gtk_tree_view_column_set_resizable (priv->column_name, TRUE);
gtk_tree_view_column_set_expand (priv->column_name, TRUE);
@@ -549,9 +765,11 @@ glade_signal_editor_init (GladeSignalEditor *self)
priv->column_handler = gtk_tree_view_column_new_with_attributes (_("Handler"),
renderer,
"text", GLADE_SIGNAL_COLUMN_HANDLER,
- "editable", GLADE_SIGNAL_COLUMN_IS_HANDLER,
- "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
NULL);
+ gtk_tree_view_column_set_cell_data_func (priv->column_handler, renderer,
+ glade_signal_editor_handler_cell_data_func,
+ self,
+ NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), priv->column_handler);
/* Signal user_data */
@@ -568,11 +786,13 @@ glade_signal_editor_init (GladeSignalEditor *self)
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (cell_area),
priv->renderer_userdata,
"text", GLADE_SIGNAL_COLUMN_OBJECT,
- "sensitive", GLADE_SIGNAL_COLUMN_NOT_DUMMY,
- "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
NULL);
-
+ gtk_tree_view_column_set_cell_data_func (priv->column_handler, priv->renderer_userdata,
+ glade_signal_editor_data_cell_data_func,
+ self,
+ NULL);
+
renderer = glade_cell_renderer_icon_new ();
g_object_set (G_OBJECT (renderer), "icon-name", GTK_STOCK_EDIT, NULL);
@@ -587,10 +807,10 @@ glade_signal_editor_init (GladeSignalEditor *self)
priv->column_userdata = gtk_tree_view_column_new_with_area (cell_area);
gtk_tree_view_column_set_title (priv->column_userdata,
_("User data"));
- gtk_tree_view_column_set_attributes (priv->column_userdata, renderer,
- "sensitive", GLADE_SIGNAL_COLUMN_NOT_DUMMY,
- "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
- NULL);
+ gtk_tree_view_column_set_cell_data_func (priv->column_handler, renderer,
+ glade_signal_editor_data_cell_data_func,
+ self,
+ NULL);
gtk_tree_view_column_set_resizable (priv->column_userdata, TRUE);
gtk_tree_view_column_set_expand (priv->column_userdata, TRUE);
@@ -602,22 +822,26 @@ glade_signal_editor_init (GladeSignalEditor *self)
priv->column_swap = gtk_tree_view_column_new_with_attributes (_("Swap"),
renderer,
"active", GLADE_SIGNAL_COLUMN_SWAP,
- "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
- "sensitive", GLADE_SIGNAL_COLUMN_NOT_DUMMY,
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), priv->column_swap);
-
+ gtk_tree_view_column_set_cell_data_func (priv->column_swap, renderer,
+ glade_signal_editor_data_cell_data_func,
+ self,
+ NULL);
+
/* After */
renderer = gtk_cell_renderer_toggle_new ();
g_signal_connect (renderer, "toggled", G_CALLBACK (on_after_toggled), self);
priv->column_after = gtk_tree_view_column_new_with_attributes (_("After"),
renderer,
"active", GLADE_SIGNAL_COLUMN_AFTER,
- "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
- "sensitive", GLADE_SIGNAL_COLUMN_NOT_DUMMY,
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), priv->column_after);
-
+ gtk_tree_view_column_set_cell_data_func (priv->column_after, renderer,
+ glade_signal_editor_data_cell_data_func,
+ self,
+ NULL);
+
/* Devhelp */
if (glade_util_have_devhelp ())
{
@@ -636,8 +860,10 @@ glade_signal_editor_init (GladeSignalEditor *self)
G_CALLBACK (glade_signal_editor_devhelp), self);
gtk_tree_view_column_pack_end (priv->column_after, renderer, FALSE);
- gtk_tree_view_column_set_attributes (priv->column_after, renderer,
- "visible", GLADE_SIGNAL_COLUMN_SHOW_DEVHELP, NULL);
+ gtk_tree_view_column_set_cell_data_func (priv->column_after, renderer,
+ glade_signal_editor_devhelp_cell_data_func,
+ self,
+ NULL);
}
diff --git a/gladeui/glade-signal-model.c b/gladeui/glade-signal-model.c
index 681ebe1..4b3dcd4 100644
--- a/gladeui/glade-signal-model.c
+++ b/gladeui/glade-signal-model.c
@@ -28,6 +28,8 @@
#define HANDLER_DEFAULT _("<Type here>")
#define USERDATA_DEFAULT _("<Click here>")
+#define DUMMY_DATA "__dummy"
+
struct _GladeSignalModelPrivate
{
GladeWidget *widget;
@@ -246,16 +248,8 @@ glade_signal_model_get_column_type (GtkTreeModel* model,
return G_TYPE_BOOLEAN;
case GLADE_SIGNAL_COLUMN_AFTER:
return G_TYPE_BOOLEAN;
- case GLADE_SIGNAL_COLUMN_IS_HANDLER:
- return G_TYPE_BOOLEAN;
- case GLADE_SIGNAL_COLUMN_NOT_DUMMY:
- return G_TYPE_BOOLEAN;
- case GLADE_SIGNAL_COLUMN_VERSION_WARNING:
- return G_TYPE_BOOLEAN;
case GLADE_SIGNAL_COLUMN_TOOLTIP:
return G_TYPE_STRING;
- case GLADE_SIGNAL_COLUMN_SHOW_DEVHELP:
- return G_TYPE_BOOLEAN;
case GLADE_SIGNAL_COLUMN_SIGNAL:
return G_TYPE_OBJECT;
default:
@@ -274,15 +268,11 @@ static gboolean
glade_signal_model_is_dummy_handler (GladeSignalModel* model,
GladeSignal* signal)
{
- GladeSignal* dummy;
-
- dummy = g_hash_table_lookup (model->priv->dummy_signals,
- glade_signal_get_name (signal));
-
- if (dummy && (signal == dummy))
- return TRUE;
+ gboolean dummy;
+ dummy = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (signal),
+ DUMMY_DATA));
- return FALSE;
+ return dummy;
}
static GladeSignal*
@@ -301,6 +291,7 @@ glade_signal_model_get_dummy_handler (GladeSignalModel* model,
USERDATA_DEFAULT,
FALSE,
FALSE);
+ g_object_set_data (G_OBJECT (signal), DUMMY_DATA, GINT_TO_POINTER (TRUE));
g_hash_table_insert (model->priv->dummy_signals,
(gpointer) glade_signal_class_get_name (sig_class),
signal);
@@ -577,7 +568,7 @@ glade_signal_model_get_value (GtkTreeModel* model,
else if (widget)
g_value_set_boolean (value,
TRUE);
- break;
+ break;
case GLADE_SIGNAL_COLUMN_HANDLER:
if (handler)
g_value_set_static_string (value,
@@ -618,31 +609,6 @@ glade_signal_model_get_value (GtkTreeModel* model,
g_value_set_boolean (value,
FALSE);
break;
- case GLADE_SIGNAL_COLUMN_IS_HANDLER:
- g_value_set_boolean (value,
- handler != NULL);
- break;
- case GLADE_SIGNAL_COLUMN_NOT_DUMMY:
- {
- gboolean is_dummy = handler ?
- glade_signal_model_is_dummy_handler (sig_model,
- handler) :
- TRUE;
- g_value_set_boolean (value,
- !is_dummy);
- break;
- }
- case GLADE_SIGNAL_COLUMN_VERSION_WARNING:
- {
- gboolean warn = FALSE;
- if (handler)
- {
- const gchar* warning = glade_signal_get_support_warning (handler);
- warn = warning && strlen (warning);
- }
- g_value_set_boolean (value, warn);
- break;
- }
case GLADE_SIGNAL_COLUMN_TOOLTIP:
if (handler)
g_value_set_string (value,
@@ -650,20 +616,6 @@ glade_signal_model_get_value (GtkTreeModel* model,
else
g_value_set_static_string (value, NULL);
break;
- case GLADE_SIGNAL_COLUMN_SHOW_DEVHELP:
- if (handler)
- {
- const GladeSignalClass* class = glade_signal_get_class (handler);
- GladeWidgetAdaptor* adaptor = glade_signal_class_get_adaptor (class);
- gchar* book;
-
- g_object_get (adaptor, "book", &book, NULL);
- g_value_set_boolean (value, book != NULL);
- g_free (book);
- break;
- }
- g_value_set_boolean (value, FALSE);
- break;
case GLADE_SIGNAL_COLUMN_SIGNAL:
g_value_set_object (value, handler);
break;
@@ -968,16 +920,19 @@ glade_signal_model_row_draggable (GtkTreeDragSource* model,
GtkTreePath* path)
{
GtkTreeIter iter;
- gboolean is_handler;
- gboolean not_dummy;
+ GladeSignal* signal;
+ gboolean retval;
gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path);
gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
- GLADE_SIGNAL_COLUMN_IS_HANDLER, &is_handler,
- GLADE_SIGNAL_COLUMN_NOT_DUMMY, ¬_dummy,
+ GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
-1);
- return (is_handler && not_dummy);
+ retval = signal && !glade_signal_model_is_dummy_handler (GLADE_SIGNAL_MODEL (model),
+ signal);
+
+ g_object_unref (signal);
+ return retval;
}
static gboolean
diff --git a/gladeui/glade-signal-model.h b/gladeui/glade-signal-model.h
index 970717a..dff82f8 100644
--- a/gladeui/glade-signal-model.h
+++ b/gladeui/glade-signal-model.h
@@ -43,11 +43,7 @@ typedef enum
GLADE_SIGNAL_COLUMN_OBJECT,
GLADE_SIGNAL_COLUMN_SWAP,
GLADE_SIGNAL_COLUMN_AFTER,
- GLADE_SIGNAL_COLUMN_IS_HANDLER,
- GLADE_SIGNAL_COLUMN_NOT_DUMMY,
- GLADE_SIGNAL_COLUMN_VERSION_WARNING,
GLADE_SIGNAL_COLUMN_TOOLTIP,
- GLADE_SIGNAL_COLUMN_SHOW_DEVHELP,
GLADE_SIGNAL_COLUMN_SIGNAL,
GLADE_SIGNAL_N_COLUMNS
} GladeSignalModelColumns;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]