use bevy::{input::mouse::MouseWheel, prelude::*}; fn main() { App::new() .add_plugins(DefaultPlugins.set(WindowPlugin { primary_window: Some(Window { title: "UI WTF".into(), resolution: (640., 480.).into(), ..default() }), ..default() })) // Only run when window is active to reduce cpu cycles // .insert_resource(WinitSettings::desktop_app()) .add_startup_system(init) .add_system(scroll) .run(); } #[derive(Component)] struct ScrollingList; fn init(mut commands: Commands) { info!("Spawning camera"); commands.spawn(Camera2dBundle { ..default() }); info!("Initializing UI"); commands .spawn(NodeBundle { background_color: BackgroundColor(Color::WHITE), style: Style { justify_content: JustifyContent::Center, size: Size::all(Val::Percent(90.0)), overflow: Overflow::Hidden, ..default() }, ..default() }) .with_children(|parent| { parent .spawn(( NodeBundle { background_color: BackgroundColor(Color::OLIVE), style: Style { flex_wrap: FlexWrap::Wrap, flex_direction: FlexDirection::Row, justify_content: JustifyContent::SpaceAround, size: Size::AUTO, max_size: Size::UNDEFINED, ..default() }, ..default() }, ScrollingList, )) .with_children(|parent| { info!("Initializing Child Element"); let colors = [ Color::ORANGE, Color::BLUE, Color::GREEN, Color::SALMON, Color::SEA_GREEN, Color::MAROON, Color::ORANGE, Color::BLUE, Color::GREEN, Color::SALMON, Color::SEA_GREEN, Color::MAROON, ]; for i in 0..12 { parent.spawn(NodeBundle { background_color: BackgroundColor(colors[i]), style: Style { size: Size::all(Val::Px(256.0)), padding: UiRect::all(Val::Px(5.0)), ..default() }, ..default() }); } }); }); } fn scroll( mut scroll_evr: EventReader, mut query: Query<&mut Style, With>, ) { for ev in scroll_evr.iter() { for mut s in query.iter_mut() { s.position.top = match s.position.top { Val::Px(current) => Val::Px(current + (ev.y * 5.0)), _ => Val::Px(0.0), }; } } }