diff options
author | 2023-04-17 18:11:50 -0700 | |
---|---|---|
committer | 2023-04-17 18:11:50 -0700 | |
commit | 07dfebfec00b29ef84a1624ac942bb433628eff6 (patch) | |
tree | a7dad2781a3ef4b7b9c81f2afebfc2a4878e399a /lazy/src/responsive.rs | |
parent | 4b05f42fd6d18bf572b772dd60d6a4309ea5f343 (diff) | |
download | iced-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.rs | 51 |
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 |