use plushie_core::protocol::TreeNode;
use plushie_core::tree_walk::{WalkCtx, walk};
use crate::App;
use crate::widget::{ExpandWidgetsTransform, WidgetStateStore, register_expanders};
pub(crate) mod memo_cache;
pub mod normalize;
pub mod subscriptions;
pub mod tree_diff;
#[cfg(any(feature = "direct", feature = "wire"))]
pub mod view_errors;
pub(crate) mod widget_view_cache;
#[cfg(any(feature = "direct", feature = "wire"))]
pub mod windows;
pub(crate) use memo_cache::MemoCache;
pub(crate) use widget_view_cache::WidgetViewCache;
pub const DISPATCH_DEPTH_LIMIT: usize = 100;
pub fn prepare_tree<A: App>(
model: &A::Model,
widget_store: &mut WidgetStateStore,
memo_cache: &mut MemoCache,
widget_view_cache: &mut WidgetViewCache,
) -> (TreeNode, Vec<plushie_core::Diagnostic>) {
let mut registrar = crate::widget::WidgetRegistrar::new();
let mut tree: TreeNode = A::view(model, &mut registrar).into_tree_node();
register_expanders(widget_store, registrar);
memo_cache.begin_cycle();
widget_view_cache.begin_cycle();
let mut ctx = WalkCtx::default();
{
let mut expand = ExpandWidgetsTransform::with_cache(widget_store, Some(widget_view_cache));
let mut normalize_pass = normalize::NormalizeTransform::with_memo_cache(Some(memo_cache));
walk(&mut tree, &mut [&mut expand, &mut normalize_pass], &mut ctx);
}
memo_cache.finish_cycle();
widget_view_cache.finish_cycle();
let (warnings, _ctx) = normalize::finalize_a11y(&mut tree, ctx);
#[cfg(feature = "dev")]
{
if let Some(snapshot) = crate::dev::current_overlay_snapshot() {
tree = crate::dev::overlay::inject(tree, Some(&snapshot));
}
}
(tree, warnings)
}