use saudade::mock::MockBackend;
use saudade::{Event, List, ListItem, MouseButton, Point, Rect, ScrollBar, Slider, Widget};
fn down(x: i32, y: i32) -> Event {
Event::PointerDown {
pos: Point::new(x, y),
button: MouseButton::Left,
modifiers: Default::default(),
}
}
fn moved(x: i32, y: i32) -> Event {
Event::PointerMove {
pos: Point::new(x, y),
}
}
#[test]
fn scrollbar_drag_ends_on_pointer_leave() {
let backend = MockBackend::new(64, 220);
let mut sb = ScrollBar::vertical(Rect::new(0, 0, 16, 200));
sb.set_range(5, 20);
backend.dispatch(&mut sb, &down(8, 20));
assert!(sb.captures_pointer(), "press on the thumb starts a drag");
backend.dispatch(&mut sb, &moved(8, 60));
assert!(sb.value() > 0, "dragging the thumb scrolls");
let parked = sb.value();
backend.dispatch(&mut sb, &Event::PointerLeave);
assert!(
!sb.captures_pointer(),
"leaving the window ends the thumb drag"
);
backend.dispatch(&mut sb, &moved(8, 140));
assert_eq!(sb.value(), parked, "the thumb no longer chases the cursor");
}
#[test]
fn slider_drag_ends_on_pointer_leave() {
let backend = MockBackend::new(220, 32);
let mut slider = Slider::new(Rect::new(0, 0, 200, 24), 0, 100);
backend.dispatch(&mut slider, &down(10, 12));
assert!(slider.captures_pointer(), "press starts a drag");
backend.dispatch(&mut slider, &moved(120, 12));
assert!(slider.value() > 0, "dragging the thumb moves the value");
let parked = slider.value();
backend.dispatch(&mut slider, &Event::PointerLeave);
assert!(
!slider.captures_pointer(),
"leaving the window ends the drag"
);
backend.dispatch(&mut slider, &moved(180, 12));
assert_eq!(
slider.value(),
parked,
"the thumb no longer jumps to the cursor"
);
}
#[test]
fn list_scrollbar_hit_splits_gutter_from_rows() {
let mut list = List::new(Rect::new(0, 0, 0, 0)).with_items(
(0..40)
.map(|i| ListItem::new(format!("item {i}")))
.collect(),
);
list.layout(Rect::new(0, 0, 200, 120));
assert!(
list.scrollbar_hit(Point::new(195, 40)),
"the right gutter belongs to the scrollbar"
);
assert!(
!list.scrollbar_hit(Point::new(40, 40)),
"the row field is not the scrollbar"
);
}