diff options
Diffstat (limited to 'engine/src/ui')
| -rw-r--r-- | engine/src/ui/dear_imgui.rs | 13 | ||||
| -rw-r--r-- | engine/src/ui/view/world.rs | 182 |
2 files changed, 99 insertions, 96 deletions
diff --git a/engine/src/ui/dear_imgui.rs b/engine/src/ui/dear_imgui.rs index 0047394..b3a102b 100644 --- a/engine/src/ui/dear_imgui.rs +++ b/engine/src/ui/dear_imgui.rs @@ -9,7 +9,6 @@ use dear_imgui_rs::{ MouseButton as ImguiMouseButton, }; use ecs::component::local::Local; -use ecs::component::Component; use ecs::error::Context as _; use ecs::event::component::{Changed, EventMatchExt}; use ecs::pair::Pair; @@ -56,6 +55,7 @@ use crate::rendering::shader::{ }; use crate::rendering::{ AssetOrValue, + BackendProperties as RenderingBackendProperties, Command as RenderingCommand, DrawMeshOptions, DrawProperties, @@ -211,7 +211,7 @@ fn handle_window_changed( let Some(event_match) = observe .iter() - .find(|event_match| event_match.get_entity().has_component(TargetWindow::id())) + .find(|event_match| event_match.get_entity().has_component::<TargetWindow>()) else { return; }; @@ -244,6 +244,7 @@ fn update( mut assets: Single<Assets>, mut render_passes: Single<RenderPasses>, shader_context: Single<ShaderContext>, + rendering_backend_properties: Single<RenderingBackendProperties>, keyboard: Single<Keyboard>, mouse: Single<Mouse>, mouse_buttons: Single<MouseButtons>, @@ -261,6 +262,10 @@ fn update( let mouse = mouse.get()?; let mouse_buttons = mouse_buttons.get()?; + let Ok(rendering_backend_properties) = rendering_backend_properties.get() else { + return Ok(()); + }; + let Some((window, window_surface)) = target_window_query.iter().next() else { return Ok(()); }; @@ -302,6 +307,7 @@ fn update( context, render_passes, shader_context, + rendering_backend_properties, window_surface.id, shader_asset.clone(), mesh_obj_id, @@ -479,6 +485,7 @@ fn add_drawing_render_pass( context: &mut Context, render_passes: &mut RenderPasses, shader_context: &ShaderContext, + rendering_backend_properties: &RenderingBackendProperties, window_surface_id: SurfaceId, shader_asset: AssetHandle<ShaderModuleSource>, mesh_obj_id: RenderingObjectId, @@ -507,7 +514,7 @@ fn add_drawing_render_pass( let shader_cursor = ShaderCursor::new( shader_program - .reflection(0) + .reflection(rendering_backend_properties.shader_target_id) .unwrap() .global_params_var_layout() .unwrap(), diff --git a/engine/src/ui/view/world.rs b/engine/src/ui/view/world.rs index 411acd7..bf92859 100644 --- a/engine/src/ui/view/world.rs +++ b/engine/src/ui/view/world.rs @@ -4,15 +4,15 @@ use std::io::Cursor; use std::ops::{Deref, DerefMut}; use ecs::error::Context; +use ecs::phase::Phase; +use ecs::query::term::{With, Without}; +use ecs::sole::Is as IsSole; +use ecs::system::Function as SystemFunction; use crate::color::{Rgb, Rgba}; use crate::ecs::actions::Actions; use crate::ecs::component::local::Local; -use crate::ecs::component::{ - Handle as ComponentHandle, - Info as ComponentInfo, - Parts as ComponentParts, -}; +use crate::ecs::component::{Info as ComponentInfo, Parts as ComponentParts}; use crate::ecs::entity::{Handle as EntityHandle, Name as EntityName}; use crate::ecs::sole::Single; use crate::ecs::uid::Uid; @@ -47,7 +47,13 @@ pub struct State } pub fn show( - query: Query<()>, + non_sole_query: Query<( + Without<ComponentInfo>, + Without<Phase>, + Without<SystemFunction>, + Without<IsSole>, + )>, + sole_query: Query<(With<IsSole>,)>, mut dear_imgui_context: Single<DearImguiContext>, mut state: Local<State>, world: &World, @@ -84,7 +90,18 @@ pub fn show( frame.spacing(); frame.spacing(); - for ent_handle in &query.into_flexible_query() { + for ent_handle in &non_sole_query.into_flexible_query() { + create_entity_widgets( + frame, + popup_state, + icon_textures, + &ent_handle, + world, + &mut actions, + ); + } + + for ent_handle in &sole_query.into_flexible_query() { create_entity_widgets( frame, popup_state, @@ -169,18 +186,6 @@ fn create_entity_widgets( actions: &mut Actions, ) { - if ent_handle.component_ids().next().is_some() - && !ent_handle.component_ids().any(|comp_id| { - world.get_entity(comp_id).is_some_and(|comp_ent| { - comp_ent - .get::<ComponentInfo>() - .is_some_and(|comp_info| comp_info.type_reflection.is_some()) - }) - }) - { - return; - } - let ent_title = create_entity_title(ent_handle); let mut is_open = false; @@ -266,14 +271,6 @@ fn create_component_widgets( return; }; - let Some(component_type) = component_info.type_reflection else { - return; - }; - - let Some(mut component) = ent_handle.get_any_by_id_mut(component_id) else { - unreachable!(); - }; - { let _color_token = frame.push_style_color( dear_imgui_bindings::StyleColor::Button, @@ -301,42 +298,43 @@ fn create_component_widgets( frame.same_line(); - let mut component_changed = false; + frame.text(component_info.name); - create_item_title_widget( - frame, - component_info.name, - &ItemType::Reflected(component_type), - None, - ); + if let Some(component_type) = component_info.type_reflection { + let item_type = ItemType::Reflected(component_type); - let item_type = ItemType::Reflected(component_type); + let _token = item_type.indent_or_same_line(frame); - let _token = item_type.indent_or_same_line(frame); + let Some(mut component) = ent_handle.get_any_by_id_mut(component_id) else { + unreachable!(); + }; - add_item_to_frame( - frame, - ItemRef::Mutable(&mut *component), - &mut component_changed, - ItemInfo { - title: component_info.name, - tag: &format!( - "world_view_entity_{}_component_{}", - ent_handle.uid(), - component_info.name, - ), - type_name: None, - ty: item_type, - is_read_only: false, - }, - &[], - ); + let mut component_changed = false; - frame.spacing(); + add_item_to_frame( + frame, + ItemRef::Mutable(&mut *component), + &mut component_changed, + ItemInfo { + title: component_info.name, + tag: &format!( + "world_view_entity_{}_component_{}", + ent_handle.uid(), + component_info.name, + ), + type_name: None, + ty: item_type, + is_read_only: false, + }, + &[], + ); - if component_changed { - component.set_changed(); + if component_changed { + component.set_changed(); + } } + + frame.spacing(); } fn create_pair_component_widgets( @@ -375,22 +373,8 @@ fn create_pair_component_widgets( frame.same_line(); - let relation_comp_info_or_ent_name = - get_comp_info_or_ent_name(world, pair_id.relation()); - - let relation_name: Cow<'_, str> = match &relation_comp_info_or_ent_name { - Some(Either::A(comp_info)) => comp_info.name.into(), - Some(Either::B(ent_name)) => format!("🌐 {}", ent_name.name).into(), - None => format!("<unnamed> {}", pair_id.relation()).into(), - }; - - let target_comp_info_or_ent_name = get_comp_info_or_ent_name(world, pair_id.target()); - - let target_name: Cow<'_, str> = match &target_comp_info_or_ent_name { - Some(Either::A(comp_info)) => comp_info.name.into(), - Some(Either::B(ent_name)) => format!("🌐 {}", ent_name.name).into(), - None => format!("<unnamed> {}", pair_id.target()).into(), - }; + let relation_name = get_comp_name_or_ent_name(world, pair_id.relation()); + let target_name = get_comp_name_or_ent_name(world, pair_id.target()); // TODO: Make relation & target ids editable @@ -402,15 +386,14 @@ fn create_pair_component_widgets( let pair_data_ty_id = (*pair_data).type_id(); - let Some(pair_data_comp_info) = [ - &relation_comp_info_or_ent_name, - &target_comp_info_or_ent_name, - ] - .map(Option::as_ref) - .map(|item| item.and_then(Either::as_a)) - .into_iter() - .flatten() - .find(|comp_info| comp_info.ty_id == pair_data_ty_id) else { + let pair_member_comp_infos = [pair_id.relation(), pair_id.target()] + .map(|member_id| world.get_entity(member_id)?.get::<ComponentInfo>()); + + let Some(pair_data_comp_info) = pair_member_comp_infos + .into_iter() + .filter_map(std::convert::identity) + .find(|comp_info| comp_info.ty_id == pair_data_ty_id) + else { return; }; @@ -465,22 +448,21 @@ fn create_pair_component_widgets( // pairs as event targets } -fn get_comp_info_or_ent_name( - world: &World, - id: Uid, -) -> Option<Either<ComponentHandle<'_, ComponentInfo>, ComponentHandle<'_, EntityName>>> +fn get_comp_name_or_ent_name(world: &World, id: Uid) -> Cow<'static, str> { - let ent = world.get_entity(id)?; + let Some(ent) = world.get_entity(id) else { + return format!("<unnamed> {id}").into(); + }; if let Some(component_info) = ent.get::<ComponentInfo>() { - return Some(Either::A(component_info)); + return component_info.name.into(); } if let Some(entity_name) = ent.get::<EntityName>() { - return Some(Either::B(entity_name)); + return format!("🌐 {}", entity_name.name).into(); } - None + format!("🌐 <unnamed> {id}").into() } fn create_add_component_button_widget( @@ -506,10 +488,24 @@ fn create_add_component_button_widget( [90.0, 162.0, 51.0, 255.0].map(|num| num / 255.0), ); - let is_button_clicked = frame.button(format!( - "+##add_component_to_entity_button_{}", - ent_handle.uid() - )); + let ent_is_sole = ent_handle.has_component::<IsSole>(); + + let is_button_clicked = { + let _disabled_token = frame.begin_disabled_with_cond(ent_is_sole); + + frame.button(format!( + "+##add_component_to_entity_button_{}", + ent_handle.uid() + )) + }; + + if ent_is_sole { + if frame.is_item_hovered_with_flags( + dear_imgui_bindings::ItemHoveredFlags::ALLOW_WHEN_DISABLED, + ) { + frame.tooltip_text("Cannot add a component to the entity of a sole"); + } + } if is_button_clicked { enter_add_component_popup_state(popup_state, ent_handle, ent_title, world); |
