diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-11-11 11:58:43 +0100 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-11-11 12:42:06 +0100 |
commit | bfa0509f08b29bb833282b47e907686a8a44ef63 (patch) | |
tree | e67826aaa6902226d316ae19b9e9d55bef2c1a0c /gtk/gtkpopovermenu.c | |
parent | 07d17c5bc11126bd49a77608e55cde901c903799 (diff) | |
download | gtk+-bfa0509f08b29bb833282b47e907686a8a44ef63.tar.gz |
Privatize popover menu pieces
Don't allow manual creation of popover menus
anymore. This lets us also make GtkModelButton
private
Diffstat (limited to 'gtk/gtkpopovermenu.c')
-rw-r--r-- | gtk/gtkpopovermenu.c | 127 |
1 files changed, 67 insertions, 60 deletions
diff --git a/gtk/gtkpopovermenu.c b/gtk/gtkpopovermenu.c index 7b9d1d8733..369c9d6360 100644 --- a/gtk/gtkpopovermenu.c +++ b/gtk/gtkpopovermenu.c @@ -33,7 +33,7 @@ #include "gtkmain.h" #include "gtktypebuiltins.h" #include "gtkbindings.h" -#include "gtkmodelbutton.h" +#include "gtkmodelbuttonprivate.h" #include "gtkpopovermenubar.h" @@ -129,6 +129,8 @@ struct _GtkPopoverMenu GtkWidget *active_item; GtkWidget *open_submenu; GtkWidget *parent_menu; + GMenuModel *model; + GtkPopoverMenuFlags flags; }; struct _GtkPopoverMenuClass @@ -137,7 +139,8 @@ struct _GtkPopoverMenuClass }; enum { - PROP_VISIBLE_SUBMENU = 1 + PROP_VISIBLE_SUBMENU = 1, + PROP_MENU_MODEL }; G_DEFINE_TYPE (GtkPopoverMenu, gtk_popover_menu, GTK_TYPE_POPOVER) @@ -277,6 +280,16 @@ gtk_popover_menu_init (GtkPopoverMenu *popover) } static void +gtk_popover_menu_dispose (GObject *object) +{ + GtkPopoverMenu *popover = GTK_POPOVER_MENU (object); + + g_clear_object (&popover->model); + + G_OBJECT_CLASS (gtk_popover_menu_parent_class)->dispose (object); +} + +static void gtk_popover_menu_map (GtkWidget *widget) { gtk_popover_menu_open_submenu (GTK_POPOVER_MENU (widget), "main"); @@ -291,47 +304,6 @@ gtk_popover_menu_unmap (GtkWidget *widget) } static void -gtk_popover_menu_add (GtkContainer *container, - GtkWidget *child) -{ - GtkWidget *stack; - - stack = gtk_bin_get_child (GTK_BIN (container)); - - if (stack == NULL) - { - GTK_CONTAINER_CLASS (gtk_popover_menu_parent_class)->add (container, child); - } - else - { - const char *name; - - if (gtk_widget_get_name (child)) - name = gtk_widget_get_name (child); - else if (gtk_stack_get_child_by_name (GTK_STACK (stack), "main")) - name = "submenu"; - else - name = "main"; - - gtk_popover_menu_add_submenu (GTK_POPOVER_MENU (container), child, name); - } -} - -static void -gtk_popover_menu_remove (GtkContainer *container, - GtkWidget *child) -{ - GtkWidget *stack; - - stack = gtk_bin_get_child (GTK_BIN (container)); - - if (child == stack) - GTK_CONTAINER_CLASS (gtk_popover_menu_parent_class)->remove (container, child); - else - gtk_container_remove (GTK_CONTAINER (stack), child); -} - -static void gtk_popover_menu_get_property (GObject *object, guint property_id, GValue *value, @@ -347,6 +319,10 @@ gtk_popover_menu_get_property (GObject *object, g_value_set_string (value, gtk_stack_get_visible_child_name (GTK_STACK (stack))); break; + case PROP_MENU_MODEL: + g_value_set_object (value, gtk_popover_menu_get_menu_model (GTK_POPOVER_MENU (object))); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -369,6 +345,10 @@ gtk_popover_menu_set_property (GObject *object, gtk_stack_set_visible_child_name (GTK_STACK (stack), g_value_get_string (value)); break; + case PROP_MENU_MODEL: + gtk_popover_menu_set_menu_model (GTK_POPOVER_MENU (object), g_value_get_object (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -470,11 +450,11 @@ add_arrow_bindings (GtkBindingSet *binding_set, static void gtk_popover_menu_class_init (GtkPopoverMenuClass *klass) { - GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkBindingSet *binding_set; + object_class->dispose = gtk_popover_menu_dispose; object_class->set_property = gtk_popover_menu_set_property; object_class->get_property = gtk_popover_menu_get_property; @@ -482,9 +462,6 @@ gtk_popover_menu_class_init (GtkPopoverMenuClass *klass) widget_class->unmap = gtk_popover_menu_unmap; widget_class->focus = gtk_popover_menu_focus; - container_class->add = gtk_popover_menu_add; - container_class->remove = gtk_popover_menu_remove; - g_object_class_install_property (object_class, PROP_VISIBLE_SUBMENU, g_param_spec_string ("visible-submenu", @@ -493,6 +470,14 @@ gtk_popover_menu_class_init (GtkPopoverMenuClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MENU_MODEL, + g_param_spec_object ("menu-model", + P_("Menu model"), + P_("The model from which the menu is made."), + G_TYPE_MENU_MODEL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + binding_set = gtk_binding_set_by_class (klass); add_arrow_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP); @@ -567,14 +552,6 @@ gtk_popover_menu_open_submenu (GtkPopoverMenu *popover, gtk_stack_set_visible_child_name (GTK_STACK (stack), name); } -/** - * gtk_popover_menu_add_submenu: - * @popover: a #GtkPopoverMenu - * @submenu: a widget to add as submenu - * @name: the name for the submenu - * - * Adds a submenu to the popover menu. - */ void gtk_popover_menu_add_submenu (GtkPopoverMenu *popover, GtkWidget *submenu, @@ -583,14 +560,13 @@ gtk_popover_menu_add_submenu (GtkPopoverMenu *popover, GtkWidget *stack; stack = gtk_bin_get_child (GTK_BIN (popover)); - gtk_stack_add_named (GTK_STACK (stack), submenu, name); } /** * gtk_popover_menu_new_from_model: * @relative_to: (allow-none): #GtkWidget the popover is related to - * @model: a #GMenuModel + * @model: (allow-none): a #GMenuModel, or %NULL * * Creates a #GtkPopoverMenu and populates it according to * @model. The popover is pointed to the @relative_to widget. @@ -638,7 +614,7 @@ gtk_popover_menu_new_from_model (GtkWidget *relative_to, * #GTK_POPOVER_MENU_NESTED, which makes GTK create traditional, * nested submenus instead of the default sliding submenus. * - * Returns: the new #GtkPopoverMenu + * Returns: (transfer full): the new #GtkPopoverMenu */ GtkWidget * gtk_popover_menu_new_from_model_full (GtkWidget *relative_to, @@ -648,11 +624,42 @@ gtk_popover_menu_new_from_model_full (GtkWidget *relative_to, GtkWidget *popover; g_return_val_if_fail (relative_to == NULL || GTK_IS_WIDGET (relative_to), NULL); - g_return_val_if_fail (G_IS_MENU_MODEL (model), NULL); + g_return_val_if_fail (model == NULL || G_IS_MENU_MODEL (model), NULL); popover = gtk_popover_menu_new (relative_to); - gtk_menu_section_box_new_toplevel (GTK_POPOVER_MENU (popover), model, flags); + GTK_POPOVER_MENU (popover)->flags = flags; + gtk_popover_menu_set_menu_model (GTK_POPOVER_MENU (popover), model); return popover; } +void +gtk_popover_menu_set_menu_model (GtkPopoverMenu *popover, + GMenuModel *model) +{ + g_return_if_fail (GTK_IS_POPOVER_MENU (popover)); + g_return_if_fail (model == NULL || G_IS_MENU_MODEL (model)); + + if (g_set_object (&popover->model, model)) + { + GtkWidget *stack; + GtkWidget *child; + + stack = gtk_bin_get_child (GTK_BIN (popover)); + while ((child = gtk_widget_get_first_child (stack))) + gtk_widget_destroy (child); + + if (model) + gtk_menu_section_box_new_toplevel (popover, model, popover->flags); + + g_object_notify (G_OBJECT (popover), "menu-model"); + } +} + +GMenuModel * +gtk_popover_menu_get_menu_model (GtkPopoverMenu *popover) +{ + g_return_val_if_fail (GTK_IS_POPOVER_MENU (popover), NULL); + + return popover->model; +} |