pub(crate) const WHEEL_STEP_UNITS: f32 = 40.0;
pub(crate) fn wheel_steps(remainder: &mut f32, delta_x: f32, delta_y: f32) -> Option<i32> {
if delta_y == 0.0 || delta_x.abs() > delta_y.abs() {
return None;
}
if *remainder * delta_y < 0.0 {
*remainder = 0.0;
}
*remainder += delta_y;
let steps = (*remainder / WHEEL_STEP_UNITS).trunc();
*remainder -= steps * WHEEL_STEP_UNITS;
Some(steps as i32)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn trackpad_deltas_add_up_to_a_step() {
let mut left = 0.0;
assert_eq!(wheel_steps(&mut left, 0.0, 25.0), Some(0));
assert_eq!(wheel_steps(&mut left, 0.0, 25.0), Some(1));
assert_eq!(left, 10.0);
}
#[test]
fn reversing_drops_the_remainder() {
let mut left = 30.0;
assert_eq!(wheel_steps(&mut left, 0.0, -10.0), Some(0));
assert_eq!(left, -10.0);
}
#[test]
fn a_sideways_gesture_is_not_a_step() {
let mut left = 0.0;
assert_eq!(wheel_steps(&mut left, 50.0, 10.0), None);
assert_eq!(left, 0.0);
}
}