[glade/glade-3-8] * gladeui/glade-project.[ch], gladeui/glade-widget.c: Backported glade_project_check_reordered()



commit 9d0178abd36ba77d0e38d02e80b8b34a542a7ba3
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Mon Apr 4 18:28:12 2011 +0900

    	* gladeui/glade-project.[ch], gladeui/glade-widget.c: Backported glade_project_check_reordered()

 ChangeLog                |    2 +
 gladeui/glade-project.c  |  110 +++++++++++++++++++++++++++++++++++++++++-----
 gladeui/glade-project.h  |    4 ++
 gladeui/glade-widget.c   |   20 ++++++++
 plugins/gtk+/glade-gtk.c |    1 -
 5 files changed, 125 insertions(+), 12 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 2041666..32439c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,8 @@
 
 	* gladeui/glade-base-editor.c: Backported fixes from master.
 
+	* gladeui/glade-project.[ch], gladeui/glade-widget.c: Backported glade_project_check_reordered()
+
 2011-02-05  Tristan Van Berkom <tristanvb openismus com>
 
 	* plugins/gtk+/gtk+.xml.in: Disabling irrelevant properties for GtkScaleButton
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index a48d9c1..e894664 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -220,16 +220,21 @@ static void         target_button_clicked                   (GtkWidget         *
 							     GladeProject      *project);
 static void         update_prefs_for_resource_path          (GladeProject      *project);
 
-static guint              glade_project_signals[LAST_SIGNAL] = {0};
-
-static GladeIDAllocator  *unsaved_number_allocator = NULL;
-
 static void	    gtk_tree_model_iface_init (GtkTreeModelIface* iface);
 
 static void         glade_project_model_get_iter_for_object (GladeProject* project,
                                                              GObject* object,
                                                              GtkTreeIter* iter);
 
+static gint         glade_project_count_children (GladeProject *project, 
+						  GladeWidget  *parent);
+
+
+static guint              glade_project_signals[LAST_SIGNAL] = {0};
+
+static GladeIDAllocator  *unsaved_number_allocator = NULL;
+
+
 
 #define GLADE_PROJECT_LARGE_PROJECT 40
 
@@ -2811,6 +2816,34 @@ glade_project_set_widget_name (GladeProject *project,
 	gtk_tree_path_free (path);
 }
 
+static void
+glade_project_notify_row_has_child (GladeProject *project,
+				    GladeWidget  *gwidget)
+{
+	GladeWidget *parent;
+	gint         siblings;
+	
+	parent = glade_widget_get_parent (gwidget);
+
+	if (parent)
+	{
+		siblings = glade_project_count_children (project, parent);
+
+		if (siblings == 1)
+		{
+			GtkTreePath *path;
+			GtkTreeIter  iter;
+ 
+			glade_project_model_get_iter_for_object (project, 
+								 glade_widget_get_object (parent), &iter);
+			path = gtk_tree_model_get_path (GTK_TREE_MODEL (project), &iter);
+			gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (project), path, &iter);
+			gtk_tree_path_free (path);
+		}
+	}
+}
+ 
+
 static void 
 glade_project_notify_row_inserted (GladeProject *project,
 				   GladeWidget  *gwidget)
@@ -2827,9 +2860,7 @@ glade_project_notify_row_inserted (GladeProject *project,
 	gtk_tree_model_row_inserted (GTK_TREE_MODEL (project), path, &iter);
 	gtk_tree_path_free (path);
 
-	/* XXX Need to check and call this 
-	 * gtk_tree_model_row_has_child_toggled 
-	 */
+	glade_project_notify_row_has_child (project, gwidget);
 }
 
 static void 
@@ -2844,12 +2875,66 @@ glade_project_notify_row_deleted (GladeProject *project,
 	gtk_tree_model_row_deleted (GTK_TREE_MODEL (project), path);
 	gtk_tree_path_free (path);
 
-	/* XXX Need to check and call this 
-	 * gtk_tree_model_row_has_child_toggled 
-	 */
+	project->priv->stamp++;
+}
 
