Scroll box example
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user