[glade3/signal-tree-model: 58/358] signal-editor, signal-model: Added adding and changing of signal handlers



commit fc84a8989fac660e4aafc86ebb82eae7fde03424
Author: Johannes Schmid <jhs gnome org>
Date:   Tue Jul 6 19:57:59 2010 +0200

    signal-editor, signal-model: Added adding and changing of signal handlers
    
    Also fixed the iter->stamp stuff to change correctly when an iterator becomes invalid.

 gladeui/glade-signal-editor.c |  303 ++++++++++++++++++++++++++++++++++-------
 gladeui/glade-signal-model.c  |  147 ++++++++++++++++++---
 gladeui/glade-signal-model.h  |    5 +-
 3 files changed, 387 insertions(+), 68 deletions(-)
---
diff --git a/gladeui/glade-signal-editor.c b/gladeui/glade-signal-editor.c
index 0bc4de4..041cac2 100644
--- a/gladeui/glade-signal-editor.c
+++ b/gladeui/glade-signal-editor.c
@@ -45,6 +45,7 @@
 #include "glade-command.h"
 #include "glade-marshallers.h"
 #include "glade-accumulators.h"
+#include "glade-project.h"
 
 G_DEFINE_TYPE (GladeSignalEditor, glade_signal_editor, GTK_TYPE_VBOX)
 
@@ -56,16 +57,209 @@ struct _GladeSignalEditorPrivate
 	GladeWidgetAdaptor* adaptor;
 
 	GtkWidget* signal_tree;
+	GtkTreeViewColumn* column_name;	
+	GtkTreeViewColumn* column_handler;
+	GtkTreeViewColumn* column_userdata;
+	GtkTreeViewColumn* column_swap;
+	GtkTreeViewColumn* column_after;
+
+	GtkCellRenderer* renderer_userdata;
 };
 
