#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ScrollCommand {
SetOffset(usize),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ScrollAxis {
Vertical,
Horizontal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PointerButton {
Primary,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PointerEventKind {
Down,
Drag,
Up,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PointerEvent {
pub column: u16,
pub row: u16,
pub kind: PointerEventKind,
pub button: PointerButton,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScrollWheel {
pub axis: ScrollAxis,
pub delta: isize,
pub column: u16,
pub row: u16,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ScrollEvent {
Pointer(PointerEvent),
ScrollWheel(ScrollWheel),
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct ScrollBarInteraction {
pub(crate) drag_state: DragState,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub(crate) enum DragState {
#[default]
Idle,
Dragging { grab_offset: usize },
}
impl ScrollBarInteraction {
pub fn new() -> Self {
Self::default()
}
pub(crate) fn start_drag(&mut self, grab_offset: usize) {
self.drag_state = DragState::Dragging { grab_offset };
}
pub(crate) fn stop_drag(&mut self) {
self.drag_state = DragState::Idle;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn starts_idle() {
let interaction = ScrollBarInteraction::new();
assert_eq!(interaction.drag_state, DragState::Idle);
}
#[test]
fn records_grab_offset_on_start_drag() {
let mut interaction = ScrollBarInteraction::new();
interaction.start_drag(6);
assert_eq!(
interaction.drag_state,
DragState::Dragging { grab_offset: 6 }
);
}
#[test]
fn resets_state_on_stop_drag() {
let mut interaction = ScrollBarInteraction::new();
interaction.start_drag(3);
interaction.stop_drag();
assert_eq!(interaction.drag_state, DragState::Idle);
}
}