summaryrefslogtreecommitdiff
path: root/engine/src/ui/view/world.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-08-20 17:40:59 +0200
committerHampusM <hampus@hampusmat.com>2026-08-20 17:40:59 +0200
commit197b8e13dc070c9bee72ceda3d21ae1561a5a69a (patch)
treec3a1f160f39d3115090a5aa642d203ad771c1203 /engine/src/ui/view/world.rs
parentf0f090d76207ee2e01ef90d6ea704e2f04f0d1c6 (diff)
feat(engine): flatten single unnamed enum fields in world ui view
Diffstat (limited to 'engine/src/ui/view/world.rs')
-rw-r--r--engine/src/ui/view/world.rs127
1 files changed, 73 insertions, 54 deletions
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<dear_imgui_bindings::IndentToken<'frame>>
+ {
+ 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::<u8>(
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::<String>() 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::<Cow<'static, str>>() 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,