12345678910111213141516171819202122232425262728293031323334353637383940 |
- 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()));
- }
- }
|