Allow &mut self in overlay
This commit is contained in:
parent
67420cb1e4
commit
f1ada7a803
17 changed files with 73 additions and 83 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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>>,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue