From 197b8e13dc070c9bee72ceda3d21ae1561a5a69a Mon Sep 17 00:00:00 2001 From: HampusM Date: Thu, 20 Aug 2026 17:40:59 +0200 Subject: feat(engine): flatten single unnamed enum fields in world ui view --- engine/src/ui/view/world.rs | 127 +++++++++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 54 deletions(-) (limited to 'engine') diff --git a/engine/src/ui/view/world.rs b/engine/src/ui/view/world.rs index 3ea0611..335756f 100644 --- a/engine/src/ui/view/world.rs +++ b/engine/src/ui/view/world.rs @@ -339,6 +339,10 @@ fn create_component_widgets( None, ); + let item_type = ItemType::Reflected(component_type); + + let _token = item_type.indent_or_same_line(frame); + add_item_to_frame( frame, ItemRef::Mutable(&mut *component), @@ -351,7 +355,7 @@ fn create_component_widgets( component_info.name, ), item_type_name: None, - item_type: ItemType::Reflected(component_type), + item_type, item_is_read_only: false, }, &[], @@ -454,7 +458,7 @@ fn create_pair_component_widgets( return; }; - frame.indent(); + let _indent = frame.begin_indent(); let mut component_changed = false; @@ -465,6 +469,10 @@ fn create_pair_component_widgets( None, ); + let item_type = ItemType::Reflected(pair_data_ty); + + let _token = item_type.indent_or_same_line(frame); + add_item_to_frame( frame, ItemRef::Mutable(&mut *pair_data), @@ -476,14 +484,12 @@ fn create_pair_component_widgets( ent_handle.uid(), ), item_type_name: None, - item_type: ItemType::Reflected(pair_data_ty), + item_type, item_is_read_only: false, }, &[], ); - frame.unindent(); - // The pair component is not set as changed here since events do not support // pairs as event targets } @@ -747,6 +753,10 @@ fn show_add_component_popup( None, ); + let item_type = ItemType::Reflected(new_component_type); + + let _token = item_type.indent_or_same_line(frame); + add_item_to_frame( frame, ItemRef::Mutable(&mut **new_component), @@ -758,7 +768,7 @@ fn show_add_component_popup( new_component_info.name, ), item_type_name: None, - item_type: ItemType::Reflected(new_component_type), + item_type, item_is_read_only: false, }, &[], @@ -845,15 +855,30 @@ impl ItemType | TypeReflection::Array(_) | TypeReflection::Slice(_), ) => true, - Self::Reflected(TypeReflection::Enum(enum_ty)) if !enum_ty.is_unit_only => { - true - } + Self::Reflected(TypeReflection::Enum(enum_ty)) => !enum_ty.is_unit_only, Self::Reflected(TypeReflection::Reference(ref_ty)) => { ItemType::Reflected(ref_ty.ty).spans_multiple_rows() } - _ => false, + Self::Reflected(TypeReflection::Literal(_)) | Self::String | Self::CowStr => { + false + } + Self::Reflected(_) => unimplemented!(), } } + + fn indent_or_same_line<'frame>( + &self, + frame: &'frame dear_imgui_bindings::Ui, + ) -> Option> + { + if self.spans_multiple_rows() { + return Some(frame.begin_indent()); + } + + frame.same_line(); + + None + } } fn get_item_type(ty: Option<&'static TypeReflection>, type_id: TypeId) @@ -968,8 +993,6 @@ fn add_item_to_frame<'a>( match item_type { ItemType::Reflected(TypeReflection::Struct(struct_ty)) => { - frame.indent(); - create_struct_widgets( frame, &mut item, @@ -979,16 +1002,8 @@ fn add_item_to_frame<'a>( struct_ty, prev_item_tags, ); - - frame.unindent(); } ItemType::Reflected(TypeReflection::Enum(enum_type)) => { - if enum_type.is_unit_only { - frame.same_line(); - } else { - frame.indent(); - } - create_enum_widgets( frame, &mut item, @@ -998,14 +1013,8 @@ fn add_item_to_frame<'a>( enum_type, prev_item_tags, ); - - if !enum_type.is_unit_only { - frame.unindent(); - } } ItemType::Reflected(TypeReflection::Literal(literal_reflection)) => { - frame.same_line(); - match literal_reflection.ty { LiteralType::U8 => create_scalar_item_input::( frame, @@ -1182,8 +1191,6 @@ fn add_item_to_frame<'a>( } } ItemType::Reflected(TypeReflection::Array(array_type)) => { - frame.indent(); - let mut prev_item_tags = prev_item_tags.to_vec(); prev_item_tags.push(item_tag); @@ -1211,6 +1218,10 @@ fn add_item_to_frame<'a>( Some(array_type.item_type_name()), ); + let array_item_type = ItemType::Reflected(array_type.item_type); + + let _token = array_item_type.indent_or_same_line(frame); + add_item_to_frame( frame, item_item, @@ -1219,18 +1230,14 @@ fn add_item_to_frame<'a>( item_title: array_item_name.as_ref(), item_tag: array_item_name.as_ref(), item_type_name: Some(array_type.item_type_name()), - item_type: ItemType::Reflected(array_type.item_type), + item_type: array_item_type, item_is_read_only, }, &prev_item_tags, ); } - - frame.unindent(); } ItemType::Reflected(TypeReflection::Slice(slice_type)) => { - frame.indent(); - let mut prev_item_tags = prev_item_tags.to_vec(); prev_item_tags.push(item_tag); @@ -1256,6 +1263,10 @@ fn add_item_to_frame<'a>( Some(slice_type.item_type_name()), ); + let slice_item_type = ItemType::Reflected(slice_type.item_type); + + let _token = slice_item_type.indent_or_same_line(frame); + add_item_to_frame( frame, ItemRef::Immutable(item_item), @@ -1264,7 +1275,7 @@ fn add_item_to_frame<'a>( item_title: &item_name, item_tag: &item_name, item_type_name: Some(slice_type.item_type_name()), - item_type: ItemType::Reflected(slice_type.item_type), + item_type: slice_item_type, item_is_read_only: true, }, &prev_item_tags, @@ -1272,8 +1283,6 @@ fn add_item_to_frame<'a>( assert!(!slice_item_changed); } - - frame.unindent(); } ItemType::Reflected(TypeReflection::Reference(ref_type)) => { let mut derefed_changed = false; @@ -1289,6 +1298,10 @@ fn add_item_to_frame<'a>( item_type_name, ); + let ref_item_type = ItemType::Reflected(ref_type.ty); + + let _token = ref_item_type.indent_or_same_line(frame); + add_item_to_frame( frame, ItemRef::Immutable(derefed_item), @@ -1297,7 +1310,7 @@ fn add_item_to_frame<'a>( item_title, item_tag: "derefed".into(), item_type_name, - item_type: ItemType::Reflected(ref_type.ty), + item_type: ref_item_type, item_is_read_only: true, }, prev_item_tags, @@ -1306,8 +1319,6 @@ fn add_item_to_frame<'a>( assert!(!derefed_changed); } ItemType::String => { - frame.same_line(); - let item = match item { ItemRef::Mutable(item) => { let Some(item) = (*item).downcast_mut::() else { @@ -1336,8 +1347,6 @@ fn add_item_to_frame<'a>( } } ItemType::CowStr => { - frame.same_line(); - let item = match item { ItemRef::Mutable(item) => { let Some(item) = (*item).downcast_mut::>() else { @@ -1512,6 +1521,8 @@ fn create_struct_widgets( Some(field.type_name()), ); + let _token = frame.begin_indent(); + add_item_to_frame( frame, field_item, @@ -1638,6 +1649,8 @@ fn create_enum_widgets( }, ); + let variant_field_cnt = variant_fields.clone().count(); + item_layout_table(frame, &prev_item_tags).build(|_| { for (field_index, field, field_item_type) in variant_fields .clone() @@ -1656,14 +1669,16 @@ fn create_enum_widgets( unreachable!(); }; - create_item_title_widget( - frame, - &field_name, - &field_item_type, - Some(field.type_name()), - ); + if variant_field_cnt != 1 || field.name.is_some() { + create_item_title_widget( + frame, + &field_name, + &field_item_type, + Some(field.type_name()), + ); - frame.table_next_column(); + frame.table_next_column(); + } add_item_to_frame( frame, @@ -1694,12 +1709,16 @@ fn create_enum_widgets( unreachable!(); }; - create_item_title_widget( - frame, - &field_name, - &field_item_type, - Some(field.type_name()), - ); + if variant_field_cnt != 1 || field.name.is_some() { + create_item_title_widget( + frame, + &field_name, + &field_item_type, + Some(field.type_name()), + ); + + let _token = frame.begin_indent(); + } add_item_to_frame( frame, -- cgit v1.2.3-18-g5258