summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2014-11-19 07:33:33 +0100
committerMatthias Clasen <mclasen@redhat.com>2015-12-10 16:14:25 -0500
commitf0a5bed8cd2d9fdb5ea97f3139baf4199c2f79c7 (patch)
treecc20d0f4288461d768fc3af28ecbbcd8ae999333
parent63de4bc14bf2a57d26311f081b0e130fc16d9633 (diff)
downloadglade-f0a5bed8cd2d9fdb5ea97f3139baf4199c2f79c7.tar.gz
Make submenu switching work from the tree
Ensure that the submenu containing the currently selected widget is visible.
-rw-r--r--plugins/gtk+/glade-gtk-popover-menu.c74
1 files changed, 66 insertions, 8 deletions
diff --git a/plugins/gtk+/glade-gtk-popover-menu.c b/plugins/gtk+/glade-gtk-popover-menu.c
index b3bbcc63..dad55f42 100644
--- a/plugins/gtk+/glade-gtk-popover-menu.c
+++ b/plugins/gtk+/glade-gtk-popover-menu.c
@@ -56,6 +56,63 @@ glade_gtk_popover_menu_parse_finished (GladeProject * project,
glade_widget_property_set (gbox, "submenus", submenus);
}
+static void
+glade_gtk_popover_menu_selection_changed (GladeProject * project,
+ GladeWidget * gwidget)
+{
+ GList *list;
+ GtkWidget *page, *sel_widget;
+ GtkWidget *popover = GTK_WIDGET (glade_widget_get_object (gwidget));
+
+ if ((list = glade_project_selection_get (project)) != NULL &&
+ g_list_length (list) == 1)
+ {
+ sel_widget = list->data;
+
+ if (GTK_IS_WIDGET (sel_widget) &&
+ gtk_widget_is_ancestor (sel_widget, popover))
+ {
+ GList *children, *l;
+
+ children = gtk_container_get_children (GTK_CONTAINER (popover));
+ for (l = children; l; l = l->next)
+ {
+ page = l->data;
+ if (sel_widget == page ||
+ gtk_widget_is_ancestor (sel_widget, page))
+ {
+ gint position;
+ glade_widget_property_get (glade_widget_get_from_gobject (page), "position", &position);
+ glade_widget_property_set (glade_widget_get_from_gobject (popover), "current", position);
+ break;
+ }
+ }
+ g_list_free (children);
+ }
+ }
+}
+
+static void
+glade_gtk_popover_menu_project_changed (GladeWidget * gwidget,
+ GParamSpec * pspec,
+ gpointer userdata)
+{
+ GladeProject * project = glade_widget_get_project (gwidget);
+ GladeProject * old_project = g_object_get_data (G_OBJECT (gwidget), "popover-menu-project-ptr");
+
+ if (old_project)
+ g_signal_handlers_disconnect_by_func (G_OBJECT (old_project),
+ G_CALLBACK (glade_gtk_popover_menu_selection_changed),
+ gwidget);
+
+ if (project)
+ g_signal_connect (G_OBJECT (project), "selection-changed",
+ G_CALLBACK (glade_gtk_popover_menu_selection_changed),
+ gwidget);
+
+ g_object_set_data (G_OBJECT (gwidget), "popover-menu-project-ptr", project);
+}
+
void
glade_gtk_popover_menu_post_create (GladeWidgetAdaptor *adaptor,
GObject *container,
@@ -65,15 +122,16 @@ glade_gtk_popover_menu_post_create (GladeWidgetAdaptor *adaptor,
GladeProject *project = glade_widget_get_project (parent);
if (reason == GLADE_CREATE_LOAD)
- {
- g_signal_connect (project, "parse-finished",
- G_CALLBACK (glade_gtk_popover_menu_parse_finished),
- container);
- }
+ g_signal_connect (project, "parse-finished",
+ G_CALLBACK (glade_gtk_popover_menu_parse_finished),
+ container);
else if (reason == GLADE_CREATE_USER)
- {
- gtk_container_add (GTK_CONTAINER (container), glade_placeholder_new ());
- }
+ gtk_container_add (GTK_CONTAINER (container), glade_placeholder_new ());
+
+ g_signal_connect (G_OBJECT (parent), "notify::project",
+ G_CALLBACK (glade_gtk_popover_menu_project_changed), NULL);
+
+ glade_gtk_popover_menu_project_changed (parent, NULL, NULL);
}
void