app: snap spin scale to page increments when holding Ctrl

When click-dragging a GimpSpinScale while holding Ctrl, in either
absolute or relative mode, snap the value (or the delta) to the
page increment.
This commit is contained in:
Ell
2020-01-09 01:41:48 +02:00
parent 6b9a6da4a7
commit e27aa6c000

View File

@ -31,11 +31,13 @@
#include "widgets-types.h" #include "widgets-types.h"
#include "gimpspinscale.h" #include "gimpspinscale.h"
#include "gimpwidgets-utils.h"
#include "gimp-intl.h" #include "gimp-intl.h"
#define RELATIVE_CHANGE_SPEED 0.1
enum enum
{ {
PROP_0, PROP_0,
@ -604,7 +606,7 @@ gimp_spin_scale_get_target (GtkWidget *widget,
switch (event->button) switch (event->button)
{ {
case 1: case 1:
if (event->state & gimp_get_extend_selection_mask ()) if (event->state & GDK_SHIFT_MASK)
return TARGET_LOWER; return TARGET_LOWER;
else else
return TARGET_UPPER; return TARGET_UPPER;
@ -711,7 +713,8 @@ gimp_spin_scale_get_limits (GimpSpinScale *scale,
static void static void
gimp_spin_scale_change_value (GtkWidget *widget, gimp_spin_scale_change_value (GtkWidget *widget,
gdouble x) gdouble x,
guint state)
{ {
GimpSpinScalePrivate *private = GET_PRIVATE (widget); GimpSpinScalePrivate *private = GET_PRIVATE (widget);
GtkSpinButton *spin_button = GTK_SPIN_BUTTON (widget); GtkSpinButton *spin_button = GTK_SPIN_BUTTON (widget);
@ -733,17 +736,23 @@ gimp_spin_scale_change_value (GtkWidget *widget,
if (private->relative_change) if (private->relative_change)
{ {
gdouble diff;
gdouble step; gdouble step;
step = (upper - lower) / width / 10.0; step = (upper - lower) / width * RELATIVE_CHANGE_SPEED;
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
diff = x - (width - private->start_x); step *= x - (width - private->start_x);
else else
diff = x - private->start_x; step *= x - private->start_x;
value = (private->start_value + diff * step); if (state & GDK_CONTROL_MASK)
{
gdouble page_inc = gtk_adjustment_get_page_increment (adjustment);
step = RINT (step / page_inc) * page_inc;
}
value = private->start_value + step;
} }
else else
{ {
@ -754,6 +763,13 @@ gimp_spin_scale_change_value (GtkWidget *widget,
fraction = pow (fraction, private->gamma); fraction = pow (fraction, private->gamma);
value = fraction * (upper - lower) + lower; value = fraction * (upper - lower) + lower;
if (state & GDK_CONTROL_MASK)
{
gdouble page_inc = gtk_adjustment_get_page_increment (adjustment);
value = RINT (value / page_inc) * page_inc;
}
} }
digits = gtk_spin_button_get_digits (spin_button); digits = gtk_spin_button_get_digits (spin_button);
@ -798,7 +814,7 @@ gimp_spin_scale_button_press (GtkWidget *widget,
gtk_widget_grab_focus (widget); gtk_widget_grab_focus (widget);
gimp_spin_scale_change_value (widget, event->x); gimp_spin_scale_change_value (widget, event->x, event->state);
return TRUE; return TRUE;
@ -840,7 +856,7 @@ gimp_spin_scale_button_release (GtkWidget *widget,
* gimp_spin_scale_motion_notify(). * gimp_spin_scale_motion_notify().
*/ */
if (! private->pointer_warp) if (! private->pointer_warp)
gimp_spin_scale_change_value (widget, event->x); gimp_spin_scale_change_value (widget, event->x, event->state);
if (private->relative_change) if (private->relative_change)
{ {
@ -930,7 +946,7 @@ gimp_spin_scale_motion_notify (GtkWidget *widget,
private->start_x = private->pointer_warp_start_x; private->start_x = private->pointer_warp_start_x;
} }
gimp_spin_scale_change_value (widget, event->x); gimp_spin_scale_change_value (widget, event->x, event->state);
if (private->relative_change) if (private->relative_change)
{ {