diff options
author | Alexander Mikhaylenko <alexm@gnome.org> | 2023-04-05 16:05:03 +0400 |
---|---|---|
committer | Alexander Mikhaylenko <alexm@gnome.org> | 2023-04-05 16:15:49 +0400 |
commit | c40fa8db987496ff788b86dab220968ec2ffb1b8 (patch) | |
tree | 056be75ba776c64ed3ee6589b55b7a2587be22a2 | |
parent | 8fd9de23bbbb427a678613d2f19e518fb509a7c0 (diff) | |
download | gtk+-c40fa8db987496ff788b86dab220968ec2ffb1b8.tar.gz |
centerbox: Expose GtkCenterLayout:shrink-center-last
-rw-r--r-- | gtk/gtkcenterbox.c | 104 | ||||
-rw-r--r-- | gtk/gtkcenterbox.h | 6 |
2 files changed, 101 insertions, 9 deletions
diff --git a/gtk/gtkcenterbox.c b/gtk/gtkcenterbox.c index 367c0eab0b..e76ffc31dd 100644 --- a/gtk/gtkcenterbox.c +++ b/gtk/gtkcenterbox.c @@ -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)); +} diff --git a/gtk/gtkcenterbox.h b/gtk/gtkcenterbox.h index 1f5831fd79..1003c1524b 100644 --- a/gtk/gtkcenterbox.h +++ b/gtk/gtkcenterbox.h @@ -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 |