summaryrefslogtreecommitdiff
path: root/src/layout/pad.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2020-10-12 17:29:01 +0200
committerLaurenz <laurmaedje@gmail.com>2020-10-12 17:29:01 +0200
commit5243878d810d4817c81acc9ae346d46757fcf602 (patch)
tree4a8be00ab7262030a6ba8c6638b969a03ac1d9b5 /src/layout/pad.rs
parent38157b0e0cbab22dc3f5fa5cc66d9b673a18a55b (diff)
Less vecs in layouting ⚡
Diffstat (limited to 'src/layout/pad.rs')
-rw-r--r--src/layout/pad.rs51
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)