WIP apply_mutations

This commit is contained in:
JMS55 2023-12-07 11:17:42 -08:00
parent 4ff1563941
commit 939c12d78f
4 changed files with 95 additions and 11 deletions

View file

@ -1,6 +1,71 @@
use bevy::ecs::{entity::Entity, world::World};
use dioxus_core::Mutations;
use crate::bsn::Bsn;
use bevy::{
ecs::{entity::Entity, world::World},
hierarchy::{BuildWorldChildren, DespawnRecursiveExt},
text::Text,
ui::node_bundles::TextBundle,
utils::HashMap,
};
use dioxus_core::{ElementId, Mutation, Mutations};
pub fn apply_mutations(mutations: Mutations, root_entity: Entity, world: &mut World) {
todo!("Modify bevy_ui entities based on mutations");
pub fn apply_mutations(
mutations: Mutations,
element_id_to_bevy_ui_entity: &mut HashMap<ElementId, Entity>,
templates: &mut HashMap<String, Bsn>,
root_entity: Entity,
world: &mut World,
) {
for new_template in mutations.templates {
templates.insert(new_template.name.to_owned(), todo!());
}
let map = element_id_to_bevy_ui_entity;
map.insert(ElementId(0), root_entity);
let mut stack = vec![root_entity];
for edit in mutations.edits {
match edit {
Mutation::AppendChildren { id, m } => {
let mut parent = world.entity_mut(map[&id]);
for _ in 0..m {
parent.add_child(stack.pop().unwrap());
}
}
Mutation::AssignId { path, id } => todo!(),
Mutation::CreatePlaceholder { id } => {
map.insert(id, world.spawn(()).id());
}
Mutation::CreateTextNode { value, id } => {
map.insert(id, world.spawn(TextBundle::from(value)).id());
}
Mutation::HydrateText { path, value, id } => todo!(),
Mutation::LoadTemplate { name, index, id } => todo!(),
Mutation::ReplaceWith { id, m } => todo!(),
Mutation::ReplacePlaceholder { path, m } => todo!(),
Mutation::InsertAfter { id, m } => todo!(),
Mutation::InsertBefore { id, m } => todo!(),
Mutation::SetAttribute {
name,
value,
id,
ns,
} => todo!(),
Mutation::SetText { value, id } => {
world
.entity_mut(map[&id])
.get_mut::<Text>()
.unwrap()
.sections[0]
.value = value.to_owned();
}
Mutation::NewEventListener { name, id } => todo!(),
Mutation::RemoveEventListener { name, id } => todo!(),
Mutation::Remove { id } => {
world
.entity_mut(map.remove(&id).unwrap())
.despawn_recursive();
}
Mutation::PushRoot { id } => stack.push(map[&id]),
}
}
}

1
src/bsn.rs Normal file
View file

@ -0,0 +1 @@
pub struct Bsn {}

View file

@ -1,16 +1,20 @@
mod apply_mutations;
mod bsn;
mod deferred_system;
mod hooks;
mod tick;
use self::{
bsn::Bsn,
deferred_system::DeferredSystemRunQueue,
tick::{tick_dioxus_ui, VirtualDomUnsafe},
};
use bevy::{
app::{App, Plugin, Update},
ecs::component::Component,
ecs::{component::Component, entity::Entity},
utils::HashMap,
};
use dioxus_core::ElementId;
pub use self::hooks::DioxusUiHooks;
pub use dioxus_core::{Element, Scope};
@ -27,6 +31,8 @@ impl Plugin for DioxusUiPlugin {
#[derive(Component)]
pub struct DioxusUiRoot {
virtual_dom: VirtualDomUnsafe,
element_id_to_bevy_ui_entity: HashMap<ElementId, Entity>,
templates: HashMap<String, Bsn>,
needs_rebuild: bool,
}
@ -34,6 +40,8 @@ impl DioxusUiRoot {
pub fn new(root_component: fn(Scope) -> Element) -> Self {
Self {
virtual_dom: VirtualDomUnsafe::new(root_component),
element_id_to_bevy_ui_entity: HashMap::new(),
templates: HashMap::new(),
needs_rebuild: true,
}
}

View file

@ -22,6 +22,8 @@ pub fn tick_dioxus_ui(world: &mut World) {
let DioxusUiRoot {
virtual_dom,
needs_rebuild,
element_id_to_bevy_ui_entity,
templates,
} = &mut *dioxus_ui_root;
let virtual_dom = virtual_dom.get();
@ -30,18 +32,26 @@ pub fn tick_dioxus_ui(world: &mut World) {
.provide_context(EcsContext { world: world_ptr });
if *needs_rebuild {
apply_mutations(virtual_dom.rebuild(), root_entity, unsafe {
world_cell.world_mut()
});
apply_mutations(
virtual_dom.rebuild(),
element_id_to_bevy_ui_entity,
templates,
root_entity,
unsafe { world_cell.world_mut() },
);
*needs_rebuild = false;
}
// TODO: Handle events from winit
// virtual_dom.handle_event(todo!(), todo!(), todo!(), todo!());
apply_mutations(virtual_dom.render_immediate(), root_entity, unsafe {
world_cell.world_mut()
});
apply_mutations(
virtual_dom.render_immediate(),
element_id_to_bevy_ui_entity,
templates,
root_entity,
unsafe { world_cell.world_mut() },
);
}
for system_id in mem::take(&mut world.resource_mut::<DeferredSystemRunQueue>().0) {