Scroll box example

This commit is contained in:
2026-03-21 04:05:38 -04:00
parent a70a08297e
commit ac9be932e7
6 changed files with 1507 additions and 278 deletions

View File

@@ -7,11 +7,12 @@ pub enum PointerButton {
Middle,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum PointerEventKind {
Move,
Down { button: PointerButton },
Up { button: PointerButton },
Scroll { delta: Point },
LeaveWindow,
}
@@ -32,13 +33,14 @@ impl PointerEvent {
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum RoutedPointerEventKind {
Enter,
Leave,
Move,
Down { button: PointerButton },
Up { button: PointerButton },
Scroll { delta: Point },
}
#[derive(Clone, Debug, PartialEq)]
@@ -142,6 +144,16 @@ impl PointerRouter {
});
}
}
PointerEventKind::Scroll { delta } => {
if let Some(target) = hit_target {
routed.push(RoutedPointerEvent {
kind: RoutedPointerEventKind::Scroll { delta },
target,
pointer_id: event.pointer_id,
position: event.position,
});
}
}
PointerEventKind::LeaveWindow => {}
}
@@ -165,9 +177,11 @@ mod tests {
element_id: None,
rect: Rect::new(0.0, 0.0, 200.0, 120.0),
corner_radius: 0.0,
clip_rect: None,
pointer_events: false,
focusable: false,
cursor: CursorIcon::Default,
scroll_metrics: None,
prepared_image: None,
prepared_text: None,
children: vec![
@@ -176,9 +190,11 @@ mod tests {
element_id: Some(ElementId::new(1)),
rect: Rect::new(0.0, 0.0, 120.0, 120.0),
corner_radius: 0.0,
clip_rect: None,
pointer_events: true,
focusable: false,
cursor: CursorIcon::Default,
scroll_metrics: None,
prepared_image: None,
prepared_text: None,
children: Vec::new(),
@@ -188,9 +204,11 @@ mod tests {
element_id: Some(ElementId::new(2)),
rect: Rect::new(80.0, 0.0, 120.0, 120.0),
corner_radius: 0.0,
clip_rect: None,
pointer_events: true,
focusable: false,
cursor: CursorIcon::Default,
scroll_metrics: None,
prepared_image: None,
prepared_text: None,
children: Vec::new(),
@@ -207,9 +225,11 @@ mod tests {
element_id: None,
rect: Rect::new(0.0, 0.0, 200.0, 120.0),
corner_radius: 0.0,
clip_rect: None,
pointer_events: false,
focusable: false,
cursor: CursorIcon::Default,
scroll_metrics: None,
prepared_image: None,
prepared_text: None,
children: vec![LayoutNode {
@@ -217,9 +237,11 @@ mod tests {
element_id: Some(ElementId::new(1)),
rect: Rect::new(0.0, 0.0, 160.0, 120.0),
corner_radius: 0.0,
clip_rect: None,
pointer_events: true,
focusable: false,
cursor: CursorIcon::Default,
scroll_metrics: None,
prepared_image: None,
prepared_text: None,
children: vec![LayoutNode {
@@ -227,9 +249,11 @@ mod tests {
element_id: Some(ElementId::new(2)),
rect: Rect::new(16.0, 16.0, 80.0, 40.0),
corner_radius: 0.0,
clip_rect: None,
pointer_events: true,
focusable: false,
cursor: CursorIcon::Default,
scroll_metrics: None,
prepared_image: None,
prepared_text: None,
children: Vec::new(),
@@ -290,6 +314,35 @@ mod tests {
);
}
#[test]
fn router_routes_scroll_to_deepest_hover_target() {
let mut router = PointerRouter::new();
let tree = nested_interaction_tree();
let _ = router.route(
&tree,
PointerEvent::new(0, Point::new(24.0, 24.0), PointerEventKind::Move),
);
let routed = router.route(
&tree,
PointerEvent::new(
0,
Point::new(24.0, 24.0),
PointerEventKind::Scroll {
delta: Point::new(0.0, 18.0),
},
),
);
assert!(routed.iter().any(|event| {
event.kind
== RoutedPointerEventKind::Scroll {
delta: Point::new(0.0, 18.0),
}
&& event.target.element_id == Some(ElementId::new(2))
}));
}
#[test]
fn router_tracks_hovered_ancestors_for_nested_hits() {
let mut router = PointerRouter::new();