-#define HANDLER_DEFAULT  _("<Type here>")
-#define USERDATA_DEFAULT _("<Object>")
+/* Signal handlers */
+static void
+on_handler_edited (GtkCellRendererText* renderer,
+                   gchar* path,
+                   gchar* handler,
+                   gpointer user_data)
+{
+	GladeSignalEditor* self = GLADE_SIGNAL_EDITOR(user_data);
+	GtkTreePath* tree_path = gtk_tree_path_new_from_string (path);
+	GtkTreeIter iter;
+	gchar* name;
+	gchar* old_handler;
+	gboolean not_dummy;
+
+	g_return_if_fail (self->priv->widget != NULL);
+	
+	gtk_tree_model_get_iter (self->priv->model,
+	                         &iter,
+	                         tree_path);
+
+	gtk_tree_model_get (self->priv->model, &iter,
+	                    GLADE_SIGNAL_COLUMN_NOT_DUMMY, &not_dummy,
+	                    GLADE_SIGNAL_COLUMN_HANDLER, &old_handler, -1);
+	
+	/* False alarm ? */
+	if (handler && !g_str_equal (old_handler, handler))
+	{
+		if (not_dummy)
+		{
+			/* change an existing signal handler */
+			GladeSignal* old_signal;
+			GladeSignal* new_signal;
+
+			gtk_tree_model_get (self->priv->model,
+			                    &iter,
+			                    GLADE_SIGNAL_COLUMN_SIGNAL,
+			                    &old_signal, -1);
+
+			new_signal = glade_signal_clone (old_signal);
+
+			/* Change the new signal handler */
+			g_free (new_signal->handler);
+			new_signal->handler = g_strdup(handler);
+
+			glade_command_change_signal (self->priv->widget, old_signal, new_signal);
+
+			glade_signal_free (new_signal);
+		}
+		else
+		{
+			GtkTreeIter parent;
+			GladeSignal* signal;
+
+			/* Get the signal name */
+			gtk_tree_model_iter_parent (self->priv->model, &parent, &iter);
+			gtk_tree_model_get (self->priv->model, &parent,
+			                    GLADE_SIGNAL_COLUMN_NAME, &name, 
+			                    -1);
+			
+			/* Add a new signal handler */
+			signal = glade_signal_new (name, handler, NULL, FALSE, FALSE);
+			glade_command_add_signal (self->priv->widget, signal);
+
+			/* Select next column */
+			gtk_tree_view_set_cursor (GTK_TREE_VIEW(self->priv->signal_tree),
+			                          tree_path,
+			                          self->priv->column_userdata,
+			                          TRUE);
+			glade_signal_free (signal);
+		}
+	}
+	g_free (name);
+	g_free (old_handler);
+	gtk_tree_path_free (tree_path);
+}
+
+static void
+on_userdata_edited (GtkCellRendererText* renderer,
+                    gchar* path,
+                    gchar* new_userdata,
+                    gpointer user_data)
+{
+	GladeSignalEditor* self = GLADE_SIGNAL_EDITOR(user_data);
+	GtkTreePath* tree_path = gtk_tree_path_new_from_string (path);
+	GtkTreeIter iter;
+	gchar* old_userdata;
+
+	g_return_if_fail (self->priv->widget != NULL);
+	
+	gtk_tree_model_get_iter (self->priv->model,
+	                         &iter,
+	                         tree_path);
+
+	gtk_tree_model_get (self->priv->model, &iter,
+	                    GLADE_SIGNAL_COLUMN_OBJECT, &old_userdata, -1);
+	
+	/* False alarm ? */
+	if (new_userdata && !g_str_equal (old_userdata, new_userdata))
+	{
+		/* change an existing signal handler */
+		GladeSignal* old_signal;
+		GladeSignal* new_signal;
+
+		gtk_tree_model_get (self->priv->model,
+		                    &iter,
+		                    GLADE_SIGNAL_COLUMN_SIGNAL,
+		                    &old_signal, -1);
+
+		new_signal = glade_signal_clone (old_signal);
+
+		/* Change the new signal handler */
+		g_free (new_signal->userdata);
+		new_signal->userdata = g_strdup(new_userdata);
+
+		glade_command_change_signal (self->priv->widget, old_signal, new_signal);
+
+		glade_signal_free (new_signal);
+	}
+	g_free (old_userdata);
+	gtk_tree_path_free (tree_path);
+}
+
+static void
+on_swap_toggled (GtkCellRendererToggle* renderer,
+                 gchar* path,
+                 gpointer user_data)
+{
+	GladeSignalEditor* self = GLADE_SIGNAL_EDITOR(user_data);
+	GtkTreePath* tree_path = gtk_tree_path_new_from_string (path);
+	GtkTreeIter iter;
+	GladeSignal* old_signal;
+	GladeSignal* new_signal;
+
+	g_return_if_fail (self->priv->widget != NULL);
+	
+	gtk_tree_model_get_iter (self->priv->model,
+	                         &iter,
+	                         tree_path);
+
+	gtk_tree_model_get (self->priv->model,
+		                    &iter,
+		                    GLADE_SIGNAL_COLUMN_SIGNAL,
+		                    &old_signal, -1);
+
+	new_signal = glade_signal_clone (old_signal);
+
+	/* Change the new signal handler */
+	new_signal->swapped = !gtk_cell_renderer_toggle_get_active (renderer);
+
+	glade_command_change_signal (self->priv->widget, old_signal, new_signal);
+
+	glade_signal_free (new_signal);
+	
+	gtk_tree_path_free (tree_path);		
+}
+
+static void
+on_after_toggled (GtkCellRendererToggle* renderer,
+                  gchar* path,
+                  gpointer user_data)
+{
+	GladeSignalEditor* self = GLADE_SIGNAL_EDITOR(user_data);
+	GtkTreePath* tree_path = gtk_tree_path_new_from_string (path);
+	GtkTreeIter iter;
+	GladeSignal* old_signal;
+	GladeSignal* new_signal;
+
+	g_return_if_fail (self->priv->widget != NULL);
+	
+	gtk_tree_model_get_iter (self->priv->model,
+	                         &iter,
+	                         tree_path);
+
+	gtk_tree_model_get (self->priv->model,
+		                    &iter,
+		                    GLADE_SIGNAL_COLUMN_SIGNAL,
+		                    &old_signal, -1);
+
+	new_signal = glade_signal_clone (old_signal);
+
+	/* Change the new signal handler */
+	new_signal->after = !gtk_cell_renderer_toggle_get_active (renderer);
+
+	glade_command_change_signal (self->priv->widget, old_signal, new_signal);
+
+	glade_signal_free (new_signal);
+	
+	gtk_tree_path_free (tree_path);	
+}
 
 /**
  * glade_signal_editor_new:
- * @editor: a #GladeEditor
  *
- * Returns: a new #GladeSignalEditor associated with @editor
+ * Returns: a new #GladeSignalEditor
  */
 GladeSignalEditor *
 glade_signal_editor_new ()
