summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector@hecrj.dev>2024-03-03 01:21:04 +0100
committerLibravatar GitHub <noreply@github.com>2024-03-03 01:21:04 +0100
commit1bb5a1b9a23e1c4739430ac87ca33b06c2f4d9df (patch)
tree23fa181e9a5a8aad983d9e623e14fa8524592691
parentaf9fb367f361a564aa2a9fc11333816566eb5d55 (diff)
parentcbe4603579c6af55c35254257981e14cd4a67897 (diff)
downloadiced-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.rs67
-rw-r--r--examples/layout/src/main.rs42
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;