From d648a7721e826717fb2c675d8202ab34e879d521 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 27 Apr 2023 20:24:49 +0200 Subject: [PATCH] spinbutton: Use a grid layout A grid layout lets us get the baseline right in vertical orientation, by setting a baseline row. It would be nice if the box layout supported this as well, but currently it doesn't, and adding that feature isn't trivial. --- gtk/gtkspinbutton.c | 70 +++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 19 deletions(-) diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index d5a2e6c798..e32f2774fb 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -51,7 +51,7 @@ #include "gtksettings.h" #include "gtktypebuiltins.h" #include "gtkwidgetprivate.h" -#include "gtkboxlayout.h" +#include "gtkgridlayout.h" #include "gtktextprivate.h" #include @@ -587,7 +587,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class) add_spin_binding (widget_class, GDK_KEY_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_END); add_spin_binding (widget_class, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_START); - gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT); + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_GRID_LAYOUT); gtk_widget_class_set_css_name (widget_class, I_("spinbutton")); gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_SPIN_BUTTON); } @@ -813,7 +813,7 @@ gtk_spin_button_get_property (GObject *object, g_value_set_double (value, gtk_adjustment_get_value (spin_button->adjustment)); break; case PROP_ORIENTATION: - g_value_set_enum (value, gtk_orientable_get_orientation (GTK_ORIENTABLE (gtk_widget_get_layout_manager (GTK_WIDGET (spin_button))))); + g_value_set_enum (value, spin_button->orientation); break; case PROP_EDITING_CANCELED: g_value_set_boolean (value, spin_button->editing_canceled); @@ -991,6 +991,48 @@ key_controller_focus_out (GtkEventController *controller, gtk_spin_button_update (spin_button); } +static void +gtk_spin_button_update_orientation (GtkSpinButton *spin_button) +{ + GtkLayoutManager *layout; + GtkGridLayoutChild *child; + + layout = gtk_widget_get_layout_manager (GTK_WIDGET (spin_button)); + + if (spin_button->orientation == GTK_ORIENTATION_HORIZONTAL) + { + gtk_grid_layout_set_baseline_row (GTK_GRID_LAYOUT (layout), 0); + + child = GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout, spin_button->entry)); + gtk_grid_layout_child_set_row (child, 0); + gtk_grid_layout_child_set_column (child, 0); + + child = GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout, spin_button->up_button)); + gtk_grid_layout_child_set_row (child, 0); + gtk_grid_layout_child_set_column (child, 1); + + child = GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout, spin_button->down_button)); + gtk_grid_layout_child_set_row (child, 0); + gtk_grid_layout_child_set_column (child, 2); + } + else + { + gtk_grid_layout_set_baseline_row (GTK_GRID_LAYOUT (layout), 1); + + child = GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout, spin_button->up_button)); + gtk_grid_layout_child_set_row (child, 0); + gtk_grid_layout_child_set_column (child, 0); + + child = GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout, spin_button->entry)); + gtk_grid_layout_child_set_row (child, 1); + gtk_grid_layout_child_set_column (child, 0); + + child = GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (layout, spin_button->down_button)); + gtk_grid_layout_child_set_row (child, 2); + gtk_grid_layout_child_set_column (child, 0); + } +} + static void gtk_spin_button_init (GtkSpinButton *spin_button) { @@ -1058,8 +1100,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button) g_signal_connect (gesture, "released", G_CALLBACK (button_released_cb), spin_button); g_signal_connect (gesture, "cancel", G_CALLBACK (button_cancel_cb), spin_button); gtk_widget_add_controller (GTK_WIDGET (spin_button->up_button), GTK_EVENT_CONTROLLER (gesture)); - gtk_gesture_group (gtk_button_get_gesture (GTK_BUTTON (spin_button->up_button)), - gesture); + gtk_gesture_group (gtk_button_get_gesture (GTK_BUTTON (spin_button->up_button)), gesture); gtk_spin_button_set_adjustment (spin_button, NULL); @@ -1075,7 +1116,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button) GTK_EVENT_CONTROLLER (gesture)); controller = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL | - GTK_EVENT_CONTROLLER_SCROLL_DISCRETE); + GTK_EVENT_CONTROLLER_SCROLL_DISCRETE); g_signal_connect (controller, "scroll", G_CALLBACK (scroll_controller_scroll), spin_button); gtk_widget_add_controller (GTK_WIDGET (spin_button), controller); @@ -1088,6 +1129,8 @@ gtk_spin_button_init (GtkSpinButton *spin_button) g_signal_connect (controller, "leave", G_CALLBACK (key_controller_focus_out), spin_button); gtk_widget_add_controller (GTK_WIDGET (spin_button), controller); + + gtk_spin_button_update_orientation (spin_button); } static void @@ -1191,14 +1234,12 @@ static void gtk_spin_button_set_orientation (GtkSpinButton *spin, GtkOrientation orientation) { - GtkBoxLayout *layout_manager; GtkEditable *editable = GTK_EDITABLE (spin->entry); if (gtk_orientable_get_orientation (GTK_ORIENTABLE (spin)) == orientation) return; - layout_manager = GTK_BOX_LAYOUT (gtk_widget_get_layout_manager (GTK_WIDGET (spin))); - gtk_orientable_set_orientation (GTK_ORIENTABLE (layout_manager), orientation); + spin->orientation = orientation; gtk_widget_update_orientation (GTK_WIDGET (spin), orientation); @@ -1210,16 +1251,7 @@ gtk_spin_button_set_orientation (GtkSpinButton *spin, gtk_editable_get_alignment (editable) == 0.5) gtk_editable_set_alignment (editable, 0.0); - if (orientation == GTK_ORIENTATION_HORIZONTAL) - { - /* Current orientation of the box is vertical! */ - gtk_widget_insert_after (spin->up_button, GTK_WIDGET (spin), spin->down_button); - } - else - { - /* Current orientation of the box is horizontal! */ - gtk_widget_insert_before (spin->up_button, GTK_WIDGET (spin), spin->entry); - } + gtk_spin_button_update_orientation (spin); g_object_notify (G_OBJECT (spin), "orientation"); }