[gtk/arnaudb/menubutton-active] Add MenuButton active property.




commit a2993ff13037a40055c140d879aa703b1ee0bb6a
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Fri Sep 25 10:31:18 2020 +0200

    Add MenuButton active property.

 gtk/gtkmenubutton.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 gtk/gtkmenubutton.h |  6 +++++
 2 files changed, 81 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkmenubutton.c b/gtk/gtkmenubutton.c
index 54fca43b33..e2caccafa5 100644
--- a/gtk/gtkmenubutton.c
+++ b/gtk/gtkmenubutton.c
@@ -27,6 +27,11 @@
  * This popup can be provided either as a #GtkPopover or as an abstract
  * #GMenuModel.
  *
+ * A #GtkMenuButton can be toggled using gtk_menu_button_popup() and
+ * gtk_menu_button_popdown(). Alternatively, its state can be set
+ * specifically using gtk_menu_button_set_active(), and retrieved using
+ * gtk_menu_button_get_active().
+ *
  * The #GtkMenuButton widget can show either an icon (set with the
  * #GtkMenuButton:icon-name property) or a label (set with the
  * #GtkMenuButton:label property). If neither is explicitly set,
@@ -162,6 +167,7 @@ enum
   PROP_LABEL,
   PROP_USE_UNDERLINE,
   PROP_HAS_FRAME,
+  PROP_ACTIVE,
   LAST_PROP
 };
 
@@ -202,6 +208,9 @@ gtk_menu_button_set_property (GObject      *object,
       case PROP_HAS_FRAME:
         gtk_menu_button_set_has_frame (self, g_value_get_boolean (value));
         break;
+      case PROP_ACTIVE:
+        gtk_menu_button_set_active (self, g_value_get_boolean (value));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     }
@@ -238,6 +247,9 @@ gtk_menu_button_get_property (GObject    *object,
       case PROP_HAS_FRAME:
         g_value_set_boolean (value, gtk_menu_button_get_has_frame (GTK_MENU_BUTTON (object)));
         break;
+      case PROP_ACTIVE:
+        g_value_set_boolean (value, gtk_menu_button_get_active (GTK_MENU_BUTTON (object)));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     }
@@ -257,10 +269,8 @@ gtk_menu_button_state_flags_changed (GtkWidget    *widget,
 }
 
 static void
-gtk_menu_button_toggled (GtkMenuButton *self)
+gtk_menu_button_set_popover_state (GtkMenuButton *self, gboolean active)
 {
-  const gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->button));
-
   /* Might set a new menu/popover */
   if (active && self->create_popup_func)
     {
@@ -276,6 +286,17 @@ gtk_menu_button_toggled (GtkMenuButton *self)
     }
 }
 
+static void
+gtk_menu_button_toggled (GtkMenuButton *self)
+{
+  const gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->button));
+
+  gtk_menu_button_set_popover_state (self, active);
+
+  if (active != gtk_menu_button_get_active (self))
+    gtk_menu_button_set_active (self, active);
+}
+
 static void
 gtk_menu_button_measure (GtkWidget      *widget,
                          GtkOrientation  orientation,
@@ -415,6 +436,13 @@ gtk_menu_button_class_init (GtkMenuButtonClass *klass)
                           TRUE,
                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
+  menu_button_props[PROP_ACTIVE] =
+    g_param_spec_boolean ("active",
+                          P_("Active"),
+                          P_("The button state"),
+                          FALSE,
+                          GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (gobject_class, LAST_PROP, menu_button_props);
 
   gtk_widget_class_set_css_name (widget_class, I_("menubutton"));
@@ -471,6 +499,7 @@ gtk_menu_button_init (GtkMenuButton *self)
   self->button = gtk_toggle_button_new ();
   gtk_widget_set_parent (self->button, GTK_WIDGET (self));
   g_signal_connect_swapped (self->button, "toggled", G_CALLBACK (gtk_menu_button_toggled), self);
+  g_object_bind_property (self->button, "active", GTK_WIDGET (self), "active", G_BINDING_SYNC_CREATE);
   add_arrow (self);
 
   gtk_widget_set_sensitive (self->button, FALSE);
@@ -888,6 +917,47 @@ gtk_menu_button_get_has_frame (GtkMenuButton *menu_button)
   return gtk_button_get_has_frame (GTK_BUTTON (menu_button->button));
 }
 
+/**
+ * gtk_menu_button_set_active:
+ * @menu_button: a #GtkMenuButton
+ * @active: the button state
+ *
+ * Sets the state of the button.
+ */
+void
+gtk_menu_button_set_active (GtkMenuButton *menu_button,
+                            gboolean       active)
+{
+  g_return_if_fail (GTK_IS_MENU_BUTTON (menu_button));
+
+/*  if (gtk_menu_button_get_active (GTK_MENU_BUTTON (menu_button)) == gtk_toggle_button_get_active 
(GTK_TOGGLE_BUTTON (menu_button->button)))*/
+/*    return;*/
+
+/*  if (active != gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (menu_button->button)))*/
+
+  gtk_menu_button_set_popover_state (menu_button, active);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (menu_button->button), active);
+
+/*  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (menu_button->button), active);*/
+  g_object_notify_by_pspec (G_OBJECT (menu_button), menu_button_props[PROP_ACTIVE]);
+}
+
+/**
+ * gtk_menu_button_get_active:
+ * @menu_button: a #GtkMenuButton
+ *
+ * Returns the state of the button.
+ *
+ * Returns: %TRUE if the button is active
+ */
+gboolean
+gtk_menu_button_get_active (GtkMenuButton *menu_button)
+{
+  g_return_val_if_fail (GTK_IS_MENU_BUTTON (menu_button), TRUE);
+
+  return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (menu_button->button));
+}
+
 /**
  * gtk_menu_button_popup:
  * @menu_button: a #GtkMenuButton
@@ -900,6 +970,7 @@ gtk_menu_button_popup (GtkMenuButton *menu_button)
   g_return_if_fail (GTK_IS_MENU_BUTTON (menu_button));
 
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (menu_button->button), TRUE);
+/*  gtk_menu_button_set_active (GTK_MENU_BUTTON (menu_button), TRUE);*/
 }
 
 /**
@@ -914,6 +985,7 @@ gtk_menu_button_popdown (GtkMenuButton *menu_button)
   g_return_if_fail (GTK_IS_MENU_BUTTON (menu_button));
 
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (menu_button->button), FALSE);
+/*  gtk_menu_button_set_active (GTK_MENU_BUTTON (menu_button), FALSE);*/
 }
 
 /**
diff --git a/gtk/gtkmenubutton.h b/gtk/gtkmenubutton.h
index 6f67ad393a..c374ac93e2 100644
--- a/gtk/gtkmenubutton.h
+++ b/gtk/gtkmenubutton.h
@@ -94,6 +94,12 @@ void           gtk_menu_button_set_has_frame (GtkMenuButton  *menu_button,
 GDK_AVAILABLE_IN_ALL
 gboolean       gtk_menu_button_get_has_frame (GtkMenuButton  *menu_button);
 
+GDK_AVAILABLE_IN_ALL
+void           gtk_menu_button_set_active (GtkMenuButton *menu_button,
+                                           gboolean       active);
+GDK_AVAILABLE_IN_ALL
+gboolean       gtk_menu_button_get_active (GtkMenuButton *menu_button);
+
 GDK_AVAILABLE_IN_ALL
 void          gtk_menu_button_popup (GtkMenuButton *menu_button);
 GDK_AVAILABLE_IN_ALL


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