diff --git a/examples/testbed/2d.rs b/examples/testbed/2d.rs index 1751e0f152a2f..c30f6a6a6ee7d 100644 --- a/examples/testbed/2d.rs +++ b/examples/testbed/2d.rs @@ -4,13 +4,22 @@ mod helpers; +use argh::FromArgs; use bevy::prelude::*; use helpers::Next; +#[derive(FromArgs)] +/// 2d testbed +pub struct Args { + #[argh(positional)] + scene: Option, +} + fn main() { + let args: Args = argh::from_env(); + let mut app = App::new(); app.add_plugins((DefaultPlugins,)) - .init_state::() .add_systems(OnEnter(Scene::Shapes), shapes::setup) .add_systems(OnEnter(Scene::Bloom), bloom::setup) .add_systems(OnEnter(Scene::Text), text::setup) @@ -20,6 +29,11 @@ fn main() { .add_systems(Update, switch_scene) .add_systems(Update, gizmos::draw_gizmos.run_if(in_state(Scene::Gizmos))); + match args.scene { + None => app.init_state::(), + Some(scene) => app.insert_state(scene), + }; + #[cfg(feature = "bevy_ci_testing")] app.add_systems(Update, helpers::switch_scene_in_ci::); @@ -37,6 +51,34 @@ enum Scene { Gizmos, } +impl std::str::FromStr for Scene { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "shapes" => Ok(Scene::Shapes), + "bloom" => Ok(Scene::Bloom), + "text" => Ok(Scene::Text), + "sprite" => Ok(Scene::Sprite), + "spriteslicing" => Ok(Scene::SpriteSlicing), + "gizmos" => Ok(Scene::Gizmos), + _ => Err(format!( + "Scene '{}' doesn't exist. Available scenes:\n\t{}", + s, + [ + "Shapes", + "Bloom", + "Text", + "Sprite", + "SpriteSlicing", + "Gizmos" + ] + .join("\n\t") + )), + } + } +} + impl Next for Scene { fn next(&self) -> Self { match self { diff --git a/examples/testbed/3d.rs b/examples/testbed/3d.rs index 64183894865e0..c84ac5f242530 100644 --- a/examples/testbed/3d.rs +++ b/examples/testbed/3d.rs @@ -4,13 +4,22 @@ mod helpers; +use argh::FromArgs; use bevy::prelude::*; use helpers::Next; +#[derive(FromArgs)] +/// 3d testbed +pub struct Args { + #[argh(positional)] + scene: Option, +} + fn main() { + let args: Args = argh::from_env(); + let mut app = App::new(); app.add_plugins((DefaultPlugins,)) - .init_state::() .add_systems(OnEnter(Scene::Light), light::setup) .add_systems(OnEnter(Scene::Bloom), bloom::setup) .add_systems(OnEnter(Scene::Gltf), gltf::setup) @@ -28,6 +37,11 @@ fn main() { .run_if(in_state(Scene::GltfCoordinateConversion)), ); + match args.scene { + None => app.init_state::(), + Some(scene) => app.insert_state(scene), + }; + #[cfg(feature = "bevy_ci_testing")] app.add_systems(Update, helpers::switch_scene_in_ci::); @@ -45,6 +59,34 @@ enum Scene { GltfCoordinateConversion, } +impl std::str::FromStr for Scene { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "light" => Ok(Scene::Light), + "bloom" => Ok(Scene::Bloom), + "gltf" => Ok(Scene::Gltf), + "animation" => Ok(Scene::Animation), + "gizmos" => Ok(Scene::Gizmos), + "gltfcoordinateconversion" => Ok(Scene::GltfCoordinateConversion), + _ => Err(format!( + "Scene '{}' doesn't exist. Available scenes:\n\t{}", + s, + [ + "Light", + "Bloom", + "Gltf", + "Animation", + "Gizmos", + "GltfCoordinateConversion" + ] + .join("\n\t") + )), + } + } +} + impl Next for Scene { fn next(&self) -> Self { match self { diff --git a/examples/testbed/ui.rs b/examples/testbed/ui.rs index edba5ce0803bc..f9ab140152cd1 100644 --- a/examples/testbed/ui.rs +++ b/examples/testbed/ui.rs @@ -4,10 +4,20 @@ mod helpers; +use argh::FromArgs; use bevy::prelude::*; use helpers::Next; +#[derive(FromArgs)] +/// ui testbed +pub struct Args { + #[argh(positional)] + scene: Option, +} + fn main() { + let args: Args = argh::from_env(); + let mut app = App::new(); app.add_plugins(DefaultPlugins.set(WindowPlugin { primary_window: Some(Window { @@ -19,7 +29,6 @@ fn main() { }), ..Default::default() })) - .init_state::() .add_systems(OnEnter(Scene::Image), image::setup) .add_systems(OnEnter(Scene::Text), text::setup) .add_systems(OnEnter(Scene::Grid), grid::setup) @@ -35,6 +44,11 @@ fn main() { .add_systems(OnEnter(Scene::ViewportCoords), viewport_coords::setup) .add_systems(Update, switch_scene); + match args.scene { + None => app.init_state::(), + Some(scene) => app.insert_state(scene), + }; + #[cfg(feature = "bevy_ui_debug")] { app.add_systems(OnEnter(Scene::DebugOutlines), debug_outlines::setup); @@ -68,6 +82,52 @@ enum Scene { ViewportCoords, } +impl std::str::FromStr for Scene { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "image" => Ok(Scene::Image), + "text" => Ok(Scene::Text), + "grid" => Ok(Scene::Grid), + "borders" => Ok(Scene::Borders), + "boxshadow" => Ok(Scene::BoxShadow), + "textwrap" => Ok(Scene::TextWrap), + "overflow" => Ok(Scene::Overflow), + "slice" => Ok(Scene::Slice), + "layoutrounding" => Ok(Scene::LayoutRounding), + "lineargradient" => Ok(Scene::LinearGradient), + "radialgradient" => Ok(Scene::RadialGradient), + "transformations" => Ok(Scene::Transformations), + #[cfg(feature = "bevy_ui_debug")] + "debugoutlines" => Ok(Scene::DebugOutlines), + "viewportcoords" => Ok(Scene::ViewportCoords), + _ => Err(format!( + "Scene '{}' doesn't exist. Available scenes:\n\t{}", + s, + [ + "Image", + "Text", + "Grid", + "Borders", + "BoxShadow", + "TextWrap", + "Overflow", + "Slice", + "LayoutRounding", + "LinearGradient", + "RadialGradient", + "Transformations", + #[cfg(feature = "bevy_ui_debug")] + "DebugOutlines", + "ViewportCoords", + ] + .join("\n\t") + )), + } + } +} + impl Next for Scene { fn next(&self) -> Self { match self {