diff --git a/crates/core/src/layout/layers.rs b/crates/core/src/layout/layers.rs index 6f07d1f73..2af74a8b4 100644 --- a/crates/core/src/layout/layers.rs +++ b/crates/core/src/layout/layers.rs @@ -2,8 +2,10 @@ use std::vec::IntoIter; use dioxus_native_core::prelude::ElementNode; use dioxus_native_core::real_dom::NodeImmutable; +use dioxus_native_core::tree::TreeRef; use dioxus_native_core::{node::NodeType, NodeId}; use freya_common::NodeReferenceLayout; +use freya_dom::dom::DioxusNode; use freya_dom::prelude::{DioxusDOM, FreyaDOM}; use itertools::sorted; @@ -15,6 +17,20 @@ use uuid::Uuid; use crate::layout::*; +fn traverse_dom(rdom: &DioxusDOM, mut f: impl FnMut(DioxusNode) -> bool) { + let mut stack = vec![rdom.root_id()]; + let tree = rdom.tree_ref(); + while let Some(id) = stack.pop() { + if let Some(node) = rdom.get(id) { + let traverse_children = f(node); + if traverse_children { + let children = tree.children_ids_advanced(id, true); + stack.extend(children.iter().copied().rev()); + } + } + } +} + #[derive(Default, Clone)] pub struct Layers { pub layers: FxHashMap>, @@ -31,31 +47,32 @@ impl Layers { let mut layers = Layers::default(); let mut inherit_layers = FxHashMap::default(); - rdom.traverse_depth_first(|node| { - let areas = layout.get(node.id()); + traverse_dom(rdom, |node| { + let areas = layout.get(node.id()).unwrap(); - if let Some(areas) = areas { - // Add the Node to a Layer - let node_style = node.get::