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:
@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user