diff options
author | 2021-09-14 09:10:37 -0700 | |
---|---|---|
committer | 2021-09-20 15:11:06 +0700 | |
commit | be51cac3d71d5eb49e266d0d2aae6ab945caf560 (patch) | |
tree | bb7c53cef31db77ce00f9c0e4729b48b61a2db15 | |
parent | 456a3f15e4226cc781a8825bddaaf066476d4351 (diff) | |
download | iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.tar.gz iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.tar.bz2 iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.zip |
Add Align::Fill variant
-rw-r--r-- | core/src/align.rs | 3 | ||||
-rw-r--r-- | native/src/layout/flex.rs | 62 | ||||
-rw-r--r-- | native/src/layout/node.rs | 6 | ||||
-rw-r--r-- | web/src/css.rs | 1 |
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", } } |