summaryrefslogtreecommitdiff
path: root/gtk/gtkpopovermenu.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-10-26 13:21:28 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-10-26 22:42:28 -0400
commitaf6c3017fb0010dcba884da9bef686a92ae7215f (patch)
tree5512b1353306f5fbc301565024e53190fdcbcbe0 /gtk/gtkpopovermenu.c
parent8157abe591059116cbea1a8ad7007fdd061ab0ba (diff)
downloadgtk+-af6c3017fb0010dcba884da9bef686a92ae7215f.tar.gz
popovermenu: Allow adding custom items in ui files
Support <child type="ID"> to fill custom child slots in both GtkPopoverMenus and GtkPopoverMenuBars that are created in ui files.
Diffstat (limited to 'gtk/gtkpopovermenu.c')
-rw-r--r--gtk/gtkpopovermenu.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/gtk/gtkpopovermenu.c b/gtk/gtkpopovermenu.c
index 4c33b0011d..751d14c176 100644
--- a/gtk/gtkpopovermenu.c
+++ b/gtk/gtkpopovermenu.c
@@ -35,6 +35,7 @@
#include "gtkpopovermenubar.h"
#include "gtkshortcutmanager.h"
#include "gtkshortcutcontroller.h"
+#include "gtkbuildable.h"
/**
@@ -99,7 +100,8 @@
* Possible values include "action-disabled", "action-missing", "macos-menubar".
* This is mainly useful for exported menus, see gtk_application_set_menubar().
* - "custom": a string used to match against the ID of a custom child added
- * with gtk_popover_menu_add_child() or gtk_popover_menu_bar_add_child().
+ * with gtk_popover_menu_add_child(), gtk_popover_menu_bar_add_child(), or
+ * in the ui file with `<child type="ID">`.
*
* The following attributes are used when constructing sections:
* - "label": a user-visible string to use as section heading
@@ -155,7 +157,11 @@ enum {
PROP_MENU_MODEL
};
-G_DEFINE_TYPE (GtkPopoverMenu, gtk_popover_menu, GTK_TYPE_POPOVER)
+static void gtk_popover_menu_buildable_iface_init (GtkBuildableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GtkPopoverMenu, gtk_popover_menu, GTK_TYPE_POPOVER,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+ gtk_popover_menu_buildable_iface_init))
GtkWidget *
gtk_popover_menu_get_parent_menu (GtkPopoverMenu *menu)
@@ -568,6 +574,31 @@ gtk_popover_menu_class_init (GtkPopoverMenuClass *klass)
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_MENU);
}
+static GtkBuildableIface *parent_buildable_iface;
+
+static void
+gtk_popover_menu_buildable_add_child (GtkBuildable *buildable,
+ GtkBuilder *builder,
+ GObject *child,
+ const char *type)
+{
+ if (GTK_IS_WIDGET (child))
+ {
+ if (!gtk_popover_menu_add_child (GTK_POPOVER_MENU (buildable), GTK_WIDGET (child), type))
+ g_warning ("No such custom attribute: %s", type);
+ }
+ else
+ parent_buildable_iface->add_child (buildable, builder, child, type);
+}
+
+static void
+gtk_popover_menu_buildable_iface_init (GtkBuildableIface *iface)
+{
+ parent_buildable_iface = g_type_interface_peek_parent (iface);
+
+ iface->add_child = gtk_popover_menu_buildable_add_child;
+}
+
/**
* gtk_popover_menu_new:
*