Implement Container widget in iced_pure

This commit is contained in:
Héctor Ramón Jiménez 2022-02-12 14:07:04 +07:00
parent 8b27083cda
commit 182fb9446c
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
3 changed files with 305 additions and 22 deletions

View file

@ -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(