From 2e0e055b5d7614cb207897bbc423ea0fee7eef41 Mon Sep 17 00:00:00 2001 From: Julia Naomi Date: Mon, 1 Jan 2024 16:17:39 -0600 Subject: [PATCH 1/2] Simple assets inspector --- Cargo.toml | 1 - crates/editor_ui/src/editor_tab.rs | 7 ++- crates/editor_ui/src/inspector/assets.rs | 71 ++++++++++++++++++++++++ crates/editor_ui/src/inspector/mod.rs | 3 + 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 crates/editor_ui/src/inspector/assets.rs diff --git a/Cargo.toml b/Cargo.toml index 23e4b7ee..c5de30b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,6 @@ space_prefab = {workspace = true, version = "0.3.1" } # Modules for external crates space_bevy_xpbd_plugin = {version = "0.3.1", workspace = true, optional = true } - # For versions 1.74+ [lints.rust] future-incompatible = "warn" diff --git a/crates/editor_ui/src/editor_tab.rs b/crates/editor_ui/src/editor_tab.rs index 736501ed..26207d7f 100644 --- a/crates/editor_ui/src/editor_tab.rs +++ b/crates/editor_ui/src/editor_tab.rs @@ -12,13 +12,14 @@ pub trait EditorTab { #[derive(Clone, Hash, PartialEq, Eq, Debug, PartialOrd, Ord)] pub enum EditorTabName { - Hierarchy, - GameView, + Assets, CameraView, + GameView, + Hierarchy, Inspector, Resource, - ToolBox, Settings, + ToolBox, Other(String), } diff --git a/crates/editor_ui/src/inspector/assets.rs b/crates/editor_ui/src/inspector/assets.rs new file mode 100644 index 00000000..9afa8eab --- /dev/null +++ b/crates/editor_ui/src/inspector/assets.rs @@ -0,0 +1,71 @@ +use bevy::{asset::ReflectAsset, prelude::*, utils::HashMap}; + +use bevy_egui::*; +use space_shared::ext::bevy_inspector_egui; + +use crate::prelude::*; + +#[derive(Resource, Default)] +pub struct AssetsTab { + open_assets: HashMap, +} + +impl EditorTab for AssetsTab { + fn ui(&mut self, ui: &mut egui::Ui, _: &mut Commands, world: &mut World) { + inspect(ui, world, &mut self.open_assets); + } + + fn title(&self) -> egui::WidgetText { + "Assets".into() + } +} + +pub fn inspect(ui: &mut egui::Ui, world: &mut World, open_assets: &mut HashMap) { + let type_registry = world.resource::().clone(); + let type_registry = type_registry.read(); + + let mut assets: Vec<_> = type_registry + .iter() + .filter_map(|registration| { + let reflect_asset = registration.data::()?; + Some(( + registration + .type_info() + .type_path_table() + .short_path() + .to_string(), + registration.type_id(), + reflect_asset + .ids(world) + .find(|id| id.type_id() == registration.type_id())?, + )) + }) + .collect(); + assets.sort_by(|(name_a, _, _), (name_b, _, _)| name_a.cmp(name_b)); + + egui::Grid::new("Assets ID".to_string()).show(ui, |ui| { + for (asset_name, type_id, handle) in assets { + ui.push_id(format!("{:?}-{}", &type_id, &asset_name), |ui| { + let header = egui::CollapsingHeader::new(asset_name.clone()) + .default_open(*open_assets.get(&asset_name).unwrap_or(&false)) + .show(ui, |ui| { + ui.push_id(format!("content-{:?}-{}", &type_id, &asset_name), |ui| { + bevy_inspector_egui::bevy_inspector::by_type_id::ui_for_asset( + world, + type_id, + handle, + ui, + &type_registry, + ); + }); + }); + if header.header_response.clicked() { + let open_name = open_assets.entry(asset_name.clone()).or_default(); + //At click header not opened simultaneously so its need to check percent of opened + *open_name = header.openness < 0.5; + } + }); + ui.end_row(); + } + }); +} diff --git a/crates/editor_ui/src/inspector/mod.rs b/crates/editor_ui/src/inspector/mod.rs index fbefeb87..28d15694 100644 --- a/crates/editor_ui/src/inspector/mod.rs +++ b/crates/editor_ui/src/inspector/mod.rs @@ -1,3 +1,4 @@ +pub mod assets; pub mod components_order; pub mod refl_impl; pub mod resources; @@ -21,6 +22,7 @@ use space_shared::ext::bevy_inspector_egui::{ }; use self::{ + assets::AssetsTab, components_order::{ComponentsOrder, ComponentsPriority}, refl_impl::{entity_ref_ui, entity_ref_ui_readonly, many_unimplemented}, resources::ResourceTab, @@ -48,6 +50,7 @@ impl Plugin for SpaceInspectorPlugin { app.editor_tab_by_trait(EditorTabName::Inspector, InspectorTab::default()); app.editor_tab_by_trait(EditorTabName::Resource, ResourceTab::default()); + app.editor_tab_by_trait(EditorTabName::Assets, AssetsTab::default()); app.add_systems(Update, execute_inspect_command); From 5972c99f343534ff786b9afa6a7715ea6e941485 Mon Sep 17 00:00:00 2001 From: Julia Naomi Date: Mon, 1 Jan 2024 23:45:39 -0600 Subject: [PATCH 2/2] Change tab name --- crates/editor_ui/Cargo.toml | 1 + crates/editor_ui/src/editor_tab.rs | 7 +++++-- crates/editor_ui/src/inspector/mod.rs | 6 +++--- .../src/inspector/{assets.rs => runtime_assets.rs} | 6 +++--- 4 files changed, 12 insertions(+), 8 deletions(-) rename crates/editor_ui/src/inspector/{assets.rs => runtime_assets.rs} (96%) diff --git a/crates/editor_ui/Cargo.toml b/crates/editor_ui/Cargo.toml index 3c3c428d..b7a02ef1 100644 --- a/crates/editor_ui/Cargo.toml +++ b/crates/editor_ui/Cargo.toml @@ -33,3 +33,4 @@ bevy_mod_picking = { version = "0.17", default-features = false, features = [ ] } bevy_panorbit_camera = "0.9" pretty-type-name = "1.0.1" +convert_case = "0.6" \ No newline at end of file diff --git a/crates/editor_ui/src/editor_tab.rs b/crates/editor_ui/src/editor_tab.rs index 26207d7f..94fd8db4 100644 --- a/crates/editor_ui/src/editor_tab.rs +++ b/crates/editor_ui/src/editor_tab.rs @@ -2,6 +2,7 @@ use bevy::{prelude::*, utils::HashMap}; use bevy_egui::egui::{self, WidgetText}; +use convert_case::{Case, Casing}; use super::{EditorUiRef, EditorUiReg}; @@ -12,12 +13,12 @@ pub trait EditorTab { #[derive(Clone, Hash, PartialEq, Eq, Debug, PartialOrd, Ord)] pub enum EditorTabName { - Assets, CameraView, GameView, Hierarchy, Inspector, Resource, + RuntimeAssets, Settings, ToolBox, Other(String), @@ -115,7 +116,9 @@ impl<'a, 'w, 's> egui_dock::TabViewer for EditorTabViewer<'a, 'w, 's> { if let EditorTabName::Other(name) = registry.0 { format_name = name.clone(); } else { - format_name = format!("{:?}", registry.0); + format_name = format!("{:?}", registry.0) + .from_case(Case::Pascal) + .to_case(Case::Title); } if ui.button(format_name).clicked() { diff --git a/crates/editor_ui/src/inspector/mod.rs b/crates/editor_ui/src/inspector/mod.rs index 28d15694..b311af97 100644 --- a/crates/editor_ui/src/inspector/mod.rs +++ b/crates/editor_ui/src/inspector/mod.rs @@ -1,7 +1,7 @@ -pub mod assets; pub mod components_order; pub mod refl_impl; pub mod resources; +pub mod runtime_assets; use std::any::TypeId; @@ -22,10 +22,10 @@ use space_shared::ext::bevy_inspector_egui::{ }; use self::{ - assets::AssetsTab, components_order::{ComponentsOrder, ComponentsPriority}, refl_impl::{entity_ref_ui, entity_ref_ui_readonly, many_unimplemented}, resources::ResourceTab, + runtime_assets::RuntimeAssetsTab, }; use super::{ @@ -50,7 +50,7 @@ impl Plugin for SpaceInspectorPlugin { app.editor_tab_by_trait(EditorTabName::Inspector, InspectorTab::default()); app.editor_tab_by_trait(EditorTabName::Resource, ResourceTab::default()); - app.editor_tab_by_trait(EditorTabName::Assets, AssetsTab::default()); + app.editor_tab_by_trait(EditorTabName::RuntimeAssets, RuntimeAssetsTab::default()); app.add_systems(Update, execute_inspect_command); diff --git a/crates/editor_ui/src/inspector/assets.rs b/crates/editor_ui/src/inspector/runtime_assets.rs similarity index 96% rename from crates/editor_ui/src/inspector/assets.rs rename to crates/editor_ui/src/inspector/runtime_assets.rs index 9afa8eab..99b331e8 100644 --- a/crates/editor_ui/src/inspector/assets.rs +++ b/crates/editor_ui/src/inspector/runtime_assets.rs @@ -6,17 +6,17 @@ use space_shared::ext::bevy_inspector_egui; use crate::prelude::*; #[derive(Resource, Default)] -pub struct AssetsTab { +pub struct RuntimeAssetsTab { open_assets: HashMap, } -impl EditorTab for AssetsTab { +impl EditorTab for RuntimeAssetsTab { fn ui(&mut self, ui: &mut egui::Ui, _: &mut Commands, world: &mut World) { inspect(ui, world, &mut self.open_assets); } fn title(&self) -> egui::WidgetText { - "Assets".into() + "Runtime Assets".into() } }