[gtk/matthiasc/for-master] popover: Fix submenu navigation
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master] popover: Fix submenu navigation
- Date: Tue, 17 Nov 2020 02:35:54 +0000 (UTC)
commit c2ae73f24769109e0af0553cc9e3321304a037d1
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Nov 16 21:27:15 2020 -0500
popover: Fix submenu navigation
In commit 024d832d943b2abf4f0d, we introduced a
cascade-popdown property that makes closing a submenu
propagate up and close its parent menus. This is the
behavior we want when a menuitem in the submen is
activated.
What we overlooked is that we still need to be able to
close a submenu during navigation, before opening another
one. And in this case, propagating the closing is breaking
things. Fix this by adding a private close_submenu api
to GtkPopoverMenu that avoids the propagation.
Fixes: #3301
gtk/gtkmodelbutton.c | 22 +---------------------
gtk/gtkpopovermenu.c | 14 ++++++++++++++
gtk/gtkpopovermenuprivate.h | 2 ++
3 files changed, 17 insertions(+), 21 deletions(-)
---
diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c
index 501dc5e087..3d2e2519c4 100644
--- a/gtk/gtkmodelbutton.c
+++ b/gtk/gtkmodelbutton.c
@@ -1326,26 +1326,6 @@ gtk_model_button_class_init (GtkModelButtonClass *class)
g_object_unref (action);
}
-static void
-close_submenus (GtkPopover *popover)
-{
- GtkPopoverMenu *menu;
-
- if (GTK_IS_POPOVER_MENU (popover))
- {
- GtkWidget *submenu;
-
- menu = GTK_POPOVER_MENU (popover);
- submenu = gtk_popover_menu_get_open_submenu (menu);
- if (submenu)
- {
- close_submenus (GTK_POPOVER (submenu));
- gtk_popover_popdown (GTK_POPOVER (submenu));
- gtk_popover_menu_set_open_submenu (menu, NULL);
- }
- }
-}
-
static gboolean
open_submenu (gpointer data)
{
@@ -1363,7 +1343,7 @@ open_submenu (gpointer data)
GtkWidget *submenu = button->popover;
if (gtk_popover_menu_get_open_submenu (GTK_POPOVER_MENU (popover)) != submenu)
- close_submenus (popover);
+ gtk_popover_menu_close_submenus (GTK_POPOVER_MENU (popover));
gtk_popover_popup (GTK_POPOVER (submenu));
gtk_popover_menu_set_open_submenu (GTK_POPOVER_MENU (popover), submenu);
diff --git a/gtk/gtkpopovermenu.c b/gtk/gtkpopovermenu.c
index c3f39ed0ce..d6e5f91887 100644
--- a/gtk/gtkpopovermenu.c
+++ b/gtk/gtkpopovermenu.c
@@ -189,6 +189,20 @@ gtk_popover_menu_set_open_submenu (GtkPopoverMenu *menu,
menu->open_submenu = submenu;
}
+void
+gtk_popover_menu_close_submenus (GtkPopoverMenu *menu)
+{
+ GtkWidget *submenu;
+
+ submenu = menu->open_submenu;
+ if (submenu)
+ {
+ gtk_popover_menu_close_submenus (GTK_POPOVER_MENU (submenu));
+ gtk_widget_hide (submenu);
+ gtk_popover_menu_set_open_submenu (menu, NULL);
+ }
+}
+
GtkWidget *
gtk_popover_menu_get_active_item (GtkPopoverMenu *menu)
{
diff --git a/gtk/gtkpopovermenuprivate.h b/gtk/gtkpopovermenuprivate.h
index 6c3da47950..4e69627ad4 100644
--- a/gtk/gtkpopovermenuprivate.h
+++ b/gtk/gtkpopovermenuprivate.h
@@ -28,6 +28,8 @@ void gtk_popover_menu_set_active_item (GtkPopoverMenu *menu,
GtkWidget *gtk_popover_menu_get_open_submenu (GtkPopoverMenu *menu);
void gtk_popover_menu_set_open_submenu (GtkPopoverMenu *menu,
GtkWidget *submenu);
+void gtk_popover_menu_close_submenus (GtkPopoverMenu *menu);
+
GtkWidget *gtk_popover_menu_get_parent_menu (GtkPopoverMenu *menu);
void gtk_popover_menu_set_parent_menu (GtkPopoverMenu *menu,
GtkWidget *parent);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]