summaryrefslogtreecommitdiff
path: root/gtk/gtkpopovermenu.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-11-11 11:58:43 +0100
committerMatthias Clasen <mclasen@redhat.com>2019-11-11 12:42:06 +0100
commitbfa0509f08b29bb833282b47e907686a8a44ef63 (patch)
treee67826aaa6902226d316ae19b9e9d55bef2c1a0c /gtk/gtkpopovermenu.c
parent07d17c5bc11126bd49a77608e55cde901c903799 (diff)
downloadgtk+-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.c127
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;
+}