From 07dfebfec00b29ef84a1624ac942bb433628eff6 Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Mon, 17 Apr 2023 18:11:50 -0700 Subject: Invalidate responsive layout when layout is called --- lazy/src/responsive.rs | 51 +++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'lazy') 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, 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( @@ -96,12 +102,12 @@ where where R: Deref, { - 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>, 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 -- cgit From ac7b77f59c720bdb618057df0435fa1170d9c84a Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Mon, 17 Apr 2023 18:40:41 -0700 Subject: Only invalidate layout if children layout is invalid --- lazy/src/responsive.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'lazy') diff --git a/lazy/src/responsive.rs b/lazy/src/responsive.rs index cdeec2ad..2f097ff5 100644 --- a/lazy/src/responsive.rs +++ b/lazy/src/responsive.rs @@ -145,8 +145,6 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let _ = self.content.borrow_mut().layout.take(); - layout::Node::new(limits.max()) } @@ -186,7 +184,10 @@ where let state = tree.state.downcast_mut::(); let mut content = self.content.borrow_mut(); - content.resolve( + let mut local_messages = vec![]; + let mut local_shell = Shell::new(&mut local_messages); + + let status = content.resolve( &mut state.tree.borrow_mut(), renderer, layout, @@ -199,10 +200,18 @@ where cursor_position, renderer, clipboard, - shell, + &mut local_shell, ) }, - ) + ); + + if local_shell.is_layout_invalid() { + let _ = content.layout.take(); + } + + shell.merge(local_shell, std::convert::identity); + + status } fn draw( -- cgit From f42fb6af54ea6057a8476704c6756b59c3f3d631 Mon Sep 17 00:00:00 2001 From: Cory Forsstrom Date: Mon, 17 Apr 2023 19:04:27 -0700 Subject: Update lazy/src/responsive.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Héctor Ramón --- lazy/src/responsive.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lazy') diff --git a/lazy/src/responsive.rs b/lazy/src/responsive.rs index 2f097ff5..88ed6312 100644 --- a/lazy/src/responsive.rs +++ b/lazy/src/responsive.rs @@ -206,7 +206,7 @@ where ); if local_shell.is_layout_invalid() { - let _ = content.layout.take(); + content.layout = None; } shell.merge(local_shell, std::convert::identity); -- cgit From ecc1a4509ab25611397386c9f9c85fe7b269fda3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 21 Apr 2023 21:40:43 +0200 Subject: Avoid cloning `layout::Node` in `Responsive` widget --- lazy/src/responsive.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'lazy') diff --git a/lazy/src/responsive.rs b/lazy/src/responsive.rs index 88ed6312..d87815f6 100644 --- a/lazy/src/responsive.rs +++ b/lazy/src/responsive.rs @@ -58,7 +58,7 @@ impl<'a, Message, Renderer> Content<'a, Message, Renderer> where Renderer: iced_native::Renderer, { - fn layout(&mut self, renderer: &Renderer) -> layout::Node { + fn layout(&mut self, renderer: &Renderer) { if self.layout.is_none() { self.layout = Some(self.element.as_widget().layout( @@ -66,8 +66,6 @@ where &layout::Limits::new(Size::ZERO, self.size), )); } - - self.layout.clone().unwrap() } fn update( @@ -103,11 +101,12 @@ where R: Deref, { self.update(tree, layout.bounds().size(), view); + self.layout(renderer.deref()); - let node = self.layout(renderer.deref()); - - let content_layout = - Layout::with_offset(layout.position() - Point::ORIGIN, &node); + let content_layout = Layout::with_offset( + layout.position() - Point::ORIGIN, + self.layout.as_ref().unwrap(), + ); f(tree, renderer, content_layout, &mut self.element) } @@ -290,14 +289,17 @@ where types: PhantomData, overlay_builder: |content: &mut RefMut>, tree| { content.update(tree, layout.bounds().size(), &self.view); + content.layout(renderer); - let node = content.layout(renderer); - - let Content { element, .. } = content.deref_mut(); + let Content { + element, + layout: content_layout_node, + .. + } = content.deref_mut(); let content_layout = Layout::with_offset( layout.bounds().position() - Point::ORIGIN, - &node, + content_layout_node.as_ref().unwrap(), ); element -- cgit