diff --git a/examples/testbed/full_ui.rs b/examples/testbed/full_ui.rs index b76d24b5cd2cd..04ad731e9bb83 100644 --- a/examples/testbed/full_ui.rs +++ b/examples/testbed/full_ui.rs @@ -9,6 +9,7 @@ use bevy::{ basic::LIME, css::{DARK_GRAY, NAVY}, }, + core_widgets::CoreScrollbar, input::mouse::{MouseScrollUnit, MouseWheel}, picking::hover::HoverMap, prelude::*, @@ -437,7 +438,7 @@ fn toggle_debug_overlay( pub fn update_scroll_position( mut mouse_wheel_events: EventReader, hover_map: Res, - mut scrolled_node_query: Query<&mut ScrollPosition>, + mut scrolled_node_query: Query<(&mut ScrollPosition, &ComputedNode), Without>, keyboard_input: Res>, ) { for mouse_wheel_event in mouse_wheel_events.read() { @@ -453,9 +454,17 @@ pub fn update_scroll_position( for (_pointer, pointer_map) in hover_map.iter() { for (entity, _hit) in pointer_map.iter() { - if let Ok(mut scroll_position) = scrolled_node_query.get_mut(*entity) { + if let Ok((mut scroll_position, scroll_content)) = + scrolled_node_query.get_mut(*entity) + { + let visible_size = scroll_content.size(); + let content_size = scroll_content.content_size(); + + let range = (content_size.y - visible_size.y).max(0.) + * scroll_content.inverse_scale_factor; + scroll_position.x -= dx; - scroll_position.y -= dy; + scroll_position.y = (scroll_position.y - dy).clamp(0., range); } } }