summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Cory Forsstrom <cory.forsstrom@lich.io>2021-09-14 09:10:37 -0700
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2021-09-20 15:11:06 +0700
commitbe51cac3d71d5eb49e266d0d2aae6ab945caf560 (patch)
treebb7c53cef31db77ce00f9c0e4729b48b61a2db15
parent456a3f15e4226cc781a8825bddaaf066476d4351 (diff)
downloadiced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.tar.gz
iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.tar.bz2
iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.zip
Add Align::Fill variant
-rw-r--r--core/src/align.rs3
-rw-r--r--native/src/layout/flex.rs62
-rw-r--r--native/src/layout/node.rs6
-rw-r--r--web/src/css.rs1
4 files changed, 59 insertions, 13 deletions
diff --git a/core/src/align.rs b/core/src/align.rs
index 8a59afa1..aa8838c6 100644
--- a/core/src/align.rs
+++ b/core/src/align.rs
@@ -9,6 +9,9 @@ pub enum Align {
/// Align at the end of the axis.
End,
+
+ /// Fill the entire axis.
+ Fill,
}
/// The horizontal alignment of some resource.
diff --git a/native/src/layout/flex.rs b/native/src/layout/flex.rs
index 3d3ff82c..17045e69 100644
--- a/native/src/layout/flex.rs
+++ b/native/src/layout/flex.rs
@@ -76,7 +76,11 @@ where
let max_cross = axis.cross(limits.max());
let mut fill_sum = 0;
- let mut cross = axis.cross(limits.min()).max(axis.cross(limits.fill()));
+ let mut cross = if align_items == Align::Fill {
+ axis.cross(limits.min())
+ } else {
+ axis.cross(limits.min()).max(axis.cross(limits.fill()))
+ };
let mut available = axis.main(limits.max()) - total_spacing;
let mut nodes: Vec<Node> = Vec::with_capacity(items.len());
@@ -89,17 +93,34 @@ where
}
.fill_factor();
- if fill_factor == 0 {
- let (max_width, max_height) = axis.pack(available, max_cross);
+ let cross_fill_factor = match axis {
+ Axis::Horizontal => child.height(),
+ Axis::Vertical => child.width(),
+ }
+ .fill_factor();
- let child_limits =
- Limits::new(Size::ZERO, Size::new(max_width, max_height));
+ if align_items != Align::Fill && fill_factor != 0 {
+ fill_sum += fill_factor;
- let layout = child.layout(renderer, &child_limits);
- let size = layout.size();
+ continue;
+ }
- available -= axis.main(size);
+ let (max_width, max_height) = axis.pack(available, max_cross);
+
+ let child_limits =
+ Limits::new(Size::ZERO, Size::new(max_width, max_height));
+
+ let layout = child.layout(renderer, &child_limits);
+ let size = layout.size();
+
+ if align_items != Align::Fill
+ || cross_fill_factor == 0 && align_items == Align::Fill
+ {
cross = cross.max(axis.cross(size));
+ }
+
+ if fill_factor == 0 {
+ available -= axis.main(size);
nodes[i] = layout;
} else {
@@ -124,11 +145,23 @@ where
max_main
};
- let (min_main, min_cross) =
- axis.pack(min_main, axis.cross(limits.min()));
+ let (min_main, min_cross) = axis.pack(
+ min_main,
+ if align_items == Align::Fill {
+ cross
+ } else {
+ axis.cross(limits.min())
+ },
+ );
- let (max_main, max_cross) =
- axis.pack(max_main, axis.cross(limits.max()));
+ let (max_main, max_cross) = axis.pack(
+ max_main,
+ if align_items == Align::Fill {
+ cross
+ } else {
+ axis.cross(limits.max())
+ },
+ );
let child_limits = Limits::new(
Size::new(min_main, min_cross),
@@ -136,7 +169,10 @@ where
);
let layout = child.layout(renderer, &child_limits);
- cross = cross.max(axis.cross(layout.size()));
+
+ if align_items != Align::Fill {
+ cross = cross.max(axis.cross(layout.size()));
+ }
nodes[i] = layout;
}
diff --git a/native/src/layout/node.rs b/native/src/layout/node.rs
index d7666f31..bee5e64e 100644
--- a/native/src/layout/node.rs
+++ b/native/src/layout/node.rs
@@ -56,6 +56,9 @@ impl Node {
Align::End => {
self.bounds.x += space.width - self.bounds.width;
}
+ Align::Fill => {
+ self.bounds.width = space.width;
+ }
}
match vertical_alignment {
@@ -66,6 +69,9 @@ impl Node {
Align::End => {
self.bounds.y += space.height - self.bounds.height;
}
+ Align::Fill => {
+ self.bounds.height = space.height;
+ }
}
}
diff --git a/web/src/css.rs b/web/src/css.rs
index 21f51f85..23b21e22 100644
--- a/web/src/css.rs
+++ b/web/src/css.rs
@@ -201,6 +201,7 @@ pub fn align(align: Align) -> &'static str {
Align::Start => "flex-start",
Align::Center => "center",
Align::End => "flex-end",
+ Align::Fill => "stretch",
}
}