Path: blob/main/examples/ui/scroll_and_overflow/drag_to_scroll.rs
9353 views
//! This example tests scale factor, dragging and scrolling12use bevy::color::palettes::css::RED;3use bevy::prelude::*;45#[derive(Component)]6struct ScrollableNode;78#[derive(Component)]9struct TileColor(Color);1011fn main() {12App::new()13.add_plugins(DefaultPlugins)14.add_systems(Startup, setup)15.run();16}1718#[derive(Component)]19struct ScrollStart(Vec2);2021fn setup(mut commands: Commands) {22let w = 60;23let h = 40;2425commands.spawn(Camera2d);26commands.insert_resource(UiScale(0.5));2728commands29.spawn((30Node {31width: percent(100),32height: percent(100),33overflow: Overflow::scroll(),34..Default::default()35},36ScrollPosition(Vec2::ZERO),37ScrollableNode,38ScrollStart(Vec2::ZERO),39))40.observe(41|drag: On<Pointer<Drag>>,42ui_scale: Res<UiScale>,43mut scroll_position_query: Query<44(&mut ScrollPosition, &ScrollStart),45With<ScrollableNode>,46>| {47if let Ok((mut scroll_position, start)) = scroll_position_query.single_mut() {48scroll_position.0 = (start.0 - drag.distance / ui_scale.0).max(Vec2::ZERO);49}50},51)52.observe(53|_: On<Pointer<DragStart>>,54mut scroll_position_query: Query<55(&ComputedNode, &mut ScrollStart),56With<ScrollableNode>,57>| {58if let Ok((computed_node, mut start)) = scroll_position_query.single_mut() {59start.0 = computed_node.scroll_position * computed_node.inverse_scale_factor;60}61},62)63.with_children(|commands| {64commands65.spawn((66Node {67display: Display::Grid,68grid_template_rows: RepeatedGridTrack::px(w as i32, 100.),69grid_template_columns: RepeatedGridTrack::px(h as i32, 100.),70..default()71},72Pickable {73is_hoverable: false,74should_block_lower: true,75}76))77.with_children(|commands| {78for y in 0..h {79for x in 0..w {80let tile_color = if (x + y) % 2 == 1 {81let hue = ((x as f32 / w as f32) * 270.0)82+ ((y as f32 / h as f32) * 90.0);83Color::hsl(hue, 1., 0.5)84} else {85Color::BLACK86};87commands.spawn((88Node {89grid_row: GridPlacement::start(y + 1),90grid_column: GridPlacement::start(x + 1),91..default()92},93Pickable {94should_block_lower: false,95is_hoverable: true,96},97TileColor(tile_color),98BackgroundColor(tile_color),99))100.observe(|over: On<Pointer<Over>>, mut query: Query<&mut BackgroundColor>,| {101if let Ok(mut background_color) = query.get_mut(over.entity) {102background_color.0 = RED.into();103}104})105.observe(|out: On<Pointer<Out>>, mut query: Query<(&mut BackgroundColor, &TileColor)>| {106if let Ok((mut background_color, tile_color)) = query.get_mut(out.entity) {107background_color.0 = tile_color.0;108}109});110}111}112});113});114}115116117