summaryrefslogtreecommitdiffstats
path: root/lazy/src/responsive.rs
diff options
context:
space:
mode:
authorLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-04-17 18:11:50 -0700
committerLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-04-17 18:11:50 -0700
commit07dfebfec00b29ef84a1624ac942bb433628eff6 (patch)
treea7dad2781a3ef4b7b9c81f2afebfc2a4878e399a /lazy/src/responsive.rs
parent4b05f42fd6d18bf572b772dd60d6a4309ea5f343 (diff)
downloadiced-07dfebfec00b29ef84a1624ac942bb433628eff6.tar.gz
iced-07dfebfec00b29ef84a1624ac942bb433628eff6.tar.bz2
iced-07dfebfec00b29ef84a1624ac942bb433628eff6.zip
Invalidate responsive layout when layout is called
Diffstat (limited to '')
-rw-r--r--lazy/src/responsive.rs51
1 files changed, 26 insertions, 25 deletions
diff --git a/lazy/src/responsive.rs b/lazy/src/responsive.rs
index 57c07de1..cdeec2ad 100644
--- a/lazy/src/responsive.rs
+++ b/lazy/src/responsive.rs
@@ -41,7 +41,7 @@ where
view: Box::new(view),
content: RefCell::new(Content {
size: Size::ZERO,
- layout: layout::Node::new(Size::ZERO),
+ layout: None,
element: Element::new(horizontal_space(0)),
}),
}
@@ -50,7 +50,7 @@ where
struct Content<'a, Message, Renderer> {
size: Size,
- layout: layout::Node,
+ layout: Option<layout::Node>,
element: Element<'a, Message, Renderer>,
}
@@ -58,10 +58,21 @@ impl<'a, Message, Renderer> Content<'a, Message, Renderer>
where
Renderer: iced_native::Renderer,
{
+ fn layout(&mut self, renderer: &Renderer) -> layout::Node {
+ if self.layout.is_none() {
+ self.layout =
+ Some(self.element.as_widget().layout(
+ renderer,
+ &layout::Limits::new(Size::ZERO, self.size),
+ ));
+ }
+
+ self.layout.clone().unwrap()
+ }
+
fn update(
&mut self,
tree: &mut Tree,
- renderer: &Renderer,
new_size: Size,
view: &dyn Fn(Size) -> Element<'a, Message, Renderer>,
) {
@@ -73,11 +84,6 @@ where
self.size = new_size;
tree.diff(&self.element);
-
- self.layout = self
- .element
- .as_widget()
- .layout(renderer, &layout::Limits::new(Size::ZERO, self.size));
}
fn resolve<R, T>(
@@ -96,12 +102,12 @@ where
where
R: Deref<Target = Renderer>,
{
- self.update(tree, renderer.deref(), layout.bounds().size(), view);
+ self.update(tree, layout.bounds().size(), view);
- let content_layout = Layout::with_offset(
- layout.position() - Point::ORIGIN,
- &self.layout,
- );
+ let node = self.layout(renderer.deref());
+
+ let content_layout =
+ Layout::with_offset(layout.position() - Point::ORIGIN, &node);
f(tree, renderer, content_layout, &mut self.element)
}
@@ -139,6 +145,8 @@ where
_renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
+ let _ = self.content.borrow_mut().layout.take();
+
layout::Node::new(limits.max())
}
@@ -272,22 +280,15 @@ where
tree: state.tree.borrow_mut(),
types: PhantomData,
overlay_builder: |content: &mut RefMut<Content<_, _>>, tree| {
- content.update(
- tree,
- renderer,
- layout.bounds().size(),
- &self.view,
- );
+ content.update(tree, layout.bounds().size(), &self.view);
+
+ let node = content.layout(renderer);
- let Content {
- element,
- layout: content_layout,
- ..
- } = content.deref_mut();
+ let Content { element, .. } = content.deref_mut();
let content_layout = Layout::with_offset(
layout.bounds().position() - Point::ORIGIN,
- content_layout,
+ &node,
);
element