#include "gtkscrolledwindow.h"
#include "gtkviewport.h"
-
/**
* GtkPopoverMenu:
*
* `GtkPopoverMenu` treats its children like menus and allows switching
* between them. It can open submenus as traditional, nested submenus,
* or in a more touch-friendly sliding fashion.
+ * The property [property@Gtk.PopoverMenu:flags] controls this appearance.
*
* `GtkPopoverMenu` is meant to be used primarily with menu models,
* using [ctor@Gtk.PopoverMenu.new_from_model]. If you need to put
enum {
PROP_VISIBLE_SUBMENU = 1,
- PROP_MENU_MODEL
+ PROP_MENU_MODEL,
+ PROP_FLAGS
};
static void gtk_popover_menu_buildable_iface_init (GtkBuildableIface *iface);
g_value_set_object (value, gtk_popover_menu_get_menu_model (menu));
break;
+ case PROP_FLAGS:
+ g_value_set_flags (value, gtk_popover_menu_get_flags (menu));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
gtk_popover_menu_set_menu_model (menu, g_value_get_object (value));
break;
+ case PROP_FLAGS:
+ gtk_popover_menu_set_flags (menu, g_value_get_flags (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
return FALSE;
}
-
static void
add_tab_bindings (GtkWidgetClass *widget_class,
GdkModifierType modifiers,
G_TYPE_MENU_MODEL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GtkPopoverMenu:flags: (attributes org.gtk.Property.get=gtk_popover_menu_get_flags org.gtk.Property.set=gtk_popover_menu_set_flags)
+ *
+ * The flags that @popover uses to create/display a menu from its model.
+ *
+ * If a model is set and the flags change, contents are rebuilt, so if setting
+ * properties individually, set flags before model to avoid a redundant rebuild.
+ *
+ * Since: 4.14
+ */
+ g_object_class_install_property (object_class,
+ PROP_FLAGS,
+ g_param_spec_flags ("flags", NULL, NULL,
+ GTK_TYPE_POPOVER_MENU_FLAGS, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
+ | G_PARAM_EXPLICIT_NOTIFY));
+
add_arrow_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP);
add_arrow_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN);
add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
iface->add_child = gtk_popover_menu_buildable_add_child;
}
+static void
+gtk_popover_menu_rebuild_contents (GtkPopoverMenu *popover)
+{
+ GtkWidget *stack;
+ GtkWidget *child;
+
+ stack = gtk_popover_menu_get_stack (popover);
+ while ((child = gtk_widget_get_first_child (stack)))
+ gtk_stack_remove (GTK_STACK (stack), child);
+
+ if (popover->model)
+ gtk_menu_section_box_new_toplevel (popover, popover->model, popover->flags);
+}
+
/**
* gtk_popover_menu_new:
*
g_return_val_if_fail (model == NULL || G_IS_MENU_MODEL (model), NULL);
popover = gtk_popover_menu_new ();
- GTK_POPOVER_MENU (popover)->flags = flags;
+ gtk_popover_menu_set_flags (GTK_POPOVER_MENU (popover), flags);
gtk_popover_menu_set_menu_model (GTK_POPOVER_MENU (popover), model);
return popover;
if (g_set_object (&popover->model, model))
{
- GtkWidget *stack;
- GtkWidget *child;
+ gtk_popover_menu_rebuild_contents (popover);
+ g_object_notify (G_OBJECT (popover), "menu-model");
+ }
+}
- stack = gtk_popover_menu_get_stack (popover);
- while ((child = gtk_widget_get_first_child (stack)))
- gtk_stack_remove (GTK_STACK (stack), child);
+/**
+ * gtk_popover_menu_set_flags: (attributes org.gtk.Method.set_property=flags)
+ * @popover: a `GtkPopoverMenu`
+ * @flags: a set of `GtkPopoverMenuFlags`
+ *
+ * Sets the flags that @popover uses to create/display a menu from its model.
+ *
+ * If a model is set and the flags change, contents are rebuilt, so if setting
+ * properties individually, set flags before model to avoid a redundant rebuild.
+ *
+ * Since: 4.14
+ */
+void
+gtk_popover_menu_set_flags (GtkPopoverMenu *popover,
+ GtkPopoverMenuFlags flags)
+{
+ g_return_if_fail (GTK_IS_POPOVER_MENU (popover));
- if (model)
- gtk_menu_section_box_new_toplevel (popover, model, popover->flags);
+ if (popover->flags == flags)
+ return;
- g_object_notify (G_OBJECT (popover), "menu-model");
- }
+ popover->flags = flags;
+
+ /* This shouldn’t happen IRL, but notify test unsets :child, so dodge error */
+ if (gtk_popover_get_child (GTK_POPOVER (popover)) != NULL)
+ gtk_popover_menu_rebuild_contents (popover);
+
+ g_object_notify (G_OBJECT (popover), "flags");
}
/**
return popover->model;
}
+/**
+ * gtk_popover_menu_get_flags: (attributes org.gtk.Method.get_property=flags)
+ * @popover: a `GtkPopoverMenu`
+ *
+ * Returns the flags that @popover uses to create/display a menu from its model.
+ *
+ * Returns: the `GtkPopoverMenuFlags`
+ *
+ * Since: 4.14
+ */
+GtkPopoverMenuFlags
+gtk_popover_menu_get_flags (GtkPopoverMenu *popover)
+{
+ g_return_val_if_fail (GTK_IS_POPOVER_MENU (popover), 0);
+
+ return popover->flags;
+}
+
/**
* gtk_popover_menu_add_child:
* @popover: a `GtkPopoverMenu`