Path: blob/main/examples/ui/scroll_and_overflow/overflow_debug.rs
9331 views
//! Tests how different transforms behave when clipped with `Overflow::Hidden`12use bevy::{input::common_conditions::input_just_pressed, prelude::*, ui::widget::TextUiWriter};34use std::f32::consts::{FRAC_PI_2, PI, TAU};56const CONTAINER_SIZE: f32 = 150.0;7const LOOP_LENGTH: f32 = 4.0;89fn main() {10App::new()11.add_plugins(DefaultPlugins)12.init_resource::<AnimationState>()13.add_systems(Startup, setup)14.add_systems(15Update,16(17toggle_overflow.run_if(input_just_pressed(KeyCode::KeyO)),18next_container_size.run_if(input_just_pressed(KeyCode::KeyS)),19update_transform::<Move>,20update_transform::<Scale>,21update_transform::<Rotate>,22update_animation,23),24)25.run();26}2728#[derive(Component)]29struct Instructions;3031#[derive(Resource, Default)]32struct AnimationState {33playing: bool,34paused_at: f32,35paused_total: f32,36t: f32,37}3839#[derive(Component)]40struct Container(u8);4142trait UpdateTransform {43fn update(&self, t: f32, transform: &mut UiTransform);44}4546#[derive(Component)]47struct Move;4849impl UpdateTransform for Move {50fn update(&self, t: f32, transform: &mut UiTransform) {51transform.translation.x = percent(ops::sin(t * TAU - FRAC_PI_2) * 50.);52transform.translation.y = percent(-ops::cos(t * TAU - FRAC_PI_2) * 50.);53}54}5556#[derive(Component)]57struct Scale;5859impl UpdateTransform for Scale {60fn update(&self, t: f32, transform: &mut UiTransform) {61transform.scale.x = 1.0 + 0.5 * ops::cos(t * TAU).max(0.0);62transform.scale.y = 1.0 + 0.5 * ops::cos(t * TAU + PI).max(0.0);63}64}6566#[derive(Component)]67struct Rotate;6869impl UpdateTransform for Rotate {70fn update(&self, t: f32, transform: &mut UiTransform) {71transform.rotation = Rot2::radians(ops::cos(t * TAU) * 45.0);72}73}7475fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {76// Camera7778commands.spawn(Camera2d);7980// Instructions8182let text_font = TextFont::default();8384commands85.spawn((86Text::new(87"Next Overflow Setting (O)\nNext Container Size (S)\nToggle Animation (space)\n\n",88),89text_font.clone(),90Node {91position_type: PositionType::Absolute,92top: px(12),93left: px(12),94..default()95},96Instructions,97))98.with_child((99TextSpan::new(format!("{:?}", Overflow::clip())),100text_font.clone(),101));102103// Overflow Debug104105commands106.spawn(Node {107width: percent(100),108height: percent(100),109justify_content: JustifyContent::Center,110align_items: AlignItems::Center,111..default()112})113.with_children(|parent| {114parent115.spawn(Node {116display: Display::Grid,117grid_template_columns: RepeatedGridTrack::px(3, CONTAINER_SIZE),118grid_template_rows: RepeatedGridTrack::px(2, CONTAINER_SIZE),119row_gap: px(80),120column_gap: px(80),121..default()122})123.with_children(|parent| {124spawn_image(parent, &asset_server, Move);125spawn_image(parent, &asset_server, Scale);126spawn_image(parent, &asset_server, Rotate);127128spawn_text(parent, &asset_server, Move);129spawn_text(parent, &asset_server, Scale);130spawn_text(parent, &asset_server, Rotate);131});132});133}134135fn spawn_image(136parent: &mut ChildSpawnerCommands,137asset_server: &Res<AssetServer>,138update_transform: impl UpdateTransform + Component,139) {140spawn_container(parent, update_transform, |parent| {141parent.spawn((142ImageNode::new(asset_server.load("branding/bevy_logo_dark_big.png")),143Node {144height: px(100),145position_type: PositionType::Absolute,146top: px(-50),147left: px(-200),148..default()149},150));151});152}153154fn spawn_text(155parent: &mut ChildSpawnerCommands,156asset_server: &Res<AssetServer>,157update_transform: impl UpdateTransform + Component,158) {159spawn_container(parent, update_transform, |parent| {160parent.spawn((161Text::new("Bevy"),162TextFont {163font: asset_server.load("fonts/FiraSans-Bold.ttf").into(),164font_size: FontSize::Px(100.0),165..default()166},167));168});169}170171fn spawn_container(172parent: &mut ChildSpawnerCommands,173update_transform: impl UpdateTransform + Component,174spawn_children: impl FnOnce(&mut ChildSpawnerCommands),175) {176parent177.spawn((178Node {179width: percent(100),180height: percent(100),181align_items: AlignItems::Center,182justify_content: JustifyContent::Center,183overflow: Overflow::clip(),184..default()185},186BackgroundColor(Color::srgb(0.25, 0.25, 0.25)),187Container(0),188))189.with_children(|parent| {190parent191.spawn((192Node {193align_items: AlignItems::Center,194justify_content: JustifyContent::Center,195..default()196},197update_transform,198))199.with_children(spawn_children);200});201}202203fn update_animation(204mut animation: ResMut<AnimationState>,205time: Res<Time>,206keys: Res<ButtonInput<KeyCode>>,207) {208let delta = time.elapsed_secs();209210if keys.just_pressed(KeyCode::Space) {211animation.playing = !animation.playing;212213if !animation.playing {214animation.paused_at = delta;215} else {216animation.paused_total += delta - animation.paused_at;217}218}219220if animation.playing {221animation.t = (delta - animation.paused_total) % LOOP_LENGTH / LOOP_LENGTH;222}223}224225fn update_transform<T: UpdateTransform + Component>(226animation: Res<AnimationState>,227mut containers: Query<(&mut UiTransform, &T)>,228) {229for (mut transform, update_transform) in &mut containers {230update_transform.update(animation.t, &mut transform);231}232}233234fn toggle_overflow(235mut containers: Query<&mut Node, With<Container>>,236instructions: Single<Entity, With<Instructions>>,237mut writer: TextUiWriter,238) {239for mut node in &mut containers {240node.overflow = match node.overflow {241Overflow {242x: OverflowAxis::Visible,243y: OverflowAxis::Visible,244} => Overflow::clip_y(),245Overflow {246x: OverflowAxis::Visible,247y: OverflowAxis::Clip,248} => Overflow::clip_x(),249Overflow {250x: OverflowAxis::Clip,251y: OverflowAxis::Visible,252} => Overflow::clip(),253_ => Overflow::visible(),254};255256let entity = *instructions;257*writer.text(entity, 1) = format!("{:?}", node.overflow);258}259}260261fn next_container_size(mut containers: Query<(&mut Node, &mut Container)>) {262for (mut node, mut container) in &mut containers {263container.0 = (container.0 + 1) % 3;264265node.width = match container.0 {2662 => percent(30),267_ => percent(100),268};269node.height = match container.0 {2701 => percent(30),271_ => percent(100),272};273}274}275276277