@@ -81,9 +275,10 @@ glade_signal_editor_new ()
 /**
  * glade_signal_editor_load_widget:
  * @editor: a #GladeSignalEditor
- * @widget: a #GladeWidget
+ * @widget: a #GladeWidget or NULL
  *
- * TODO: write me
+ * Load a widget in the signal editor. This will show all signals of the widget
+ * an it's accessors in the signal editor where the user can edit them.
  */
 void
 glade_signal_editor_load_widget (GladeSignalEditor *editor,
@@ -92,9 +287,7 @@ glade_signal_editor_load_widget (GladeSignalEditor *editor,
 	GladeSignalEditorPrivate *priv = editor->priv;
 	
 	if (priv->widget != widget)
-	{
-		if (priv->widget)
-		
+	{	
 		priv->widget = widget;
 		priv->adaptor = widget ? widget->adaptor : NULL;
 		
@@ -115,6 +308,7 @@ glade_signal_editor_load_widget (GladeSignalEditor *editor,
 
 	priv->model = glade_signal_model_new (widget);
 	gtk_tree_view_set_model (GTK_TREE_VIEW (priv->signal_tree), priv->model);
+	g_object_set (priv->renderer_userdata, "model", glade_app_get_project (), NULL);
 }
 
 static void
@@ -132,62 +326,73 @@ glade_signal_editor_init (GladeSignalEditor *self)
 {
 	GtkWidget *scroll;
 	GtkCellRenderer* renderer;
-	GtkTreeViewColumn* column;
-
+	GladeSignalEditorPrivate* priv;
+	
 	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GLADE_TYPE_SIGNAL_EDITOR, GladeSignalEditorPrivate);
-
+	priv = self->priv;
+	
 	/* Create signal tree */
-	self->priv->signal_tree = gtk_tree_view_new ();
+	priv->signal_tree = gtk_tree_view_new ();
 
 	/* Create columns */
 	/* Signal name */
 	renderer = gtk_cell_renderer_text_new ();
-	column = gtk_tree_view_column_new_with_attributes (_("Signal"),
-	                                                   renderer,
-	                                                   "text", GLADE_SIGNAL_COLUMN_NAME,
-	                                                   NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), column);
+	priv->column_name = gtk_tree_view_column_new_with_attributes (_("Signal"),
+	                                                              renderer,
+	                                                              "text", GLADE_SIGNAL_COLUMN_NAME,
+	                                                              NULL);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), priv->column_name);
 
 	/* Signal handler */
 	renderer = gtk_cell_renderer_text_new ();
-	g_object_set (renderer, "foreground", "grey", NULL);
-	column = gtk_tree_view_column_new_with_attributes (_("Handler"),
-	                                                   renderer,
-	                                                   "text", GLADE_SIGNAL_COLUMN_HANDLER,
-	                                                   "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
-	                                                   "foreground-set", GLADE_SIGNAL_COLUMN_IS_DUMMY,
-	                                                   NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), column);
-
+	g_object_set (renderer, 
+	              "editable", TRUE, NULL);
+	g_signal_connect (renderer, "edited", G_CALLBACK(on_handler_edited), self);
+	priv->column_handler = gtk_tree_view_column_new_with_attributes (_("Handler"),
+	                                                                  renderer,
+	                                                                  "text", GLADE_SIGNAL_COLUMN_HANDLER,
+	                                                                  "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
+	                                                                  NULL);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), priv->column_handler);
 	/* Signal user_data */
-	renderer = gtk_cell_renderer_text_new ();
-	column = gtk_tree_view_column_new_with_attributes (_("User data"),
-	                                                   renderer,
-	                                                   "text", GLADE_SIGNAL_COLUMN_OBJECT,
-	                                                   "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
-	                                                   "sensitive", GLADE_SIGNAL_COLUMN_IS_DUMMY, 
-	                                                   NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), column);
+	priv->renderer_userdata = gtk_cell_renderer_combo_new ();
+	g_signal_connect (priv->renderer_userdata, "edited", G_CALLBACK(on_userdata_edited),
+	                  self);
+	g_object_set (priv->renderer_userdata, 
+	              "has-entry", FALSE,
+	              "text-column", GLADE_PROJECT_MODEL_COLUMN_NAME,
+	              NULL);
+
+	priv->column_userdata = gtk_tree_view_column_new_with_attributes (_("User data"),
+	                                                              priv->renderer_userdata,
+	                                                              "text", GLADE_SIGNAL_COLUMN_OBJECT,
+	                                                              "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
+	                                                              "sensitive", GLADE_SIGNAL_COLUMN_NOT_DUMMY,
+	                                                               "editable", GLADE_SIGNAL_COLUMN_NOT_DUMMY,
+	                                                              NULL);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), priv->column_userdata);
 
 	/* Swap signal */
 	renderer = gtk_cell_renderer_toggle_new ();
