From 2367e985a4c6c786ea6b90dd9ff6697f8831bb46 Mon Sep 17 00:00:00 2001 From: woob Date: Thu, 26 Dec 2019 14:32:56 -0500 Subject: [PATCH 1/2] app: allow snapping GimpDial to 15 degree intervals The GimpDial widget can now be snapped to the nearest fifteen degree interval by holding the shift key while adjusting. When adjusting both an alpha and beta value, both will be snapped according to the alpha, preserving the angle between them --- app/widgets/gimpdial.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/widgets/gimpdial.c b/app/widgets/gimpdial.c index 7d13436f106..90a297531d5 100644 --- a/app/widgets/gimpdial.c +++ b/app/widgets/gimpdial.c @@ -41,6 +41,8 @@ #define SEGMENT_FRACTION 0.3 +/* round n to the nearest multiple of m */ +#define SNAP(n, m) (RINT((n) / (m)) * (m)) enum { @@ -310,6 +312,9 @@ gimp_dial_button_press_event (GtkWidget *widget, if (dial->priv->clockwise_angles && angle) angle = 2.0 * G_PI - angle; + if (bevent->state & GDK_SHIFT_MASK) + angle = SNAP (angle, G_PI / 12.0); + dial->priv->last_angle = angle; switch (dial->priv->target) @@ -349,11 +354,16 @@ gimp_dial_motion_notify_event (GtkWidget *widget, { gdouble delta; + if (mevent->state & GDK_SHIFT_MASK) + angle = SNAP (angle, G_PI / 12.0); + delta = angle - dial->priv->last_angle; dial->priv->last_angle = angle; if (delta != 0.0) { + gdouble alpha = dial->priv->alpha; + switch (dial->priv->target) { case DIAL_TARGET_ALPHA: @@ -365,6 +375,10 @@ gimp_dial_motion_notify_event (GtkWidget *widget, break; case DIAL_TARGET_BOTH: + /* snap both by the alpha value */ + if (mevent->state & GDK_SHIFT_MASK) + delta = SNAP (alpha + delta, G_PI / 12.0) - alpha; + g_object_set (dial, "alpha", gimp_dial_normalize_angle (dial->priv->alpha + delta), "beta", gimp_dial_normalize_angle (dial->priv->beta + delta), -- GitLab From 1f6629f4b6521daccf8abf641a679c8d95d625cf Mon Sep 17 00:00:00 2001 From: woob Date: Thu, 26 Dec 2019 14:45:43 -0500 Subject: [PATCH 2/2] app: allow snapping GimpPolar to 15 degree intervals Similar to GimpDial, snaps GimpPolar's angle to the nearest fifteen degree interval by holding the shift key while adjusting --- app/widgets/gimppolar.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/widgets/gimppolar.c b/app/widgets/gimppolar.c index 06484c0de51..2cf3abd8056 100644 --- a/app/widgets/gimppolar.c +++ b/app/widgets/gimppolar.c @@ -38,6 +38,8 @@ #include "gimppolar.h" +/* round n to the nearest multiple of m */ +#define SNAP(n, m) (RINT((n) / (m)) * (m)) enum { @@ -235,6 +237,9 @@ gimp_polar_button_press_event (GtkWidget *widget, angle = _gimp_circle_get_angle_and_distance (GIMP_CIRCLE (polar), bevent->x, bevent->y, &radius); + if (bevent->state & GDK_SHIFT_MASK) + angle = SNAP (angle, G_PI / 12.0); + radius = MIN (radius, 1.0); g_object_set (polar, @@ -262,6 +267,9 @@ gimp_polar_motion_notify_event (GtkWidget *widget, { radius = MIN (radius, 1.0); + if (mevent->state & GDK_SHIFT_MASK) + angle = SNAP (angle, G_PI / 12.0); + g_object_set (polar, "angle", angle, "radius", radius, -- GitLab