diff options
author | 2024-03-03 01:21:04 +0100 | |
---|---|---|
committer | 2024-03-03 01:21:04 +0100 | |
commit | 1bb5a1b9a23e1c4739430ac87ca33b06c2f4d9df (patch) | |
tree | 23fa181e9a5a8aad983d9e623e14fa8524592691 | |
parent | af9fb367f361a564aa2a9fc11333816566eb5d55 (diff) | |
parent | cbe4603579c6af55c35254257981e14cd4a67897 (diff) | |
download | iced-1bb5a1b9a23e1c4739430ac87ca33b06c2f4d9df.tar.gz iced-1bb5a1b9a23e1c4739430ac87ca33b06c2f4d9df.tar.bz2 iced-1bb5a1b9a23e1c4739430ac87ca33b06c2f4d9df.zip |
Merge pull request #2308 from iced-rs/intuitive-flex-layout
Remove complex cross-axis layout logic from `Column` and `Row`
-rw-r--r-- | core/src/layout/flex.rs | 67 | ||||
-rw-r--r-- | examples/layout/src/main.rs | 42 |
2 files changed, 25 insertions, 84 deletions
diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 40bd7123..dcb4d8de 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -80,14 +80,9 @@ where let mut fill_main_sum = 0; let mut cross = match axis { - Axis::Horizontal => match height { - Length::Shrink => 0.0, - _ => max_cross, - }, - Axis::Vertical => match width { - Length::Shrink => 0.0, - _ => max_cross, - }, + Axis::Vertical if width == Length::Shrink => 0.0, + Axis::Horizontal if height == Length::Shrink => 0.0, + _ => max_cross, }; let mut available = axis.main(limits.max()) - total_spacing; @@ -103,35 +98,14 @@ where }; if fill_main_factor == 0 { - if fill_cross_factor == 0 { - 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.as_widget().layout(tree, renderer, &child_limits); - let size = layout.size(); - - available -= axis.main(size); - cross = cross.max(axis.cross(size)); - - nodes[i] = layout; - } - } else { - fill_main_sum += fill_main_factor; - } - } - - for (i, (child, tree)) in items.iter().zip(trees.iter_mut()).enumerate() { - let (fill_main_factor, fill_cross_factor) = { - let size = child.as_widget().size(); - - axis.pack(size.width.fill_factor(), size.height.fill_factor()) - }; - - if fill_main_factor == 0 && fill_cross_factor != 0 { - let (max_width, max_height) = axis.pack(available, cross); + let (max_width, max_height) = axis.pack( + available, + if fill_cross_factor == 0 { + max_cross + } else { + cross + }, + ); let child_limits = Limits::new(Size::ZERO, Size::new(max_width, max_height)); @@ -141,9 +115,11 @@ where let size = layout.size(); available -= axis.main(size); - cross = cross.max(axis.cross(layout.size())); + cross = cross.max(axis.cross(size)); nodes[i] = layout; + } else { + fill_main_sum += fill_main_factor; } } @@ -175,14 +151,15 @@ where max_main }; - let max_cross = if fill_cross_factor == 0 { - max_cross - } else { - cross - }; - let (min_width, min_height) = axis.pack(min_main, 0.0); - let (max_width, max_height) = axis.pack(max_main, max_cross); + let (max_width, max_height) = axis.pack( + max_main, + if fill_cross_factor == 0 { + max_cross + } else { + cross + }, + ); let child_limits = Limits::new( Size::new(min_width, min_height), diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index 06a476be..39c8315f 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -4,11 +4,11 @@ use iced::mouse; use iced::theme; use iced::widget::{ button, canvas, checkbox, column, container, horizontal_space, pick_list, - row, scrollable, text, vertical_rule, + row, scrollable, text, }; use iced::{ - color, Alignment, Application, Color, Command, Element, Font, Length, - Point, Rectangle, Renderer, Settings, Subscription, Theme, + color, Alignment, Application, Command, Element, Font, Length, Point, + Rectangle, Renderer, Settings, Subscription, Theme, }; pub fn main() -> iced::Result { @@ -167,10 +167,6 @@ impl Example { title: "Application", view: application, }, - Self { - title: "Nested Quotes", - view: nested_quotes, - }, ]; fn is_first(self) -> bool { @@ -304,38 +300,6 @@ fn application<'a>() -> Element<'a, Message> { column![header, row![sidebar, content]].into() } -fn nested_quotes<'a>() -> Element<'a, Message> { - (1..5) - .fold(column![text("Original text")].padding(10), |quotes, i| { - column![ - container( - row![vertical_rule(2), quotes].height(Length::Shrink) - ) - .style(|theme: &Theme| { - let palette = theme.extended_palette(); - - container::Appearance::default().with_background( - if palette.is_dark { - Color { - a: 0.01, - ..Color::WHITE - } - } else { - Color { - a: 0.08, - ..Color::BLACK - } - }, - ) - }), - text(format!("Reply {i}")) - ] - .spacing(10) - .padding(10) - }) - .into() -} - fn square<'a>(size: impl Into<Length> + Copy) -> Element<'a, Message> { struct Square; |