cranpose-foundation 0.1.9

Modifiers, nodes, and foundation elements for Cranpose
Documentation
use crate::nodes::input::{PointerEvent, PointerEventKind};
use cranpose_ui_graphics::Point;

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ScrollGestureEvent {
    None,
    Scrolled(Point),
}

#[derive(Default, Debug, Clone, Copy, PartialEq)]
pub struct ScrollGesture;

impl ScrollGesture {
    pub fn new() -> Self {
        Self
    }

    pub fn handle_event(&mut self, event: &PointerEvent) -> ScrollGestureEvent {
        if event.kind != PointerEventKind::Scroll || event.is_consumed() {
            return ScrollGestureEvent::None;
        }
        if event.scroll_delta.x == 0.0 && event.scroll_delta.y == 0.0 {
            return ScrollGestureEvent::None;
        }
        event.consume();
        ScrollGestureEvent::Scrolled(event.scroll_delta)
    }

    pub fn reset(&mut self) {}
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn scroll_consumes_non_zero_scroll_delta() {
        let mut gesture = ScrollGesture::new();
        let event = PointerEvent::new(
            PointerEventKind::Scroll,
            Point { x: 0.0, y: 0.0 },
            Point { x: 0.0, y: 0.0 },
        )
        .with_scroll_delta(Point { x: 0.0, y: 12.0 });

        assert_eq!(
            gesture.handle_event(&event),
            ScrollGestureEvent::Scrolled(Point { x: 0.0, y: 12.0 })
        );
        assert!(event.is_consumed());
    }
}