use crate::{PointerEvent, PointerEventType, Vector};
#[derive(Copy, Clone, Debug, Default)]
pub struct PointerTracker {
pos: Option<Vector>,
mouse_down: Option<Vector>,
drag: Drag,
}
impl PointerTracker {
pub fn new() -> Self {
Self::default()
}
pub fn pos(&self) -> Option<Vector> {
self.pos
}
pub fn take_drag(&mut self) -> Option<(Vector, Vector)> {
self.drag.take()
}
pub fn track_pointer_event(&mut self, event: &PointerEvent) {
match event.event_type() {
PointerEventType::Move => {
let to = event.pos();
self.pos = Some(to);
if let Some(from) = self.mouse_down {
self.drag.add(from, to);
self.mouse_down = Some(to);
}
}
PointerEventType::Leave => {
self.pos = None;
}
PointerEventType::Down => {
self.mouse_down = Some(event.pos());
}
PointerEventType::Up => {
self.mouse_down = None;
}
_ => { }
}
}
}
#[derive(Default, Clone, Copy, Debug)]
struct Drag(Option<(Vector, Vector)>);
impl Drag {
pub fn add(&mut self, start: Vector, end: Vector) {
if let Some(old) = self.0 {
self.0 = Some((old.0, end));
} else {
self.0 = Some((start, end));
}
}
pub fn take(&mut self) -> Option<(Vector, Vector)> {
self.0.take()
}
}