#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_FLAGS
+ PROP_MENU_MODEL
};
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_set_flags (GTK_POPOVER_MENU (popover), flags);
+ GTK_POPOVER_MENU (popover)->flags = flags;
gtk_popover_menu_set_menu_model (GTK_POPOVER_MENU (popover), model);
return popover;
if (g_set_object (&popover->model, model))
{
- gtk_popover_menu_rebuild_contents (popover);
- g_object_notify (G_OBJECT (popover), "menu-model");
- }
-}
+ GtkWidget *stack;
+ GtkWidget *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 (popover->flags == flags)
- return;
-
- popover->flags = flags;
+ stack = gtk_popover_menu_get_stack (popover);
+ while ((child = gtk_widget_get_first_child (stack)))
+ gtk_stack_remove (GTK_STACK (stack), child);
- /* 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);
+ if (model)
+ gtk_menu_section_box_new_toplevel (popover, model, popover->flags);
- g_object_notify (G_OBJECT (popover), "flags");
+ g_object_notify (G_OBJECT (popover), "menu-model");
+ }
}
/**
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`