range: add a primary-button-warps-slider style property

Setting this to TRUE (it's FALSE by default) enables the behavior we
have in GTK3 for scrollbars.

https://bugzilla.gnome.org/show_bug.cgi?id=683279
This commit is contained in:
Cosimo Cecchi
2012-09-03 11:43:04 -04:00
parent 88bfb0f59e
commit cc7abf6a1c

View File

@@ -532,6 +532,12 @@ gtk_range_class_init (GtkRangeClass *class)
G_MAXINT, G_MAXINT,
0, 0,
GTK_PARAM_READABLE)); GTK_PARAM_READABLE));
gtk_widget_class_install_style_property (widget_class,
g_param_spec_boolean ("primary-button-warps-slider",
P_("Primary button warps slider"),
P_("Whether a primary click on the trough should warp the slider into position"),
FALSE,
GTK_PARAM_READABLE));
/** /**
* GtkRange:activate-slider: * GtkRange:activate-slider:
@@ -2310,6 +2316,8 @@ gtk_range_button_press (GtkWidget *widget,
GdkEventButton *event) GdkEventButton *event)
{ {
GtkRange *range = GTK_RANGE (widget); GtkRange *range = GTK_RANGE (widget);
gboolean primary_warps;
gint page_increment_button, warp_button;
if (!gtk_widget_has_focus (widget)) if (!gtk_widget_has_focus (widget))
gtk_widget_grab_focus (widget); gtk_widget_grab_focus (widget);
@@ -2322,11 +2330,25 @@ gtk_range_button_press (GtkWidget *widget,
range->layout->mouse_y = event->y; range->layout->mouse_y = event->y;
if (gtk_range_update_mouse_location (range)) if (gtk_range_update_mouse_location (range))
gtk_widget_queue_draw (widget); gtk_widget_queue_draw (widget);
if (range->layout->mouse_location == MOUSE_TROUGH && gtk_widget_style_get (widget,
event->button == 1) "primary-button-warps-slider", &primary_warps,
NULL);
if (primary_warps)
{ {
/* button 1 steps by page increment, as with button 2 on a stepper warp_button = 1;
page_increment_button = 3;
}
else
{
warp_button = 2;
page_increment_button = 1;
}
if (range->layout->mouse_location == MOUSE_TROUGH &&
event->button == page_increment_button)
{
/* this button steps by page increment, as with button 2 on a stepper
*/ */
GtkScrollType scroll; GtkScrollType scroll;
gdouble click_value; gdouble click_value;
@@ -2369,18 +2391,17 @@ gtk_range_button_press (GtkWidget *widget,
return TRUE; return TRUE;
} }
else if ((range->layout->mouse_location == MOUSE_TROUGH && else if ((range->layout->mouse_location == MOUSE_TROUGH &&
event->button == 2) || event->button == warp_button) ||
range->layout->mouse_location == MOUSE_SLIDER) range->layout->mouse_location == MOUSE_SLIDER)
{ {
gboolean need_value_update = FALSE; gboolean need_value_update = FALSE;
gboolean activate_slider; gboolean activate_slider;
/* Any button can be used to drag the slider, but you can start /* Any button can be used to drag the slider, but you can start
* dragging the slider with a trough click using button 2; * dragging the slider with a trough click using the warp button;
* On button 2 press, we warp the slider to mouse position, * we warp the slider to mouse position, then begin the slider drag.
* then begin the slider drag.
*/ */
if (event->button == 2) if (event->button == warp_button)
{ {
gdouble slider_low_value, slider_high_value, new_value; gdouble slider_low_value, slider_high_value, new_value;