diff options
author | 2023-05-02 06:40:48 +0200 | |
---|---|---|
committer | 2023-05-02 06:40:48 +0200 | |
commit | 8e8808f0e187ed6671441f5016f07bfcba426452 (patch) | |
tree | bc4d2eeb57f60e654a4a8ed7c562f79ee507abab /widget/src/lazy | |
parent | 2d7d9a130ece3fb6fa4cd52f9b32b4abd7887cf5 (diff) | |
parent | c8952ee4a1118fe67bfdf40fc77f3ff30f5d0278 (diff) | |
download | iced-8e8808f0e187ed6671441f5016f07bfcba426452.tar.gz iced-8e8808f0e187ed6671441f5016f07bfcba426452.tar.bz2 iced-8e8808f0e187ed6671441f5016f07bfcba426452.zip |
Merge branch 'master' into advanced-text
Diffstat (limited to 'widget/src/lazy')
-rw-r--r-- | widget/src/lazy/responsive.rs | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs index 7b2fc37c..b41d978b 100644 --- a/widget/src/lazy/responsive.rs +++ b/widget/src/lazy/responsive.rs @@ -42,7 +42,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)), }), } @@ -51,7 +51,7 @@ where struct Content<'a, Message, Renderer> { size: Size, - layout: layout::Node, + layout: Option<layout::Node>, element: Element<'a, Message, Renderer>, } @@ -59,10 +59,19 @@ impl<'a, Message, Renderer> Content<'a, Message, Renderer> where Renderer: core::Renderer, { + fn layout(&mut self, renderer: &Renderer) { + if self.layout.is_none() { + self.layout = + Some(self.element.as_widget().layout( + renderer, + &layout::Limits::new(Size::ZERO, self.size), + )); + } + } + fn update( &mut self, tree: &mut Tree, - renderer: &Renderer, new_size: Size, view: &dyn Fn(Size) -> Element<'a, Message, Renderer>, ) { @@ -74,11 +83,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>( @@ -97,11 +101,12 @@ where where R: Deref<Target = Renderer>, { - self.update(tree, renderer.deref(), layout.bounds().size(), view); + self.update(tree, layout.bounds().size(), view); + self.layout(renderer.deref()); let content_layout = Layout::with_offset( layout.position() - Point::ORIGIN, - &self.layout, + self.layout.as_ref().unwrap(), ); f(tree, renderer, content_layout, &mut self.element) @@ -179,7 +184,10 @@ where let state = tree.state.downcast_mut::<State>(); 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, @@ -192,10 +200,18 @@ where cursor_position, renderer, clipboard, - shell, + &mut local_shell, ) }, - ) + ); + + if local_shell.is_layout_invalid() { + content.layout = None; + } + + shell.merge(local_shell, std::convert::identity); + + status } fn draw( @@ -274,22 +290,18 @@ where 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); + content.layout(renderer); let Content { element, - layout: content_layout, + layout: content_layout_node, .. } = content.deref_mut(); let content_layout = Layout::with_offset( layout.bounds().position() - Point::ORIGIN, - content_layout, + content_layout_node.as_ref().unwrap(), ); element |