[glade/glade-3-8] * gladeui/glade-widget.[ch], gladeui/glade-project.c, gladeui/glade-utils.c: Now update the Glad



commit ea43dd1e724e1449615d41bef1ad34fb040057b0
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Thu Feb 3 17:58:09 2011 +0900

    	* gladeui/glade-widget.[ch], gladeui/glade-project.c, gladeui/glade-utils.c: Now update
    	  the GladeWidget's project pointer when going in and out of a project.

 ChangeLog               |    5 +++++
 gladeui/glade-project.c |   32 ++++++++++++++++++++++++--------
 gladeui/glade-utils.c   |    2 +-
 gladeui/glade-widget.c  |   29 ++++++++++++++++-------------
 gladeui/glade-widget.h  |   23 +++++++++++++----------
 5 files changed, 59 insertions(+), 32 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 316dd92..e57e197 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-02-03  Tristan Van Berkom <tristanvb openismus com>
+
+	* gladeui/glade-widget.[ch], gladeui/glade-project.c, gladeui/glade-utils.c: Now update
+	  the GladeWidget's project pointer when going in and out of a project.
+
 2011-01-29  Tristan Van Berkom <tristanvb openismus com>
 
 	* plugins/gtk+/glade-model-data.c: Avoid committing the data if the data did not
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index 163290e..5b7ba0f 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -2406,7 +2406,14 @@ glade_project_verify_signals (GladeWidget  *widget,
 void
 glade_project_verify_properties (GladeWidget *widget)
 {
+	GladeProject *project;
+
 	g_return_if_fail (GLADE_IS_WIDGET (widget));
+
+	project = glade_widget_get_project (widget);
+	if (!project || project->priv->loading)
+		return;
+
 	glade_project_verify_properties_internal (widget, NULL, NULL, TRUE);
 	glade_project_verify_signals (widget, NULL, NULL, TRUE);
 
@@ -2860,7 +2867,6 @@ glade_project_available_widget_name (GladeProject *project,
 	
 	g_return_val_if_fail (GLADE_IS_PROJECT (project), FALSE);
 	g_return_val_if_fail (GLADE_IS_WIDGET (widget), FALSE);
-	g_return_val_if_fail (widget->project == project, FALSE);
 
 	if (!name || !name[0])
 		return FALSE;
@@ -2933,7 +2939,6 @@ glade_project_new_widget_name (GladeProject *project,
 
 	g_return_val_if_fail (GLADE_IS_PROJECT (project), NULL);
 	g_return_val_if_fail (GLADE_IS_WIDGET (widget), NULL);
-	g_return_val_if_fail (widget->project == project, NULL);
 	g_return_val_if_fail (base_name && base_name[0], NULL);
 
 	context = name_context_by_widget (project, widget);
@@ -2975,7 +2980,6 @@ glade_project_set_widget_name (GladeProject *project,
 
 	g_return_if_fail (GLADE_IS_PROJECT (project));
 	g_return_if_fail (GLADE_IS_WIDGET (widget));
-	g_return_if_fail (widget->project == project);
 	g_return_if_fail (name && name[0]);
 
 	if (strcmp (name, widget->name) == 0)
@@ -3138,6 +3142,7 @@ glade_project_add_object (GladeProject *project,
 	glade_project_reserve_widget_name (project, gwidget, gwidget->name);
 
 	glade_widget_set_project (gwidget, (gpointer)project);
+	gwidget->in_project = TRUE;
 	g_object_ref_sink (gwidget);
 
 	/* Be sure to update the lists before emitting signals */
@@ -3180,9 +3185,15 @@ glade_project_add_object (GladeProject *project,
 gboolean
 glade_project_has_object (GladeProject *project, GObject *object)
 {
+	GladeWidget *gwidget;
+
 	g_return_val_if_fail (GLADE_IS_PROJECT (project), FALSE);
 	g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
-	return (g_list_find (project->priv->objects, object)) != NULL;
+
+	gwidget = glade_widget_get_from_gobject (object);
+	g_return_val_if_fail (GLADE_IS_WIDGET (gwidget), FALSE);
+
+	return (glade_widget_get_project (gwidget) == project && gwidget->in_project);
 }
 
 /**
@@ -3205,6 +3216,9 @@ glade_project_remove_object (GladeProject *project, GObject *object)
 	g_return_if_fail (GLADE_IS_PROJECT (project));
 	g_return_if_fail (G_IS_OBJECT      (object));
 
+	if (!glade_project_has_object (project, object))
+		return;
+
 	if (GLADE_IS_PLACEHOLDER (object))
 		return;
 
@@ -3236,6 +3250,10 @@ glade_project_remove_object (GladeProject *project, GObject *object)
 	/* Update internal data structure (remove from lists) */
 	project->priv->tree    = g_list_remove (project->priv->tree, object);
 	project->priv->objects = g_list_remove (project->priv->objects, object);
+
+	/* Unset the project pointer on the GladeWidget */
+	glade_widget_set_project (gwidget, NULL);
+	gwidget->in_project = FALSE;
 	g_object_unref (gwidget);
 
 	glade_project_update_previewable (project);
@@ -3518,7 +3536,7 @@ glade_project_selection_add (GladeProject *project,
 {
 	g_return_if_fail (GLADE_IS_PROJECT (project));
 	g_return_if_fail (G_IS_OBJECT      (object));
-	g_return_if_fail (g_list_find (project->priv->objects, object) != NULL);
+	g_return_if_fail (glade_project_has_object (project, object));
 
 	if (glade_project_is_selected (project, object) == FALSE)
 	{
@@ -3550,9 +3568,7 @@ glade_project_selection_set (GladeProject *project,
 {
 	g_return_if_fail (GLADE_IS_PROJECT (project));
 	g_return_if_fail (G_IS_OBJECT      (object));
-
-	if (g_list_find (project->priv->objects, object) == NULL)
-		return;
+	g_return_if_fail (glade_project_has_object (project, object));
 
 	if (project->priv->selection == NULL)
 		glade_project_set_has_selection (project, TRUE);
diff --git a/gladeui/glade-utils.c b/gladeui/glade-utils.c
index 1fb5484..a7c4f15 100644
--- a/gladeui/glade-utils.c
+++ b/gladeui/glade-utils.c
@@ -1796,7 +1796,7 @@ glade_util_object_is_loading (GObject *object)
 	
 	project = glade_widget_get_project (widget);
 	
-	return glade_project_is_loading (project);
+	return project && glade_project_is_loading (project);
 }
 
 /**
diff --git a/gladeui/glade-widget.c b/gladeui/glade-widget.c
index 30e52ee..a0bf81e 100644
--- a/gladeui/glade-widget.c
+++ b/gladeui/glade-widget.c
@@ -2334,6 +2334,7 @@ glade_widget_rebuild (GladeWidget *gwidget)
 {
 	GObject            *new_object, *old_object;
 	GladeWidgetAdaptor *adaptor;
+	GladeProject       *project = NULL;
 	GList              *children;
 	gboolean            reselect = FALSE, inproject;
 	GList              *restore_properties = NULL;
@@ -2343,6 +2344,10 @@ glade_widget_rebuild (GladeWidget *gwidget)
 
 	adaptor = gwidget->adaptor;
 
+	if (gwidget->project && 
+	    glade_project_has_object (gwidget->project, gwidget->object))
+		project = gwidget->project;
+
 	g_object_ref (gwidget);
 
 	/* Extract and keep the child hierarchies aside... */
@@ -2355,16 +2360,15 @@ glade_widget_rebuild (GladeWidget *gwidget)
 		(glade_project_has_object
 		 (gwidget->project, gwidget->object) ? TRUE : FALSE) : FALSE;
 
-	if (inproject)
+	if (project)
 	{
-		if (glade_project_is_selected (gwidget->project, 
-					       gwidget->object))
+		if (glade_project_is_selected (project, gwidget->object))
 		{
 			reselect = TRUE;
 			glade_project_selection_remove
-				(gwidget->project, gwidget->object, FALSE);
+				(project, gwidget->object, FALSE);
 		}
-		glade_project_remove_object (gwidget->project, gwidget->object);
+		glade_project_remove_object (project, gwidget->object);
 	}
 
 	/* parentless_widget and object properties that reffer to this widget 
@@ -2459,13 +2463,11 @@ glade_widget_rebuild (GladeWidget *gwidget)
 	/* If the widget was in a project (and maybe the selection), then
 	 * restore that stuff.
 	 */
-	if (inproject)
+	if (project)
 	{
-		glade_project_add_object (gwidget->project, NULL,
-					  gwidget->object);
+		glade_project_add_object (project, NULL, gwidget->object);
 		if (reselect)
-			glade_project_selection_add
-				(gwidget->project, gwidget->object, TRUE);
+			glade_project_selection_add (project, gwidget->object, TRUE);
 	}
 
  	/* We shouldnt show if its not already visible */
@@ -3774,13 +3776,13 @@ glade_widget_read (GladeProject *project,
 
 	if (glade_project_load_cancelled (project))
 		return NULL;
-
-	glade_widget_push_superuser ();
 	
 	if (!glade_xml_node_verify
 	    (node, GLADE_XML_TAG_WIDGET (glade_project_get_format (project))))
 		return NULL;
 
+	glade_widget_push_superuser ();
+
 	if ((klass = 
 	     glade_xml_get_property_string_required
 	     (node, GLADE_XML_TAG_CLASS, NULL)) != NULL)
@@ -3809,7 +3811,7 @@ glade_widget_read (GladeProject *project,
 							   "internal child %s of %s",
 							   internal,
 							   glade_widget_get_name (parent));
-						return FALSE;
+						goto out;
 					}
 
 					if (!(widget = 
@@ -3839,6 +3841,7 @@ glade_widget_read (GladeProject *project,
 		g_free (klass);
 	}
 
+ out:
 	glade_widget_pop_superuser ();
 
 	glade_project_push_progress (project);
diff --git a/gladeui/glade-widget.h b/gladeui/glade-widget.h
index 541e2f1..95d8601 100644
--- a/gladeui/glade-widget.h
+++ b/gladeui/glade-widget.h
@@ -48,11 +48,6 @@ struct _GladeWidget
 			  * Internal children cannot be deleted.
 			  */
 	
-	gboolean anarchist; /* Some composite widgets have internal children
-			     * that are not part of the same hierarchy; hence 'anarchists',
-			     * typicly a popup window or its child (we need to mark
-			     * them so we can avoid bookkeeping packing props on them etc.).
-			     */
 
 	GObject *object; /* A pointer to the object that was created.
 			  * if it is a GtkWidget; it is shown as a "view"
@@ -84,10 +79,6 @@ struct _GladeWidget
 	GHashTable *signals; /* A table with a GPtrArray of GladeSignals (signal handlers),
 			      * indexed by its name */
 
-	gboolean   visible; /* Local copy of widget visibility, we need to keep track of this
-			     * since the objects copy may be invalid due to a rebuild.
-			     */
-
 	GList     *prop_refs; /* List of properties in the project who's value are `this object'
 			       * (this is used to set/unset those properties when the object is
 			       * added/removed from the project).
@@ -112,7 +103,19 @@ struct _GladeWidget
 	GladeWidget       *construct_template;
 	GladeCreateReason  construct_reason;
 	gchar             *construct_internal;
-	gboolean           construct_exact;
+	guint              construct_exact : 1;
+
+
+	guint visible : 1; /* Local copy of widget visibility, we need to keep track of this
+			    * since the objects copy may be invalid due to a rebuild.
+			    */
+	guint anarchist : 1; /* Some composite widgets have internal children
+			      * that are not part of the same hierarchy; hence 'anarchists',
+			      * typicly a popup window or its child (we need to mark
+			      * them so we can avoid bookkeeping packing props on them etc.).
+			      */
+
+	guint in_project : 1; /* Whether the widget is currently actually in the project */
 };
 
 struct _GladeWidgetClass



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