diff --git a/.config/env.sh b/.config/env.sh index 94aa17c..6a30564 100644 --- a/.config/env.sh +++ b/.config/env.sh @@ -1,7 +1,6 @@ export CARGO_TERM_COLOR="always" export PYTHONUNBUFFERED=1 export RUSTC_WRAPPER="sccache" -export MISE_EXPERIMENTAL=1 if [[ -n "$SSH_CLIENT" ]]; then export FEATURES="" diff --git a/.config/mise.toml b/.config/mise.toml index 10e5b52..9406067 100644 --- a/.config/mise.toml +++ b/.config/mise.toml @@ -1,10 +1,3 @@ -experimental_monorepo_root = true - -[monorepo] -config_roots = [ - "crates/template/.config" -] - [env] _.source = ".config/env.sh" diff --git a/Cargo.lock b/Cargo.lock index 7d1d3c7..6eb56b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,6 +236,7 @@ dependencies = [ "anyhow", "avian3d", "bevy", + "bevy-inspector-egui", "bevy-tnua", "bevy-tnua-avian3d", "bevy_asset_loader", @@ -246,6 +247,7 @@ dependencies = [ "built", "clap", "itertools 0.14.0", + "q_cmd_prompt", "q_screens", "serde", "strum", diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 119ad01..d4074fb 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -33,6 +33,8 @@ clap = {version = "4.5.54", features = ["derive"] } # workspace q_screens = {path = "../screens", version= "^0.1.0" } +q_cmd_prompt = {path = "../cmd_prompt", version="^0.1.0"} +bevy-inspector-egui = "0.36.0" [build-dependencies] built = {version = "0.8.0", features=["chrono"]} diff --git a/crates/app/src/service/dev/console/mod.rs b/crates/app/src/service/dev/console/mod.rs new file mode 100644 index 0000000..6490296 --- /dev/null +++ b/crates/app/src/service/dev/console/mod.rs @@ -0,0 +1,14 @@ +mod commands; +mod ui; + +use crate::prelude::*; + +pub mod prelude { + pub use super::commands::*; + pub use super::ui::*; +} + +pub fn plugin(app: &mut App) { + app.add_plugins(q_cmd_prompt::ConsolePlugin); + app.add_plugins((ui::plugin, commands::plugin)); +} diff --git a/crates/app/src/service/dev/console/ui.rs b/crates/app/src/service/dev/console/ui.rs new file mode 100644 index 0000000..2a47e1f --- /dev/null +++ b/crates/app/src/service/dev/console/ui.rs @@ -0,0 +1,103 @@ +// add a bevy-ui based console wrapper here. +// open and close with ` + +use crate::prelude::*; +use bevy::input_focus::InputFocus; +use q_cmd_prompt::prelude::*; + +fn on_switch_screen( + trigger: On, + screens: Screens, + mut prompts: Query<&mut ConsolePrompt>, +) { + for mut prompt in &mut prompts { + let screen_name = screens.get_by_id(trigger.to).unwrap().name(); + prompt.0 = format!("<{screen_name}>\n> "); + } +} + +fn toggle_console( + keys: Res>, + mut focus: ResMut, + mut consoles: Query<(Entity, &mut Visibility), With>, +) { + if keys.just_pressed(KeyCode::Backquote) + && (keys.pressed(KeyCode::ControlLeft) || keys.pressed(KeyCode::ControlRight)) + { + for (id, mut visibility) in consoles.iter_mut() { + match *visibility { + Visibility::Hidden => { + *visibility = Visibility::Visible; + focus.set(id); + debug!("Opening and focusing dev console.") + } + Visibility::Visible => { + *visibility = Visibility::Hidden; + if let Some(focus_id) = focus.0 + && focus_id == id + { + focus.clear() + } + debug!("Closing dev console.") + } + _ => { + warn!("Got unsupported visibility: Inherited"); + } + } + } + } +} + +// this should really be an observer but AcquireFocus isn't publically accessible +fn on_focus( + focus: Res, + console: Query<&ConsoleUiSettings>, + mut commands: Commands, + mut last_focus: Local>, +) { + let focus_entity = focus.get(); + if *last_focus == focus_entity { + return; + } + if let Some(id) = focus_entity + && console.get(id).is_ok() + { + commands.entity(id).insert(ConsoleUiSettings { + font_color: LinearRgba::new(1., 1., 1., 1.).into(), + background_color: LinearRgba::new(0., 0., 0., 0.8).into(), + }); + } else if let Some(last_focus) = *last_focus { + commands.entity(last_focus).insert(ConsoleUiSettings { + font_color: LinearRgba::new(1., 1., 1., 0.5).into(), + background_color: LinearRgba::new(0., 0., 0., 0.4).into(), + }); + } + *last_focus = focus_entity; +} + +pub fn plugin(app: &mut App) { + app.add_observer(on_switch_screen); + app.add_systems(PostUpdate, (toggle_console, on_focus).chain()); + app.add_systems(Startup, |mut commands: Commands| { + // TODO: Dev overlay should be put into a more generalized editor mod + commands.spawn(( + Persistent, + Name::new("Dev overlay"), + Node { + width: vw(100), + height: vh(100), + ..Default::default() + }, + children![( + Name::new("Console wrapper"), + Node { + width: percent(100), + height: percent(33), + top: percent(67), + ..Default::default() + }, + children![(Name::new("Console"), Visibility::Hidden, Console,)], + )], + )); + }); +} diff --git a/crates/app/src/service/dev/mod.rs b/crates/app/src/service/dev/mod.rs index 9eb73c6..48d994d 100644 --- a/crates/app/src/service/dev/mod.rs +++ b/crates/app/src/service/dev/mod.rs @@ -1,11 +1,16 @@ +use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin}; + use crate::prelude::*; +mod console; mod gizmos; pub mod prelude { + pub use super::console::prelude::*; pub use super::gizmos::prelude::*; } pub fn plugin(app: &mut App) { - app.add_plugins(gizmos::plugin); + app.add_plugins((gizmos::plugin, console::plugin)); + app.add_plugins((EguiPlugin::default(), WorldInspectorPlugin::new())); } diff --git a/crates/screens/src/systems.rs b/crates/screens/src/systems.rs index 11061b0..acd57f2 100644 --- a/crates/screens/src/systems.rs +++ b/crates/screens/src/systems.rs @@ -145,7 +145,7 @@ pub(crate) fn initial_screen( screens: Screens, ) { if let Some(initial_screen) = (*initial_screen).as_ref() { - let info = screens.get_by_name(initial_screen).unwrap(); + let info = r!(screens.get_by_name(initial_screen)); commands.write_message(SwitchToScreenMsg(info.screen_id())); } }