diff options
| author | 2022-11-29 21:50:27 +0100 | |
|---|---|---|
| committer | 2022-11-29 21:50:27 +0100 | |
| commit | 23da5a32515a2eaf567d35d1b81e4b8400a27219 (patch) | |
| tree | 17b503307d94ccac239f79f0fc9c3d532732be24 /lazy | |
| parent | 67420cb1e4ac8f7819ee5775c52676c6b7b58718 (diff) | |
| parent | f1ada7a803998ac3fb2c1bedc6d6650264f3e603 (diff) | |
| download | iced-23da5a32515a2eaf567d35d1b81e4b8400a27219.tar.gz iced-23da5a32515a2eaf567d35d1b81e4b8400a27219.tar.bz2 iced-23da5a32515a2eaf567d35d1b81e4b8400a27219.zip | |
Merge pull request #1563 from tarkah/fix/overlay-mutable
Allow &mut self in overlay
Diffstat (limited to 'lazy')
| -rw-r--r-- | lazy/src/component.rs | 31 | ||||
| -rw-r--r-- | lazy/src/lazy.rs | 27 | ||||
| -rw-r--r-- | lazy/src/responsive.rs | 22 | 
3 files changed, 35 insertions, 45 deletions
| diff --git a/lazy/src/component.rs b/lazy/src/component.rs index 4f1df650..3d7b8758 100644 --- a/lazy/src/component.rs +++ b/lazy/src/component.rs @@ -11,7 +11,7 @@ use iced_native::{  };  use ouroboros::self_referencing; -use std::cell::{Ref, RefCell}; +use std::cell::RefCell;  use std::marker::PhantomData;  /// A reusable, custom widget that uses The Elm Architecture. @@ -322,25 +322,25 @@ where      }      fn overlay<'b>( -        &'b self, +        &'b mut self,          tree: &'b mut Tree,          layout: Layout<'_>,          renderer: &Renderer,      ) -> Option<overlay::Element<'b, Message, Renderer>> {          let overlay = OverlayBuilder {              instance: self, -            instance_ref_builder: |instance| instance.state.borrow(),              tree,              types: PhantomData,              overlay_builder: |instance, tree| { -                instance -                    .as_ref() -                    .unwrap() -                    .borrow_element() -                    .as_ref() -                    .unwrap() -                    .as_widget() -                    .overlay(&mut tree.children[0], layout, renderer) +                instance.state.get_mut().as_mut().unwrap().with_element_mut( +                    move |element| { +                        element.as_mut().unwrap().as_widget_mut().overlay( +                            &mut tree.children[0], +                            layout, +                            renderer, +                        ) +                    }, +                )              },          }          .build(); @@ -362,15 +362,11 @@ where  #[self_referencing]  struct Overlay<'a, 'b, Message, Renderer, Event, S> { -    instance: &'a Instance<'b, Message, Renderer, Event, S>, +    instance: &'a mut Instance<'b, Message, Renderer, Event, S>,      tree: &'a mut Tree,      types: PhantomData<(Message, Event, S)>, -    #[borrows(instance)] -    #[covariant] -    instance_ref: Ref<'this, Option<State<'a, Message, Renderer, Event, S>>>, - -    #[borrows(instance_ref, mut tree)] +    #[borrows(mut instance, mut tree)]      #[covariant]      overlay: Option<overlay::Element<'this, Event, Renderer>>,  } @@ -514,7 +510,6 @@ where              self.overlay = Some(                  OverlayBuilder {                      instance: overlay.instance, -                    instance_ref_builder: |instance| instance.state.borrow(),                      tree: overlay.tree,                      types: PhantomData,                      overlay_builder: |_, _| None, diff --git a/lazy/src/lazy.rs b/lazy/src/lazy.rs index d61cc77e..2611dd10 100644 --- a/lazy/src/lazy.rs +++ b/lazy/src/lazy.rs @@ -207,7 +207,7 @@ where      }      fn overlay<'b>( -        &'b self, +        &'b mut self,          tree: &'b mut Tree,          layout: Layout<'_>,          renderer: &Renderer, @@ -216,12 +216,12 @@ where              cached: self,              tree: &mut tree.children[0],              types: PhantomData, -            element_ref_builder: |cached| cached.element.borrow(), -            element_builder: |element_ref| { -                element_ref.as_ref().unwrap().borrow() -            }, -            overlay_builder: |element, tree| { -                element.as_widget().overlay(tree, layout, renderer) +            overlay_builder: |cached, tree| { +                Rc::get_mut(cached.element.get_mut().as_mut().unwrap()) +                    .unwrap() +                    .get_mut() +                    .as_widget_mut() +                    .overlay(tree, layout, renderer)              },          }          .build(); @@ -237,20 +237,11 @@ where  #[self_referencing]  struct Overlay<'a, 'b, Message, Renderer, Dependency, View> { -    cached: &'a Lazy<'b, Message, Renderer, Dependency, View>, +    cached: &'a mut Lazy<'b, Message, Renderer, Dependency, View>,      tree: &'a mut Tree,      types: PhantomData<(Message, Dependency, View)>, -    #[borrows(cached)] -    #[covariant] -    element_ref: -        Ref<'this, Option<Rc<RefCell<Element<'static, Message, Renderer>>>>>, - -    #[borrows(element_ref)] -    #[covariant] -    element: Ref<'this, Element<'static, Message, Renderer>>, - -    #[borrows(element, mut tree)] +    #[borrows(mut cached, mut tree)]      #[covariant]      overlay: Option<overlay::Element<'this, Message, Renderer>>,  } diff --git a/lazy/src/responsive.rs b/lazy/src/responsive.rs index 0b7ae6de..5e1b5dff 100644 --- a/lazy/src/responsive.rs +++ b/lazy/src/responsive.rs @@ -235,18 +235,20 @@ where      }      fn overlay<'b>( -        &'b self, +        &'b mut self,          tree: &'b mut Tree,          layout: Layout<'_>,          renderer: &Renderer,      ) -> Option<overlay::Element<'b, Message, Renderer>> { +        use std::ops::DerefMut; +          let state = tree.state.downcast_ref::<State>();          let overlay = OverlayBuilder {              content: self.content.borrow_mut(),              tree: state.tree.borrow_mut(),              types: PhantomData, -            overlay_builder: |content, tree| { +            overlay_builder: |content: &mut RefMut<Content<_, _>>, tree| {                  content.update(                      tree,                      renderer, @@ -254,16 +256,18 @@ where                      &self.view,                  ); +                let Content { +                    element, layout, .. +                } = content.deref_mut(); +                  let content_layout = Layout::with_offset( -                    layout.position() - Point::ORIGIN, -                    &content.layout, +                    layout.bounds().position() - Point::ORIGIN, +                    layout,                  ); -                content.element.as_widget().overlay( -                    tree, -                    content_layout, -                    renderer, -                ) +                element +                    .as_widget_mut() +                    .overlay(tree, content_layout, renderer)              },          }          .build(); | 
