use super::ArrangementCalculator; use crate::{ layout::{LayoutNodeAccess, SizePolicy2D}, math::PixelBox, }; #[derive(Clone, Debug)] pub struct ContainerArrangement; impl ArrangementCalculator for ContainerArrangement { fn arrange_step(&self, node: LayoutNodeAccess) -> SizePolicy2D { let Some(child) = node.child(0) else { return SizePolicy2D::new(node.width_policy(), node.height_policy()) + node.margin_as_policy(); }; SizePolicy2D::new( node.width_policy.max_preserve_slack(child.width_policy()), node.height_policy.max_preserve_slack(child.height_policy()), ) + node.margin_as_policy() } fn layout_step(&self, node: LayoutNodeAccess, inside: PixelBox) { let inside = super::do_align(&node, inside); node.with_state(|ns| { if Some(inside) != ns.area { ns.area = Some(inside); ns.needs_render = true; } }); let Some(child) = node.child(0) else { return; }; child .child_arrangement .layout_step(child, inside.inner_box(node.margin())); } }