diff --git a/studio-frontend/src/dioxus-machine.ts b/studio-frontend/src/dioxus-machine.ts index f02fb0c..d7a18d0 100644 --- a/studio-frontend/src/dioxus-machine.ts +++ b/studio-frontend/src/dioxus-machine.ts @@ -117,9 +117,11 @@ function apply_muts( var many = edit["m"]; var target_node = nodes[id]; + + let append_nodes = element_stack.splice(element_stack.length - many); + for (var i = 0; i < many; i++) { - var current_element = element_stack.pop(); - target_node.appendChild(current_element); + target_node.appendChild(append_nodes[i]); } } else if (type == "HydrateText") { // var child_path = edit["path"]; @@ -155,9 +157,14 @@ function apply_muts( var el = element_stack.pop(); els.push(el); } + els.reverse(); var target_node = load_child(element_stack, child_path); target_node.replaceWith(...els); console.log("") + } else if (type == "CreateTextNode") { + var text_node : any = document.createTextNode(edit["value"]); + nodes[edit["id"]] = text_node; + element_stack.push(text_node); } } @@ -210,6 +217,15 @@ function recursive_render( new_element.id = element.id.toString(); } + //set attrs + if (element.attrs != undefined) { + for (const attr of element.attrs) { + var name = attr["name"]; + var value = attr["value"]; + new_element.setAttribute(name, value); + } + } + //parent to root if (root != null) { root.appendChild(new_element); diff --git a/studio/src/interaction/selection.rs b/studio/src/interaction/selection.rs index f73a138..120d8e3 100644 --- a/studio/src/interaction/selection.rs +++ b/studio/src/interaction/selection.rs @@ -50,7 +50,7 @@ pub struct Selectable; pub struct Selected; #[derive(Resource, Deref, DerefMut, Debug)] -pub struct Selection(Entity); +pub struct Selection(pub Entity); fn sync_editor_selected( mut cmd: Commands, diff --git a/studio/src/ui/inspector.rs b/studio/src/ui/inspector.rs index 32799b7..623a62f 100644 --- a/studio/src/ui/inspector.rs +++ b/studio/src/ui/inspector.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, Mutex, RwLock}; -use bevy::{ecs::world::unsafe_world_cell::{UnsafeEntityCell, UnsafeWorldCell}, prelude::*, reflect::TypeData, utils::hashbrown::HashMap, window::PrimaryWindow}; +use bevy::{ecs::world::unsafe_world_cell::{UnsafeEntityCell, UnsafeWorldCell}, prelude::*, reflect::TypeData, utils::{hashbrown::HashMap, tracing::field}, window::PrimaryWindow}; use dioxus::{prelude::*, rsx::*}; use serde::{Deserialize, Serialize}; use space_editor::{prelude::Selected, space_editor_ui::inspector::inspect}; @@ -20,8 +20,8 @@ impl Plugin for InspectorPlugin { app.add_systems(Update, show_selected); - app.world.resource_mut::().add_simple::(); app.world.resource_mut::().add_simple::(); + app.world.resource_mut::().add_simple::(); } } @@ -85,16 +85,41 @@ fn web_inspector(cx: Scope) -> dioxus::core::Element { } fn web_reflect(cx: Scope) -> dioxus::core::Element { + + //registered components + if cx.props.component.represents::() { + let name = ::from_reflect(cx.props.component.as_ref()).unwrap(); + return render! { + div { + p { name.as_str() } + } + }; + }else if cx.props.component.represents::() { + let transform = ::from_reflect(cx.props.component.as_ref()).unwrap(); + let euler = transform.rotation.to_euler(EulerRot::XYZ); + return render! { + div { + "style" : "flex-direction: column; display: flex; ", + "Transform\n", + format!("pos: {:.2} {:.2} {:.2}\n", transform.translation.x, transform.translation.y, transform.translation.z), + format!("rot: {:.2} {:.2} {:.2}\n", euler.0, euler.1, euler.2), + format!("scale: {:.2} {:.2} {:.2}\n", transform.scale.x, transform.scale.y, transform.scale.z) + } + }; + } + let res = match cx.props.component.reflect_ref() { bevy::reflect::ReflectRef::Struct(v) => { let field_count = v.field_len(); + render! { div { - v.type_name().split("::").last().unwrap(), + p { v.type_name().split("::").last().unwrap() }, (0..field_count).map(|i| { let field = v.field_at(i).unwrap(); render! { + format!("{}: ", v.name_at(i).unwrap()), web_reflect { component: field.clone_value() } } @@ -103,10 +128,17 @@ fn web_reflect(cx: Scope) -> dioxus::core::Element { } } }, - bevy::reflect::ReflectRef::TupleStruct(_) => { + bevy::reflect::ReflectRef::TupleStruct(v) => { + let field_count = v.field_len(); + render! { div { - + p { v.type_name().split("::").last().unwrap(), }, + v.iter_fields().map(|field| { + render! { + web_reflect { component: field.clone_value() } + } + }) } } }, @@ -145,10 +177,84 @@ fn web_reflect(cx: Scope) -> dioxus::core::Element { } } }, - bevy::reflect::ReflectRef::Value(_) => { - render! { - div { - + bevy::reflect::ReflectRef::Value(v) => { + if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else if let Some(v) = v.downcast_ref::() { + render! { + div { + format!("{:?}", v) + } + } + } else { + render! { + div { + "Not implemented reflect type" + } } } }, @@ -163,10 +269,12 @@ fn show_selected( unsafe { let cell = world.as_unsafe_world_cell(); - let Ok(selected_entity) = cell.world_mut().query_filtered::>().get_single(cell.world()) else { + let Some(selection) = cell.get_resource::() else { return; }; + let selected_entity = selection.0; + let mut functions = cell.get_resource_mut::().unwrap(); let e = cell.get_entity(selected_entity).unwrap();