diff options
| author | Laurenz <laurmaedje@gmail.com> | 2020-10-12 17:29:01 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2020-10-12 17:29:01 +0200 |
| commit | 5243878d810d4817c81acc9ae346d46757fcf602 (patch) | |
| tree | 4a8be00ab7262030a6ba8c6638b969a03ac1d9b5 /src/layout/pad.rs | |
| parent | 38157b0e0cbab22dc3f5fa5cc66d9b673a18a55b (diff) | |
Less vecs in layouting ⚡
Diffstat (limited to 'src/layout/pad.rs')
| -rw-r--r-- | src/layout/pad.rs | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/src/layout/pad.rs b/src/layout/pad.rs index 2994dd59..b26bea71 100644 --- a/src/layout/pad.rs +++ b/src/layout/pad.rs @@ -11,27 +11,16 @@ pub struct Pad { } impl Layout for Pad { - fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Vec<Layouted> { - let shrink = |size| size - self.padding.eval(size).size(); - let areas = Areas { - current: Area { - rem: shrink(areas.current.rem), - full: shrink(areas.current.full), - }, - backlog: areas.backlog.iter().copied().map(shrink).collect(), - last: areas.last.map(shrink), - }; + fn layout(&self, ctx: &mut LayoutContext, areas: &Areas) -> Layouted { + let areas = shrink_areas(areas, self.padding); let mut layouted = self.child.layout(ctx, &areas); - - for item in &mut layouted { - if let Layouted::Boxed(boxed, _) = item { - let padding = self.padding.eval(boxed.size); - let origin = Point::new(padding.left, padding.top); - - boxed.size += padding.size(); - for (point, _) in &mut boxed.elements { - *point += origin; + match &mut layouted { + Layouted::Spacing(_) => {} + Layouted::Boxed(boxed, _) => pad_box(boxed, self.padding), + Layouted::Boxes(boxes) => { + for (boxed, _) in boxes { + pad_box(boxed, self.padding); } } } @@ -40,6 +29,30 @@ impl Layout for Pad { } } +/// Shrink all areas by the padding. +fn shrink_areas(areas: &Areas, padding: Sides<Linear>) -> Areas { + let shrink = |size| size - padding.eval(size).size(); + Areas { + current: Area { + rem: shrink(areas.current.rem), + full: shrink(areas.current.full), + }, + backlog: areas.backlog.iter().copied().map(shrink).collect(), + last: areas.last.map(shrink), + } +} + +/// Enlarge the box and move all elements inwards. +fn pad_box(boxed: &mut BoxLayout, padding: Sides<Linear>) { + let padding = padding.eval(boxed.size); + let origin = Point::new(padding.left, padding.top); + + boxed.size += padding.size(); + for (point, _) in &mut boxed.elements { + *point += origin; + } +} + impl From<Pad> for LayoutNode { fn from(pad: Pad) -> Self { Self::dynamic(pad) |
