diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2011-04-04 18:28:12 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2011-04-04 18:28:12 +0900 |
commit | 9d0178abd36ba77d0e38d02e80b8b34a542a7ba3 (patch) | |
tree | 7401a7dc233252d92d20c227d8b15fdfc1b4ac9a | |
parent | c2721dad587bff8f4e46b1fbfad697d0a9c8e7a7 (diff) | |
download | glade-9d0178abd36ba77d0e38d02e80b8b34a542a7ba3.tar.gz |
* gladeui/glade-project.[ch], gladeui/glade-widget.c: Backported glade_project_check_reordered()
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | gladeui/glade-project.c | 110 | ||||
-rw-r--r-- | gladeui/glade-project.h | 4 | ||||
-rw-r--r-- | gladeui/glade-widget.c | 20 | ||||
-rw-r--r-- | plugins/gtk+/glade-gtk.c | 1 |
5 files changed, 125 insertions, 12 deletions
@@ -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); |