WIP: Cursed reflected attributes
This commit is contained in:
parent
9bcbd0bb81
commit
3c0057d961
|
|
@ -1,16 +1,22 @@
|
||||||
use crate::bsn::Bsn;
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::{entity::Entity, system::Commands},
|
ecs::{
|
||||||
|
entity::Entity,
|
||||||
|
reflect::{AppTypeRegistry, ReflectComponent},
|
||||||
|
system::{Command, Commands},
|
||||||
|
world::Mut,
|
||||||
|
},
|
||||||
hierarchy::{BuildChildren, DespawnRecursiveExt},
|
hierarchy::{BuildChildren, DespawnRecursiveExt},
|
||||||
ui::node_bundles::TextBundle,
|
prelude::World,
|
||||||
|
reflect::Reflect,
|
||||||
utils::HashMap,
|
utils::HashMap,
|
||||||
};
|
};
|
||||||
use dioxus_core::{ElementId, Mutation, Mutations};
|
use dioxus_core::{BorrowedAttributeValue, ElementId, Mutation, Mutations};
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub fn apply_mutations(
|
pub fn apply_mutations(
|
||||||
mutations: Mutations,
|
mutations: Mutations,
|
||||||
element_id_to_bevy_ui_entity: &mut HashMap<ElementId, Entity>,
|
element_id_to_bevy_ui_entity: &mut HashMap<ElementId, Entity>,
|
||||||
templates: &mut HashMap<String, Bsn>,
|
templates: &mut HashMap<String, ()>,
|
||||||
root_entity: Entity,
|
root_entity: Entity,
|
||||||
commands: &mut Commands,
|
commands: &mut Commands,
|
||||||
) {
|
) {
|
||||||
|
|
@ -34,10 +40,12 @@ pub fn apply_mutations(
|
||||||
Mutation::CreatePlaceholder { id } => {
|
Mutation::CreatePlaceholder { id } => {
|
||||||
map.insert(id, commands.spawn(()).id());
|
map.insert(id, commands.spawn(()).id());
|
||||||
}
|
}
|
||||||
Mutation::CreateTextNode { value, id } => {
|
Mutation::CreateTextNode { .. } => {
|
||||||
map.insert(id, commands.spawn(TextBundle::from(value)).id());
|
unreachable!("Should not be used by bevy_dioxus elements");
|
||||||
|
}
|
||||||
|
Mutation::HydrateText { .. } => {
|
||||||
|
unreachable!("Should not be used by bevy_dioxus elements");
|
||||||
}
|
}
|
||||||
Mutation::HydrateText { path, value, id } => todo!(),
|
|
||||||
Mutation::LoadTemplate { name, index, id } => todo!(),
|
Mutation::LoadTemplate { name, index, id } => todo!(),
|
||||||
Mutation::ReplaceWith { id, m } => todo!(),
|
Mutation::ReplaceWith { id, m } => todo!(),
|
||||||
Mutation::ReplacePlaceholder { path, m } => todo!(),
|
Mutation::ReplacePlaceholder { path, m } => todo!(),
|
||||||
|
|
@ -47,9 +55,22 @@ pub fn apply_mutations(
|
||||||
name,
|
name,
|
||||||
value,
|
value,
|
||||||
id,
|
id,
|
||||||
ns,
|
ns: _,
|
||||||
} => todo!(),
|
} => commands.add(SetReflectedComponent {
|
||||||
Mutation::SetText { value, id } => todo!(),
|
entity: map[&id],
|
||||||
|
component_type_path: name.to_owned(),
|
||||||
|
component_value: match value {
|
||||||
|
BorrowedAttributeValue::Any(value) => Some(Arc::clone(
|
||||||
|
value
|
||||||
|
.as_any()
|
||||||
|
.downcast_ref::<Arc<dyn Reflect>>()
|
||||||
|
.expect("Attribute value does not impl Reflect"),
|
||||||
|
)),
|
||||||
|
BorrowedAttributeValue::None => None,
|
||||||
|
_ => unreachable!("Should not be used by bevy_dioxus elements"),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
Mutation::SetText { .. } => unreachable!("Should not be used by bevy_dioxus elements"),
|
||||||
Mutation::NewEventListener { name, id } => todo!(),
|
Mutation::NewEventListener { name, id } => todo!(),
|
||||||
Mutation::RemoveEventListener { name, id } => todo!(),
|
Mutation::RemoveEventListener { name, id } => todo!(),
|
||||||
Mutation::Remove { id } => {
|
Mutation::Remove { id } => {
|
||||||
|
|
@ -61,3 +82,34 @@ pub fn apply_mutations(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SetReflectedComponent {
|
||||||
|
entity: Entity,
|
||||||
|
component_type_path: String,
|
||||||
|
component_value: Option<Arc<dyn Reflect>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Command for SetReflectedComponent {
|
||||||
|
fn apply(self, world: &mut World) {
|
||||||
|
world.resource_scope(|world: &mut World, type_registry: Mut<AppTypeRegistry>| {
|
||||||
|
let type_registry = type_registry.read();
|
||||||
|
let reflected_component = type_registry
|
||||||
|
.get_with_type_path(&self.component_type_path)
|
||||||
|
.expect(&format!(
|
||||||
|
"Encountered an attribute with name {} that was not registered",
|
||||||
|
self.component_type_path
|
||||||
|
))
|
||||||
|
.data::<ReflectComponent>()
|
||||||
|
.expect(&format!(
|
||||||
|
"Encountered an attribute with name {} that did not reflect Component",
|
||||||
|
self.component_type_path
|
||||||
|
));
|
||||||
|
|
||||||
|
let entity_mut = &mut world.entity_mut(self.entity);
|
||||||
|
match self.component_value {
|
||||||
|
Some(value) => reflected_component.apply_or_insert(entity_mut, &*value),
|
||||||
|
None => reflected_component.remove(entity_mut),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
pub struct Bsn {}
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
mod apply_mutations;
|
mod apply_mutations;
|
||||||
mod bsn;
|
|
||||||
mod deferred_system;
|
mod deferred_system;
|
||||||
mod hooks;
|
mod hooks;
|
||||||
mod tick;
|
mod tick;
|
||||||
|
|
||||||
use self::{
|
use self::{
|
||||||
bsn::Bsn,
|
|
||||||
deferred_system::DeferredSystemRegistry,
|
deferred_system::DeferredSystemRegistry,
|
||||||
tick::{tick_dioxus_ui, VirtualDomUnsafe},
|
tick::{tick_dioxus_ui, VirtualDomUnsafe},
|
||||||
};
|
};
|
||||||
|
|
@ -35,7 +33,7 @@ impl Plugin for DioxusUiPlugin {
|
||||||
pub struct DioxusUiRoot {
|
pub struct DioxusUiRoot {
|
||||||
virtual_dom: VirtualDomUnsafe,
|
virtual_dom: VirtualDomUnsafe,
|
||||||
element_id_to_bevy_ui_entity: HashMap<ElementId, Entity>,
|
element_id_to_bevy_ui_entity: HashMap<ElementId, Entity>,
|
||||||
templates: HashMap<String, Bsn>,
|
templates: HashMap<String, ()>,
|
||||||
needs_rebuild: bool,
|
needs_rebuild: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue