container.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. use super::ArrangementCalculator;
  2. use crate::{
  3. layout::{LayoutNodeAccess, SizePolicy2D},
  4. math::PixelBox,
  5. };
  6. #[derive(Clone, Debug)]
  7. pub struct ContainerArrangement;
  8. impl ArrangementCalculator for ContainerArrangement {
  9. fn arrange_step(&self, node: LayoutNodeAccess) -> SizePolicy2D {
  10. let Some(child) = node.child(0) else {
  11. return SizePolicy2D::new(node.width_policy(), node.height_policy())
  12. + node.margin_as_policy();
  13. };
  14. SizePolicy2D::new(
  15. node.width_policy.max_preserve_slack(child.width_policy()),
  16. node.height_policy.max_preserve_slack(child.height_policy()),
  17. ) + node.margin_as_policy()
  18. }
  19. fn layout_step(&self, node: LayoutNodeAccess, inside: PixelBox) {
  20. let inside = super::do_align(&node, inside);
  21. node.with_state(|ns| {
  22. if Some(inside) != ns.area {
  23. ns.area = Some(inside);
  24. ns.needs_render = true;
  25. }
  26. });
  27. let Some(child) = node.child(0) else {
  28. return;
  29. };
  30. child
  31. .child_arrangement
  32. .layout_step(child, inside.inner_box(node.margin()));
  33. }
  34. }