-	column = gtk_tree_view_column_new_with_attributes (_("Swap"),
-	                                                   renderer,
-	                                                   "active", GLADE_SIGNAL_COLUMN_SWAP,
-	                                                   "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
-	                                                   "sensitive", GLADE_SIGNAL_COLUMN_IS_DUMMY,
-	                                                   NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), column);
+	g_signal_connect (renderer, "toggled", G_CALLBACK (on_swap_toggled), 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);
 
 	/* After */
 	renderer = gtk_cell_renderer_toggle_new ();
-	column = gtk_tree_view_column_new_with_attributes (_("After"),
-	                                                   renderer,
-	                                                   "active", GLADE_SIGNAL_COLUMN_AFTER,
-	                                                   "visible", GLADE_SIGNAL_COLUMN_IS_HANDLER,
-	                                                   "sensitive", GLADE_SIGNAL_COLUMN_IS_DUMMY,
-	                                                   NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (self->priv->signal_tree), column);
+	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);
 	
 	/* Create scrolled window */
 	scroll = gtk_scrolled_window_new (NULL, NULL);
diff --git a/gladeui/glade-signal-model.c b/gladeui/glade-signal-model.c
index a4e5513..f8a7cdb 100644
--- a/gladeui/glade-signal-model.c
+++ b/gladeui/glade-signal-model.c
@@ -5,7 +5,7 @@
  * 
  * glade3 is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or
+ * Free Software Foundation, either version 2 of the License, or
  * (at your option) any later version.
  * 
  * glade3 is distributed in the hope that it will be useful, but
@@ -16,10 +16,18 @@
  * You should have received a copy of the GNU General Public License along
  * with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include "glade-signal-model.h"
+
+#include <glib/gi18n-lib.h>
 #include <string.h>
 
+#define HANDLER_DEFAULT  _("<Type here>")
+#define USERDATA_DEFAULT _("<Object>")
+
 struct _GladeSignalModelPrivate
 {
 	GladeWidget *widget;
@@ -37,6 +45,16 @@ enum
 
 static void gtk_tree_model_iface_init (GtkTreeModelIface* iface);
 
+static void
+on_glade_signal_model_added (GladeWidget* widget, const GladeSignal* signal,
+                             GladeSignalModel* model);
+static void
+on_glade_signal_model_removed (GladeWidget* widget, const GladeSignal* signal,
+                               GladeSignalModel* model);
+static void
+on_glade_signal_model_changed (GladeWidget* widget, const GladeSignal* old_signal,
+                               const GladeSignal* new_signal, GladeSignalModel* model);	
+
 G_DEFINE_TYPE_WITH_CODE (GladeSignalModel, glade_signal_model, G_TYPE_OBJECT,
                          G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
                                       gtk_tree_model_iface_init))
