diff options
| author | 2021-09-14 09:10:37 -0700 | |
|---|---|---|
| committer | 2021-09-20 15:11:06 +0700 | |
| commit | be51cac3d71d5eb49e266d0d2aae6ab945caf560 (patch) | |
| tree | bb7c53cef31db77ce00f9c0e4729b48b61a2db15 /native | |
| parent | 456a3f15e4226cc781a8825bddaaf066476d4351 (diff) | |
| download | iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.tar.gz iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.tar.bz2 iced-be51cac3d71d5eb49e266d0d2aae6ab945caf560.zip | |
Add Align::Fill variant
Diffstat (limited to '')
| -rw-r--r-- | native/src/layout/flex.rs | 62 | ||||
| -rw-r--r-- | native/src/layout/node.rs | 6 | 
2 files changed, 55 insertions, 13 deletions
| 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; +            }          }      } | 
