summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.van.berkom@gmail.com>2011-04-04 18:28:12 +0900
committerTristan Van Berkom <tristan.van.berkom@gmail.com>2011-04-04 18:28:12 +0900
commit9d0178abd36ba77d0e38d02e80b8b34a542a7ba3 (patch)
tree7401a7dc233252d92d20c227d8b15fdfc1b4ac9a
parentc2721dad587bff8f4e46b1fbfad697d0a9c8e7a7 (diff)
downloadglade-9d0178abd36ba77d0e38d02e80b8b34a542a7ba3.tar.gz
* gladeui/glade-project.[ch], gladeui/glade-widget.c: Backported glade_project_check_reordered()
-rw-r--r--ChangeLog2
-rw-r--r--gladeui/glade-project.c110
-rw-r--r--gladeui/glade-project.h4
-rw-r--r--gladeui/glade-widget.c20
-rw-r--r--plugins/gtk+/glade-gtk.c1
5 files changed, 125 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 20416667..32439c77 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 a48d9c15..e894664b 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 ab6b7444..5071647c 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 46b1ad35..118dc55d 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 4a3c893a..0ef33ce4 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);