centerbox: Expose GtkCenterLayout:shrink-center-last
authorAlexander Mikhaylenko <alexm@gnome.org>
Wed, 5 Apr 2023 12:05:03 +0000 (16:05 +0400)
committerAlexander Mikhaylenko <alexm@gnome.org>
Wed, 5 Apr 2023 12:15:49 +0000 (16:15 +0400)
gtk/gtkcenterbox.c
gtk/gtkcenterbox.h

index 367c0eab0bfe084182d9b58780f347e5e14b62ae..e76ffc31dd035162eb1064264557797372430ecb 100644 (file)
@@ -86,6 +86,7 @@ enum {
   PROP_CENTER_WIDGET,
   PROP_END_WIDGET,
   PROP_BASELINE_POSITION,
+  PROP_SHRINK_CENTER_LAST,
 
   /* orientable */
   PROP_ORIENTATION,
@@ -155,17 +156,21 @@ gtk_center_box_set_property (GObject      *object,
       }
       break;
 
-   case PROP_START_WIDGET:
-     gtk_center_box_set_start_widget (self, GTK_WIDGET (g_value_get_object (value)));
-     break;
+    case PROP_START_WIDGET:
+      gtk_center_box_set_start_widget (self, GTK_WIDGET (g_value_get_object (value)));
+      break;
 
-   case PROP_CENTER_WIDGET:
-     gtk_center_box_set_center_widget (self, GTK_WIDGET (g_value_get_object (value)));
-     break;
+    case PROP_CENTER_WIDGET:
+      gtk_center_box_set_center_widget (self, GTK_WIDGET (g_value_get_object (value)));
+      break;
 
-   case PROP_END_WIDGET:
-     gtk_center_box_set_end_widget (self, GTK_WIDGET (g_value_get_object (value)));
-     break;
+    case PROP_END_WIDGET:
+      gtk_center_box_set_end_widget (self, GTK_WIDGET (g_value_get_object (value)));
+      break;
+
+    case PROP_SHRINK_CENTER_LAST:
+      gtk_center_box_set_shrink_center_last (self, g_value_get_boolean (value));
+      break;
 
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -204,6 +209,10 @@ gtk_center_box_get_property (GObject    *object,
       g_value_set_object (value, self->end_widget);
       break;
 
+    case PROP_SHRINK_CENTER_LAST:
+      g_value_set_boolean (value, gtk_center_layout_get_shrink_center_last (GTK_CENTER_LAYOUT (layout)));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -289,6 +298,25 @@ gtk_center_box_class_init (GtkCenterBoxClass *klass)
                            GTK_TYPE_WIDGET,
                            GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkCenterBox:shrink-center-last: (attributes org.gtk.Property.get=gtk_center_box_get_shrink_center_last org.gtk.Property.set=gtk_center_box_set_shrink_center_last)
+   *
+   * Whether to shrink the center widget after other children.
+   *
+   * By default, when there's no space to give all three children their
+   * natural widths, the start and end widgets start shrinking and the
+   * center child keeps natural width until they reach minimum width.
+   *
+   * If set to `TRUE`, start and end widgets keep natural width and the
+   * center widget starts shrinking instead.
+   *
+   * Since: 4.12
+   */
+  props[PROP_SHRINK_CENTER_LAST] =
+      g_param_spec_boolean ("shrink-center-last", NULL, NULL,
+                            FALSE,
+                            GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (object_class, LAST_PROP, props);
 
   gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_CENTER_LAYOUT);
@@ -513,3 +541,61 @@ gtk_center_box_get_baseline_position (GtkCenterBox *self)
   return gtk_center_layout_get_baseline_position (GTK_CENTER_LAYOUT (layout));
 }
 
+/**
+ * gtk_center_box_set_shrink_center_last: (attributes org.gtk.Method.set_property=shrink-center-last)
+ * @self: a `GtkCenterBox`
+ * @shrink_center_last: whether to shrink the center widget after others
+ *
+ * Sets whether to shrink the center widget after other children.
+ *
+ * By default, when there's no space to give all three children their
+ * natural widths, the start and end widgets start shrinking and the
+ * center child keeps natural width until they reach minimum width.
+ *
+ * If set to `TRUE`, start and end widgets keep natural width and the
+ * center widget starts shrinking instead.
+ *
+ * Since: 4.12
+ */
+void
+gtk_center_box_set_shrink_center_last (GtkCenterBox *self,
+                                       gboolean      shrink_center_last)
+{
+  GtkLayoutManager *layout;
+  gboolean current_shrink_center_last;
+
+  g_return_if_fail (GTK_IS_CENTER_BOX (self));
+
+  shrink_center_last = !!shrink_center_last;
+
+  layout = gtk_widget_get_layout_manager (GTK_WIDGET (self));
+  current_shrink_center_last = gtk_center_layout_get_shrink_center_last (GTK_CENTER_LAYOUT (layout));
+  if (current_shrink_center_last != shrink_center_last)
+    {
+      gtk_center_layout_set_shrink_center_last (GTK_CENTER_LAYOUT (layout), shrink_center_last);
+      g_object_notify_by_pspec (G_OBJECT (self), props[PROP_SHRINK_CENTER_LAST]);
+      gtk_widget_queue_allocate (GTK_WIDGET (self));
+    }
+}
+
+/**
+ * gtk_center_box_get_shrink_center_last: (attributes org.gtk.Method.get_property=shrink-center-last)
+ * @self: a `GtkCenterBox`
+ *
+ * Gets whether @self shrinks the center widget after other children.
+ *
+ * Returns: whether to shrink the center widget after others
+ *
+ * Since: 4.12
+ */
+gboolean
+gtk_center_box_get_shrink_center_last (GtkCenterBox *self)
+{
+  GtkLayoutManager *layout;
+
+  g_return_val_if_fail (GTK_IS_CENTER_BOX (self), FALSE);
+
+  layout = gtk_widget_get_layout_manager (GTK_WIDGET (self));
+
+  return gtk_center_layout_get_shrink_center_last (GTK_CENTER_LAYOUT (layout));
+}
index 1f5831fd79670cd747bcd84820e0073869d3690c..1003c1524b0952e9d9f31fd04fff2d14d4026a43 100644 (file)
@@ -67,5 +67,11 @@ void                gtk_center_box_set_baseline_position (GtkCenterBox        *s
 GDK_AVAILABLE_IN_ALL
 GtkBaselinePosition gtk_center_box_get_baseline_position (GtkCenterBox        *self);
 
+GDK_AVAILABLE_IN_4_12
+void        gtk_center_box_set_shrink_center_last (GtkCenterBox *self,
+                                                   gboolean      shrink_center_last);
+GDK_AVAILABLE_IN_4_12
+gboolean    gtk_center_box_get_shrink_center_last (GtkCenterBox *self);
+
 G_END_DECLS