[gtk/wip/carlosg/spin-button-swipe-gesture: 2/2] spinbutton: Mind the step in the swipe gesture




commit 915388cfdb23610e8128214cbb9a7e7248f72049
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Jun 8 15:09:37 2021 +0200

    spinbutton: Mind the step in the swipe gesture
    
    The swipe gesture forces values in the spin button that are
    "impossible" according to the adjustment. This can break things
    in creative ways.
    
    Ensure the steps provided are always multiples of the adjustment
    step value, and keep the remainder for further interaction.

 gtk/gtkspinbutton.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c
index 303a080e72..4e70bc56d7 100644
--- a/gtk/gtkspinbutton.c
+++ b/gtk/gtkspinbutton.c
@@ -208,6 +208,7 @@ struct _GtkSpinButton
 
   double         climb_rate;
   double         timer_step;
+  double         swipe_remainder;
 
   int            width_chars;
 
@@ -838,6 +839,7 @@ swipe_gesture_begin (GtkGesture       *gesture,
 {
   gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED);
   gtk_widget_grab_focus (GTK_WIDGET (spin_button));
+  spin_button->swipe_remainder = 0;
 }
 
 static void
@@ -845,10 +847,12 @@ swipe_gesture_update (GtkGesture       *gesture,
                       GdkEventSequence *sequence,
                       GtkSpinButton    *spin_button)
 {
-  double vel_y;
+  double vel_y, step;
 
   gtk_gesture_swipe_get_velocity (GTK_GESTURE_SWIPE (gesture), NULL, &vel_y);
-  gtk_spin_button_real_spin (spin_button, -vel_y / 20);
+  step = (-vel_y / 20) + spin_button->swipe_remainder;
+  spin_button->swipe_remainder = fmod (step, gtk_adjustment_get_step_increment (spin_button->adjustment));
+  gtk_spin_button_real_spin (spin_button, step - spin_button->swipe_remainder);
 }
 
 static gboolean


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]