From 6bc9bc6ef95d054e92c8accca4d52e2554c39a0f Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Fri, 24 Mar 2023 12:57:19 -0500 Subject: [PATCH] fix nodes not being marked as dirty with multiple mutations --- packages/native-core/src/node_ref.rs | 2 +- packages/native-core/src/real_dom.rs | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/native-core/src/node_ref.rs b/packages/native-core/src/node_ref.rs index 22ab5d8f1..218348c90 100644 --- a/packages/native-core/src/node_ref.rs +++ b/packages/native-core/src/node_ref.rs @@ -126,7 +126,7 @@ impl AttributeMask { pub fn union(&self, other: &Self) -> Self { match (self, other) { (AttributeMask::Some(s), AttributeMask::Some(o)) => { - AttributeMask::Some(s.intersection(o).cloned().collect()) + AttributeMask::Some(s.union(o).cloned().collect()) } _ => AttributeMask::All, } diff --git a/packages/native-core/src/real_dom.rs b/packages/native-core/src/real_dom.rs index 1deec7d64..25d1ed9fe 100644 --- a/packages/native-core/src/real_dom.rs +++ b/packages/native-core/src/real_dom.rs @@ -186,6 +186,8 @@ impl RealDom { .entry(id) .or_default() .extend(self.dirty_nodes.passes.iter().map(|x| x.this_type_id)); + self.dirty_nodes + .mark_dirty(id, NodeMaskBuilder::ALL.build()); let watchers = self.node_watchers.clone(); for watcher in &*watchers.read().unwrap() { watcher.on_node_added(NodeMut::new(id, self)); @@ -216,16 +218,19 @@ impl RealDom { self.root_id } + /// Check if a node exists in the dom. + pub fn contains(&self, id: NodeId) -> bool { + self.tree_ref().contains(id) + } + /// Get a reference to a node. pub fn get(&self, id: NodeId) -> Option> { - self.tree_ref() - .contains(id) - .then_some(NodeRef { id, dom: self }) + self.contains(id).then_some(NodeRef { id, dom: self }) } /// Get a mutable reference to a node. pub fn get_mut(&mut self, id: NodeId) -> Option> { - let contains = self.tree_ref().contains(id); + let contains = self.contains(id); contains.then(|| NodeMut::new(id, self)) } @@ -399,7 +404,7 @@ impl<'a, V: Component + Send + Sync> DerefMut for ViewEntr } /// A immutable view of a node -pub trait NodeImmutable: Sized { +pub trait NodeImmutable: Sized { /// Get the real dom this node was created in fn real_dom(&self) -> &RealDom; @@ -573,7 +578,9 @@ impl<'a, V: FromAnyValue + Send + Sync> NodeMut<'a, V> { .or_default() .insert(TypeId::of::()); let view_mut: ViewMut = self.dom.borrow_raw().ok()?; - Some(ViewEntryMut::new(view_mut, self.id)) + view_mut + .contains(self.id) + .then_some(ViewEntryMut::new(view_mut, self.id)) } /// Insert a custom component into this node @@ -684,7 +691,8 @@ impl<'a, V: FromAnyValue + Send + Sync> NodeMut<'a, V> { for child in children_ids_vec { self.dom.get_mut(child).unwrap().remove(); } - self.dom.tree_mut().remove_single(id); + self.dom.tree_mut().remove(id); + self.real_dom_mut().raw_world_mut().delete_entity(id); } /// Replace this node with a different node