diff options
Diffstat (limited to 'lazy/src')
| -rw-r--r-- | lazy/src/responsive.rs | 54 | 
1 files changed, 33 insertions, 21 deletions
diff --git a/lazy/src/responsive.rs b/lazy/src/responsive.rs index 57c07de1..d87815f6 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,19 @@ impl<'a, Message, Renderer> Content<'a, Message, Renderer>  where      Renderer: iced_native::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>,      ) { @@ -73,11 +82,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,11 +100,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) @@ -178,7 +183,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, @@ -191,10 +199,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( @@ -272,22 +288,18 @@ 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); +                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  | 
