[gtk/wip/kill-menu: 4/6] menutoolbutton: Add support for popovers



commit 03e30431a8af9a947a0c4ccab545f24da16bfe17
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Sep 14 17:14:55 2019 -0400

    menutoolbutton: Add support for popovers
    
    Just like the underlying menu button, support
    popovers too.

 gtk/gtkmenutoolbutton.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-
 gtk/gtkmenutoolbutton.h |  5 +++++
 2 files changed, 58 insertions(+), 1 deletion(-)
---
diff --git a/gtk/gtkmenutoolbutton.c b/gtk/gtkmenutoolbutton.c
index cfcb1127cf..19aba366ce 100644
--- a/gtk/gtkmenutoolbutton.c
+++ b/gtk/gtkmenutoolbutton.c
@@ -26,6 +26,7 @@
 #include "gtkmenubuttonprivate.h"
 #include "gtkbox.h"
 #include "gtkmenu.h"
+#include "gtkpopover.h"
 #include "gtkmain.h"
 #include "gtksizerequest.h"
 #include "gtkbuildable.h"
@@ -103,7 +104,8 @@ enum
 enum
 {
   PROP_0,
-  PROP_MENU
+  PROP_MENU,
+  PROP_POPOVER
 };
 
 static gint signals[LAST_SIGNAL];
@@ -210,6 +212,10 @@ gtk_menu_tool_button_set_property (GObject      *object,
       gtk_menu_tool_button_set_menu (button, g_value_get_object (value));
       break;
 
+    case PROP_POPOVER:
+      gtk_menu_tool_button_set_popover (button, g_value_get_object (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -230,6 +236,10 @@ gtk_menu_tool_button_get_property (GObject    *object,
       g_value_set_object (value, gtk_menu_button_get_popup (GTK_MENU_BUTTON (button->priv->arrow_button)));
       break;
 
+    case PROP_POPOVER:
+      g_value_set_object (value, gtk_menu_button_get_popover (GTK_MENU_BUTTON (button->priv->arrow_button)));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -279,6 +289,13 @@ gtk_menu_tool_button_class_init (GtkMenuToolButtonClass *klass)
                                                         P_("The dropdown menu"),
                                                         GTK_TYPE_MENU,
                                                         GTK_PARAM_READWRITE));
+  g_object_class_install_property (object_class,
+                                   PROP_POPOVER,
+                                   g_param_spec_object ("popover",
+                                                        P_("Popover"),
+                                                        P_("The dropdown popover"),
+                                                        GTK_TYPE_POPOVER,
+                                                        GTK_PARAM_READWRITE));
 }
 
 static void
@@ -324,6 +341,9 @@ gtk_menu_tool_button_buildable_add_child (GtkBuildable *buildable,
   if (type && strcmp (type, "menu") == 0)
     gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (buildable),
                                    GTK_WIDGET (child));
+  else if (type && strcmp (type, "popover") == 0)
+    gtk_menu_tool_button_set_popover (GTK_MENU_TOOL_BUTTON (buildable),
+                                      GTK_WIDGET (child));
   else
     parent_buildable_iface->add_child (buildable, builder, child, type);
 }
@@ -419,6 +439,38 @@ gtk_menu_tool_button_get_menu (GtkMenuToolButton *button)
   return GTK_WIDGET (ret);
 }
 
+void
+gtk_menu_tool_button_set_popover (GtkMenuToolButton *button,
+                                  GtkWidget         *popover)
+{
+  GtkMenuToolButtonPrivate *priv;
+
+  g_return_if_fail (GTK_IS_MENU_TOOL_BUTTON (button));
+  g_return_if_fail (GTK_IS_POPOVER (popover) || popover == NULL);
+
+  priv = button->priv;
+
+  gtk_menu_button_set_popover (GTK_MENU_BUTTON (priv->arrow_button), popover);
+  gtk_menu_button_set_create_popup_func (GTK_MENU_BUTTON (priv->arrow_button),
+                                         _show_menu_emit, NULL, NULL);
+
+  g_object_notify (G_OBJECT (button), "popover");
+}
+
+GtkWidget *
+gtk_menu_tool_button_get_popover (GtkMenuToolButton *button)
+{
+  GtkPopover *ret;
+
+  g_return_val_if_fail (GTK_IS_MENU_TOOL_BUTTON (button), NULL);
+
+  ret = gtk_menu_button_get_popover (GTK_MENU_BUTTON (button->priv->arrow_button));
+  if (!ret)
+    return NULL;
+
+  return GTK_WIDGET (ret);
+}
+
 /**
  * gtk_menu_tool_button_set_arrow_tooltip_text:
  * @button: a #GtkMenuToolButton
diff --git a/gtk/gtkmenutoolbutton.h b/gtk/gtkmenutoolbutton.h
index 6b88761ca2..3bfdc0ada1 100644
--- a/gtk/gtkmenutoolbutton.h
+++ b/gtk/gtkmenutoolbutton.h
@@ -46,6 +46,11 @@ void          gtk_menu_tool_button_set_menu       (GtkMenuToolButton *button,
 GDK_AVAILABLE_IN_ALL
 GtkWidget    *gtk_menu_tool_button_get_menu       (GtkMenuToolButton *button);
 GDK_AVAILABLE_IN_ALL
+void          gtk_menu_tool_button_set_popover    (GtkMenuToolButton *button,
+                                                   GtkWidget         *popover);
+GDK_AVAILABLE_IN_ALL
+GtkWidget    *gtk_menu_tool_button_get_popover    (GtkMenuToolButton *button);
+GDK_AVAILABLE_IN_ALL
 void          gtk_menu_tool_button_set_arrow_tooltip_text   (GtkMenuToolButton *button,
                                                             const gchar       *text);
 GDK_AVAILABLE_IN_ALL


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]