diff options
author | 2022-02-12 14:07:04 +0700 | |
---|---|---|
committer | 2022-02-12 14:07:04 +0700 | |
commit | 182fb9446c577a6be988052a5103010e1a79addd (patch) | |
tree | 142dafc8fd6821dd4800828b1063cb3e505a704b /native/src/widget/container.rs | |
parent | 8b27083cdaa2ef7b749e0fd2c1a94b5606ed1c3d (diff) | |
download | iced-182fb9446c577a6be988052a5103010e1a79addd.tar.gz iced-182fb9446c577a6be988052a5103010e1a79addd.tar.bz2 iced-182fb9446c577a6be988052a5103010e1a79addd.zip |
Implement `Container` widget in `iced_pure`
Diffstat (limited to 'native/src/widget/container.rs')
-rw-r--r-- | native/src/widget/container.rs | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs index 4444732a..90db7e33 100644 --- a/native/src/widget/container.rs +++ b/native/src/widget/container.rs @@ -118,6 +118,32 @@ where } } +/// Computes the layout of a [`Container`]. +pub fn layout<Renderer>( + renderer: &Renderer, + limits: &layout::Limits, + width: Length, + height: Length, + padding: Padding, + horizontal_alignment: alignment::Horizontal, + vertical_alignment: alignment::Vertical, + layout_content: impl FnOnce(&Renderer, &layout::Limits) -> layout::Node, +) -> layout::Node { + let limits = limits.loose().width(width).height(height).pad(padding); + + let mut content = layout_content(renderer, &limits.loose()); + let size = limits.resolve(content.size()); + + content.move_to(Point::new(padding.left.into(), padding.top.into())); + content.align( + Alignment::from(horizontal_alignment), + Alignment::from(vertical_alignment), + size, + ); + + layout::Node::with_children(size.pad(padding), vec![content]) +} + impl<'a, Message, Renderer> Widget<Message, Renderer> for Container<'a, Message, Renderer> where @@ -136,28 +162,16 @@ where renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits - .loose() - .max_width(self.max_width) - .max_height(self.max_height) - .width(self.width) - .height(self.height) - .pad(self.padding); - - let mut content = self.content.layout(renderer, &limits.loose()); - let size = limits.resolve(content.size()); - - content.move_to(Point::new( - self.padding.left.into(), - self.padding.top.into(), - )); - content.align( - Alignment::from(self.horizontal_alignment), - Alignment::from(self.vertical_alignment), - size, - ); - - layout::Node::with_children(size.pad(self.padding), vec![content]) + layout( + renderer, + limits, + self.width, + self.height, + self.padding, + self.horizontal_alignment, + self.vertical_alignment, + |renderer, limits| self.content.layout(renderer, limits), + ) } fn on_event( |