+void
+glade_project_check_reordered (GladeProject       *project,
+			       GladeWidget        *parent,
+			       GList              *old_order)
+{
+  GList       *new_order, *l, *ll;
+  gint        *order, n_children, i;
+  GtkTreeIter  iter;
+  GtkTreePath *path;
+
+  g_return_if_fail (GLADE_IS_PROJECT (project));
+  g_return_if_fail (GLADE_IS_WIDGET (parent));
+  g_return_if_fail (glade_project_has_object (project,
+                                             glade_widget_get_object (parent)));
+
+  new_order = glade_widget_get_children (parent);
+
+  /* Check if the list changed */
+  for (l = old_order, ll = new_order; 
+       l && ll; 
+       l = l->next, ll = ll->next)
+    {
+      if (l->data != ll->data)
+       break;
+    }
 
-	project->priv->stamp++;
+  if (l || ll)
+    {
+      n_children = glade_project_count_children (project, parent);
+      order = g_new (gint, n_children);
+
+      for (i = 0, l = new_order; l; l = l->next)
+       {
+         GObject *obj = l->data;
+
+         if (glade_project_has_object (project, obj))
+           {
+             GList *node = g_list_find (old_order, obj);
+
+             g_assert (node);
+
+             order[i] = g_list_position (old_order, node);
+
+             i++;
+           }
+       }
+
+      /* Signal that the rows were reordered */
+      glade_project_model_get_iter_for_object (project, glade_widget_get_object (parent), &iter);
+      path = gtk_tree_model_get_path (GTK_TREE_MODEL (project), &iter);
+      gtk_tree_model_rows_reordered (GTK_TREE_MODEL (project), path, &iter, order);
+      gtk_tree_path_free (path);
+
+      g_free (order);
+    }
+
+  g_list_free (new_order);
 }
 
 /**
@@ -3026,6 +3111,9 @@ glade_project_remove_object (GladeProject *project, GObject *object)
 	/* Unset the project pointer on the GladeWidget */
 	glade_widget_set_project (gwidget, NULL);
 	gwidget->in_project = FALSE;
+
+
+	glade_project_notify_row_has_child (project, gwidget);
 	g_object_unref (gwidget);
 
 }
diff --git a/gladeui/glade-project.h b/gladeui/glade-project.h
index ab6b744..5071647 100644
--- a/gladeui/glade-project.h
+++ b/gladeui/glade-project.h
@@ -215,6 +215,10 @@ void          glade_project_update_signal_support_warning (GladeWidget  *widget,
 
 gchar        *glade_project_display_dependencies (GladeProject *project);
 
+void          glade_project_check_reordered (GladeProject       *project,
+					     GladeWidget        *parent,
+					     GList              *old_order);
+
 void          glade_project_push_progress (GladeProject *project);
 gboolean      glade_project_load_cancelled (GladeProject *project);
 void          glade_project_cancel_load (GladeProject *project);
diff --git a/gladeui/glade-widget.c b/gladeui/glade-widget.c
index 46b1ad3..118dc55 100644
--- a/gladeui/glade-widget.c
+++ b/gladeui/glade-widget.c
@@ -3261,14 +3261,34 @@ glade_widget_child_set_property (GladeWidget      *widget,
 				 const gchar      *property_name,
 				 const GValue     *value)
 {
+	GList *old_order = NULL;
+
 	g_return_if_fail (GLADE_IS_WIDGET (widget));
 	g_return_if_fail (GLADE_IS_WIDGET (child));
 	g_return_if_fail (property_name != NULL && value != NULL);
 
+
+	if (widget->project &&
+	    widget->in_project)
+		old_order = glade_widget_get_children (widget);
+
 	glade_widget_adaptor_child_set_property (widget->adaptor,
 						 widget->object,
 						 child->object,
 						 property_name, value);
+
+	/* After setting a child property... it's possible the order of children
+	 * in the parent has been effected.
+	 *
+	 * If this is the case then we need to signal the GladeProject that
+	 * it's rows have been reordered so that any connected views update
+	 * themselves properly.
+	 */
+	if (widget->project &&
+	    widget->in_project)
+		glade_project_check_reordered (widget->project, widget, old_order);
+
+	g_list_free (old_order);
 }
 
 /**
diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c
index 4a3c893..0ef33ce 100644
--- a/plugins/gtk+/glade-gtk.c
+++ b/plugins/gtk+/glade-gtk.c
@@ -1030,7 +1030,6 @@ glade_gtk_widget_action_activate (GladeWidgetAdaptor *adaptor,
 	GladeWidget *gwidget = glade_widget_get_from_gobject (object), *gparent;
 	GList       this_widget = { 0, }, that_widget = { 0, };
 	GtkWidget   *parent = gtk_widget_get_parent (GTK_WIDGET (object));
-	GladeProject *project;
 
 	if (parent)
 		gparent = glade_widget_get_from_gobject (parent);



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