@@ -87,6 +105,15 @@ glade_signal_model_set_property (GObject *object, guint prop_id, const GValue *v
 	case PROP_WIDGET:
 		sig_model->priv->widget = g_value_get_object (value);
 		glade_signal_model_create_widget_list (sig_model);
+		g_signal_connect (sig_model->priv->widget,
+		                  "add-signal-handler",
+		                  G_CALLBACK (on_glade_signal_model_added), sig_model);
+		g_signal_connect (sig_model->priv->widget,
+		                  "remove-signal-handler",
+		                  G_CALLBACK (on_glade_signal_model_removed), sig_model);
+		g_signal_connect (sig_model->priv->widget,
+		                  "change-signal-handler",
+		                  G_CALLBACK (on_glade_signal_model_changed), sig_model);			
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -180,8 +207,10 @@ glade_signal_model_get_column_type (GtkTreeModel* model,
 			return G_TYPE_BOOLEAN;
 		case GLADE_SIGNAL_COLUMN_IS_HANDLER:
 			return G_TYPE_BOOLEAN;
-		case GLADE_SIGNAL_COLUMN_IS_DUMMY:
+		case GLADE_SIGNAL_COLUMN_NOT_DUMMY:
 			return G_TYPE_BOOLEAN;
+		case GLADE_SIGNAL_COLUMN_SIGNAL:
+			return G_TYPE_POINTER;
 		default:
 			g_assert_not_reached();
 			return G_TYPE_NONE;
@@ -205,8 +234,8 @@ glade_signal_model_get_dummy_handler (GladeSignalModel* model, GladeSignalClass*
 	if (!signal)
 	{
 		signal = glade_signal_new (sig_class->name,
-		                           "<Handler>",
-		                           "",
+		                           HANDLER_DEFAULT,
+		                           USERDATA_DEFAULT,
 		                           FALSE,
 		                           FALSE);
 		g_hash_table_insert (model->priv->dummy_signals, (gpointer) sig_class->name, signal);
@@ -215,17 +244,17 @@ glade_signal_model_get_dummy_handler (GladeSignalModel* model, GladeSignalClass*
 }
 
 static gboolean
-glade_signal_model_is_dummy_handler (GladeSignalModel* model, 
-                                     GtkTreeIter* iter)
+glade_signal_model_not_dummy_handler (GladeSignalModel* model, 
+                                      GtkTreeIter* iter)
 {
 	const gchar* widget = iter->user_data;
 	GladeSignalClass* sig_class = iter->user_data2;
 	GladeSignal* handler = iter->user_data3;
 
 	if (widget && sig_class && handler)
-		return handler == glade_signal_model_get_dummy_handler (model,
+		return handler != glade_signal_model_get_dummy_handler (model,
 		                                                       sig_class);
-	return FALSE;
+	return TRUE;
 }
 
 static void
@@ -243,12 +272,12 @@ static void
 glade_signal_model_create_handler_iter (GladeSignalModel* sig_model,
                                         const gchar* widget,
                                         GladeSignalClass* signal_class,
-                                        GladeSignal* signal,
+                                        const GladeSignal* signal,
                                         GtkTreeIter* iter)
 {
 	glade_signal_model_create_widget_iter (sig_model, widget, iter);
 	iter->user_data2 = signal_class;
-	iter->user_data3 = signal;
+	iter->user_data3 = (GladeSignal*) signal;
 }
 
 static void
@@ -279,6 +308,80 @@ static GList* glade_signal_model_create_signal_list (GladeSignalModel* sig_model
 }
 
 static gboolean
+glade_signal_model_iter_for_signal (GladeSignalModel* model, const GladeSignal* signal, GtkTreeIter* iter)
+{
+	GList* list;
+	
+	for (list = model->priv->widget->adaptor->signals;
+	     list != NULL; list = g_list_next (list))
+	{
+		GladeSignalClass *sig_class = (GladeSignalClass *) list->data;
+		if (g_str_equal (signal->name, sig_class->name))
+		{
+			glade_signal_model_create_handler_iter (model,
+			                                        sig_class->type,
+			                                        sig_class,
+			                                        signal,
+			                                        iter);
+			return TRUE;
+		}		
+	}
+	return FALSE;
+}
+
+static void
+on_glade_signal_model_added (GladeWidget* widget, const GladeSignal* signal,
+                             GladeSignalModel* model)
+{
+	GtkTreeIter iter;
+	if (glade_signal_model_iter_for_signal (model, signal, &iter))
+	{
+		GtkTreePath* path = gtk_tree_model_get_path (GTK_TREE_MODEL (model),
+		                                             &iter);
+		gtk_tree_model_row_inserted (GTK_TREE_MODEL (model),
+		                             path,
+		                             &iter);
+		gtk_tree_path_free (path);
+		model->priv->stamp++;
+	}
+}
+
+static void
+on_glade_signal_model_removed (GladeWidget* widget, const GladeSignal* signal,
+                               GladeSignalModel* model)
+{
+	GtkTreeIter iter;
+	if (glade_signal_model_iter_for_signal (model, signal, &iter))
+	{
+		GtkTreePath* path = gtk_tree_model_get_path (GTK_TREE_MODEL (model),
+		                                             &iter);
+		gtk_tree_model_row_deleted (GTK_TREE_MODEL (model),
+		                            gtk_tree_model_get_path (GTK_TREE_MODEL (model),
+		                                                     &iter));
+		gtk_tree_path_free (path);
+		model->priv->stamp++;
+	}
+}
+
+static void
+on_glade_signal_model_changed (GladeWidget* widget, const GladeSignal* old_signal,
+                               const GladeSignal* new_signal, GladeSignalModel* model)
+{
+	GtkTreeIter iter;
+	if (glade_signal_model_iter_for_signal (model, new_signal, &iter))
+	{
+		GtkTreePath* path = gtk_tree_model_get_path (GTK_TREE_MODEL (model),
+		                                             &iter);
+		gtk_tree_model_row_changed (GTK_TREE_MODEL (model),
+		                            gtk_tree_model_get_path (GTK_TREE_MODEL (model),
+		                                                     &iter),
+		                            &iter);
+		gtk_tree_path_free (path);
+		model->priv->stamp++;
+	}
+}
+
+static gboolean
 glade_signal_model_get_iter (GtkTreeModel* model,
                              GtkTreeIter* iter,
                              GtkTreePath* path)
@@ -389,9 +492,10 @@ glade_signal_model_get_path (GtkTreeModel* model,
 	{
 		/* Handler */
 		GPtrArray* handlers;
-		gint index0, index1, index2;
+		gint index0, index1, index2;	
 		GList* signals = glade_signal_model_create_signal_list (sig_model,
 		                                                        widget);
+
 		index0 = g_list_index (sig_model->priv->widgets,
 		                       widget);
 		index1 = g_list_index (signals, sig_class);
@@ -411,8 +515,8 @@ glade_signal_model_get_path (GtkTreeModel* model,
 			index2 = g_ptr_array_find (handlers, handler);
 		else
 			g_assert_not_reached();
-		
-		g_list_free (signals);
+
+		g_list_free (signals);				
 		return gtk_tree_path_new_from_indices (index0, index1, index2, -1);
 	}
 	else if (sig_class)
@@ -481,8 +585,14 @@ glade_signal_model_get_value (GtkTreeModel* model,
 			break;
 		case GLADE_SIGNAL_COLUMN_OBJECT:
 			if (widget && sig_class && handler)
-				g_value_set_static_string (value,
-				                           handler->userdata);
+			{
+				if (handler->userdata && strlen (handler->userdata))
+					g_value_set_static_string (value,
+					                           handler->userdata);
+				else
+					g_value_set_static_string (value,
+					                           USERDATA_DEFAULT);
+			}
 			else 
 				g_value_set_static_string (value,
 				                           "");
@@ -511,11 +621,14 @@ glade_signal_model_get_value (GtkTreeModel* model,
 			g_value_set_boolean (value,
 			                     !(widget && sig_class && handler));
 			break;
-		case GLADE_SIGNAL_COLUMN_IS_DUMMY:
+		case GLADE_SIGNAL_COLUMN_NOT_DUMMY:
 			g_value_set_boolean (value,
-				                 glade_signal_model_is_dummy_handler (sig_model,
+				                 glade_signal_model_not_dummy_handler (sig_model,
 				                                                      iter));
 			break;
+		case GLADE_SIGNAL_COLUMN_SIGNAL:
+			g_value_set_pointer (value, handler);
+			break;
 		default:
 			g_assert_not_reached();
 	}
diff --git a/gladeui/glade-signal-model.h b/gladeui/glade-signal-model.h
index 3eb10ab..3aa9c34 100644
--- a/gladeui/glade-signal-model.h
+++ b/gladeui/glade-signal-model.h
@@ -5,7 +5,7 @@
  * 
  * glade3 is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or
+ * Free Software Foundation, either version 2 of the License, or
  * (at your option) any later version.
  * 
  * glade3 is distributed in the hope that it will be useful, but
@@ -45,8 +45,9 @@ typedef enum
 	GLADE_SIGNAL_COLUMN_AFTER,
 	GLADE_SIGNAL_COLUMN_IS_HANDLER,
 	GLADE_SIGNAL_COLUMN_IS_LABEL,
-	GLADE_SIGNAL_COLUMN_IS_DUMMY,
+	GLADE_SIGNAL_COLUMN_NOT_DUMMY,
 	GLADE_SIGNAL_COLUMN_VERSION_WARNING,
+	GLADE_SIGNAL_COLUMN_SIGNAL,
 	GLADE_SIGNAL_N_COLUMNS
 } GladeSignalModelColumns;
 



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