use dioxus_native_core::{real_dom::NodeImmutable, NodeId};
use freya_engine::prelude::*;
use freya_node_state::ViewportState;
use itertools::sorted;
use torin::prelude::{LayoutNode, Torin};
use crate::dom::FreyaDOM;
pub fn process_render(
fdom: &FreyaDOM,
font_collection: &mut FontCollection,
mut render_fn: impl FnMut(&FreyaDOM, &NodeId, &LayoutNode, &mut FontCollection, &Torin<NodeId>),
) {
let layout = fdom.layout();
let rdom = fdom.rdom();
let layers = fdom.layers();
for (_, layer) in sorted(layers.layers().iter()) {
'elements: for node_id in layer {
let node = rdom.get(*node_id).unwrap();
let node_viewports = node.get::<ViewportState>().unwrap();
let layout_node = layout.get(*node_id);
if let Some(layout_node) = layout_node {
for viewport_id in &node_viewports.viewports {
let viewport = layout.get(*viewport_id).unwrap().visible_area();
if !viewport.intersects(&layout_node.area) {
continue 'elements;
}
}
render_fn(fdom, node_id, layout_node, font_collection, &layout)
}
}
}
}