Add GtkMenuButton:can-shrink
authorEmmanuele Bassi <ebassi@gnome.org>
Fri, 14 Apr 2023 12:08:13 +0000 (13:08 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Mon, 24 Apr 2023 10:09:01 +0000 (11:09 +0100)
Map the GtkMenuButton property to the underlying GtkButton widget.

gtk/gtkmenubutton.c
gtk/gtkmenubutton.h

index ad723aa38bd8ae258d597d0d207ae3c085e12200..e6870523b51ec8d6e635e524c754f2ca279c14f5 100644 (file)
@@ -128,6 +128,7 @@ struct _GtkMenuButton
   gboolean always_show_arrow;
 
   gboolean primary;
+  gboolean can_shrink;
 };
 
 struct _GtkMenuButtonClass
@@ -151,6 +152,7 @@ enum
   PROP_PRIMARY,
   PROP_CHILD,
   PROP_ACTIVE,
+  PROP_CAN_SHRINK,
   LAST_PROP
 };
 
@@ -212,6 +214,9 @@ gtk_menu_button_set_property (GObject      *object,
       case PROP_ACTIVE:
         gtk_menu_button_set_active (self, g_value_get_boolean (value));
         break;
+      case PROP_CAN_SHRINK:
+        gtk_menu_button_set_can_shrink (self, g_value_get_boolean (value));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     }
@@ -260,6 +265,9 @@ gtk_menu_button_get_property (GObject    *object,
       case PROP_ACTIVE:
         g_value_set_boolean (value, gtk_menu_button_get_active (self));
         break;
+      case PROP_CAN_SHRINK:
+        g_value_set_boolean (value, gtk_menu_button_get_can_shrink (self));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     }
@@ -534,6 +542,19 @@ gtk_menu_button_class_init (GtkMenuButtonClass *klass)
                           FALSE,
                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkMenuButton:can-shrink: (attributes org.gtk.Property.get=gtk_menu_button_get_can_shrink org.gtk.Property.set=gtk_menu_button_set_can_shrink)
+   *
+   * Whether the size of the button can be made smaller than the natural
+   * size of its contents.
+   *
+   * Since: 4.12
+   */
+  menu_button_props[PROP_CAN_SHRINK] =
+    g_param_spec_boolean ("can-shrink", NULL, NULL,
+                          FALSE,
+                          GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (gobject_class, LAST_PROP, menu_button_props);
 
   /**
@@ -1150,6 +1171,9 @@ gtk_menu_button_set_label (GtkMenuButton *menu_button,
   gtk_label_set_xalign (GTK_LABEL (label_widget), 0);
   gtk_label_set_use_underline (GTK_LABEL (label_widget),
                                gtk_button_get_use_underline (GTK_BUTTON (menu_button->button)));
+  gtk_label_set_ellipsize (GTK_LABEL (label_widget),
+                           menu_button->can_shrink ? PANGO_ELLIPSIZE_END
+                                                   : PANGO_ELLIPSIZE_NONE);
   gtk_widget_set_hexpand (label_widget, TRUE);
   gtk_widget_set_halign (label_widget, GTK_ALIGN_CENTER);
   arrow = gtk_builtin_icon_new ("arrow");
@@ -1566,3 +1590,59 @@ gtk_menu_button_get_active (GtkMenuButton *menu_button)
 
   return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (menu_button->button));
 }
+
+/**
+ * gtk_menu_button_set_can_shrink:
+ * @menu_button: a menu button
+ * @can_shrink: whether the button can shrink
+ *
+ * Sets whether the button size can be smaller than the natural size of
+ * its contents.
+ *
+ * For text buttons, setting @can_shrink to true will ellipsize the label.
+ *
+ * For icon buttons, this function has no effect.
+ *
+ * Since: 4.12
+ */
+void
+gtk_menu_button_set_can_shrink (GtkMenuButton *menu_button,
+                                gboolean       can_shrink)
+{
+  g_return_if_fail (GTK_IS_MENU_BUTTON (menu_button));
+
+  can_shrink = !!can_shrink;
+
+  if (menu_button->can_shrink == can_shrink)
+    return;
+
+  menu_button->can_shrink = can_shrink;
+
+  if (menu_button->label_widget != NULL)
+    {
+      gtk_label_set_ellipsize (GTK_LABEL (menu_button->label_widget),
+                               can_shrink ? PANGO_ELLIPSIZE_END
+                                          : PANGO_ELLIPSIZE_NONE);
+    }
+
+  g_object_notify_by_pspec (G_OBJECT (menu_button), menu_button_props[PROP_CAN_SHRINK]);
+}
+
+/**
+ * gtk_menu_button_get_can_shrink:
+ * @menu_button: a button
+ *
+ * Retrieves whether the button can be smaller than the natural
+ * size of its contents.
+ *
+ * Returns: true if the button can shrink, and false otherwise
+ *
+ * Since: 4.12
+ */
+gboolean
+gtk_menu_button_get_can_shrink (GtkMenuButton *menu_button)
+{
+  g_return_val_if_fail (GTK_IS_MENU_BUTTON (menu_button), FALSE);
+
+  return menu_button->can_shrink;
+}
index 566f592d352e07a258986f148a4a83709716c911..5b2e3322b449530320e80f84becb99ed177cd0e0 100644 (file)
@@ -127,10 +127,17 @@ GDK_AVAILABLE_IN_4_6
 GtkWidget *   gtk_menu_button_get_child   (GtkMenuButton *menu_button);
 
 GDK_AVAILABLE_IN_4_10
-void       gtk_menu_button_set_active (GtkMenuButton *menu_button,
+void          gtk_menu_button_set_active (GtkMenuButton *menu_button,
                                        gboolean       active);
 GDK_AVAILABLE_IN_4_10
-gboolean   gtk_menu_button_get_active (GtkMenuButton *menu_button);
+gboolean      gtk_menu_button_get_active (GtkMenuButton *menu_button);
+
+GDK_AVAILABLE_IN_4_12
+void          gtk_menu_button_set_can_shrink  (GtkMenuButton *menu_button,
+                                               gboolean       can_shrink);
+GDK_AVAILABLE_IN_4_12
+gboolean      gtk_menu_button_get_can_shrink  (GtkMenuButton *menu_button);
+
 
 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkMenuButton, g_object_unref)