From 1d4910a1e3280ea4cc175c2ec2b4a8a6108a4d74 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Tue, 14 Mar 2023 23:50:37 -0700 Subject: [PATCH] Fix scrolling in UI example (#8069) Co-authored-by: Carter Anderson --- examples/ui/ui.rs | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/examples/ui/ui.rs b/examples/ui/ui.rs index 827a75aa198ae..647299048e13a 100644 --- a/examples/ui/ui.rs +++ b/examples/ui/ui.rs @@ -124,7 +124,6 @@ fn setup(mut commands: Commands, asset_server: Res) { NodeBundle { style: Style { flex_direction: FlexDirection::Column, - flex_grow: 1.0, align_items: AlignItems::Center, ..default() }, @@ -145,12 +144,7 @@ fn setup(mut commands: Commands, asset_server: Res) { font_size: 20., color: Color::WHITE, }, - ) - .with_style(Style { - flex_shrink: 0., - size: Size::height(Val::Px(20.)), - ..default() - }), + ), Label, AccessibilityNode(NodeBuilder::new(Role::ListItem)), )); @@ -291,21 +285,21 @@ struct ScrollingList { fn mouse_scroll( mut mouse_wheel_events: EventReader, - mut query_list: Query<(&mut ScrollingList, &mut Style, &Children, &Node)>, - query_item: Query<&Node>, + mut query_list: Query<(&mut ScrollingList, &mut Style, &Parent, &Node)>, + query_node: Query<&Node>, ) { for mouse_wheel_event in mouse_wheel_events.iter() { - for (mut scrolling_list, mut style, children, uinode) in &mut query_list { - let items_height: f32 = children - .iter() - .map(|entity| query_item.get(*entity).unwrap().size().y) - .sum(); - let panel_height = uinode.size().y; - let max_scroll = (items_height - panel_height).max(0.); + for (mut scrolling_list, mut style, parent, list_node) in &mut query_list { + let items_height = list_node.size().y; + let container_height = query_node.get(parent.get()).unwrap().size().y; + + let max_scroll = (items_height - container_height).max(0.); + let dy = match mouse_wheel_event.unit { MouseScrollUnit::Line => mouse_wheel_event.y * 20., MouseScrollUnit::Pixel => mouse_wheel_event.y, }; + scrolling_list.position += dy; scrolling_list.position = scrolling_list.position.clamp(-max_scroll, 0.); style.top = Val::Px(scrolling_list.position);