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 "gtksettings.h"
|
||||||
#include "gtktypebuiltins.h"
|
#include "gtktypebuiltins.h"
|
||||||
#include "gtkwidgetprivate.h"
|
#include "gtkwidgetprivate.h"
|
||||||
#include "gtkboxlayout.h"
|
#include "gtkgridlayout.h"
|
||||||
#include "gtktextprivate.h"
|
#include "gtktextprivate.h"
|
||||||
|
|
||||||
#include <stdio.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_Up, GDK_CONTROL_MASK, GTK_SCROLL_END);
|
||||||
add_spin_binding (widget_class, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_START);
|
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_css_name (widget_class, I_("spinbutton"));
|
||||||
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_SPIN_BUTTON);
|
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));
|
g_value_set_double (value, gtk_adjustment_get_value (spin_button->adjustment));
|
||||||
break;
|
break;
|
||||||
case PROP_ORIENTATION:
|
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;
|
break;
|
||||||
case PROP_EDITING_CANCELED:
|
case PROP_EDITING_CANCELED:
|
||||||
g_value_set_boolean (value, spin_button->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);
|
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
|
static void
|
||||||
gtk_spin_button_init (GtkSpinButton *spin_button)
|
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, "released", G_CALLBACK (button_released_cb), spin_button);
|
||||||
g_signal_connect (gesture, "cancel", G_CALLBACK (button_cancel_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_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)),
|
gtk_gesture_group (gtk_button_get_gesture (GTK_BUTTON (spin_button->up_button)), gesture);
|
||||||
gesture);
|
|
||||||
|
|
||||||
gtk_spin_button_set_adjustment (spin_button, NULL);
|
gtk_spin_button_set_adjustment (spin_button, NULL);
|
||||||
|
|
||||||
@@ -1075,7 +1116,7 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
|
|||||||
GTK_EVENT_CONTROLLER (gesture));
|
GTK_EVENT_CONTROLLER (gesture));
|
||||||
|
|
||||||
controller = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL |
|
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_signal_connect (controller, "scroll",
|
||||||
G_CALLBACK (scroll_controller_scroll), spin_button);
|
G_CALLBACK (scroll_controller_scroll), spin_button);
|
||||||
gtk_widget_add_controller (GTK_WIDGET (spin_button), controller);
|
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_signal_connect (controller, "leave",
|
||||||
G_CALLBACK (key_controller_focus_out), spin_button);
|
G_CALLBACK (key_controller_focus_out), spin_button);
|
||||||
gtk_widget_add_controller (GTK_WIDGET (spin_button), controller);
|
gtk_widget_add_controller (GTK_WIDGET (spin_button), controller);
|
||||||
|
|
||||||
|
gtk_spin_button_update_orientation (spin_button);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1191,14 +1234,12 @@ static void
|
|||||||
gtk_spin_button_set_orientation (GtkSpinButton *spin,
|
gtk_spin_button_set_orientation (GtkSpinButton *spin,
|
||||||
GtkOrientation orientation)
|
GtkOrientation orientation)
|
||||||
{
|
{
|
||||||
GtkBoxLayout *layout_manager;
|
|
||||||
GtkEditable *editable = GTK_EDITABLE (spin->entry);
|
GtkEditable *editable = GTK_EDITABLE (spin->entry);
|
||||||
|
|
||||||
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (spin)) == orientation)
|
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (spin)) == orientation)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
layout_manager = GTK_BOX_LAYOUT (gtk_widget_get_layout_manager (GTK_WIDGET (spin)));
|
spin->orientation = orientation;
|
||||||
gtk_orientable_set_orientation (GTK_ORIENTABLE (layout_manager), orientation);
|
|
||||||
|
|
||||||
gtk_widget_update_orientation (GTK_WIDGET (spin), 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_get_alignment (editable) == 0.5)
|
||||||
gtk_editable_set_alignment (editable, 0.0);
|
gtk_editable_set_alignment (editable, 0.0);
|
||||||
|
|
||||||
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
gtk_spin_button_update_orientation (spin);
|
||||||
{
|
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (spin), "orientation");
|
g_object_notify (G_OBJECT (spin), "orientation");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user