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.
This commit is contained in:
@@ -51,7 +51,7 @@
|
||||
#include "gtksettings.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
#include "gtkboxlayout.h"
|
||||
#include "gtkgridlayout.h"
|
||||
#include "gtktextprivate.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user