Use nested for lazy widgets

This commit is contained in:
Cory Forsstrom 2023-02-19 17:43:13 -08:00 committed by Héctor Ramón Jiménez
parent 4de6ee6fa1
commit b0205e03d8
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
7 changed files with 77 additions and 49 deletions

View file

@ -20,6 +20,7 @@ use crate::core::Element;
use crate::core::{
self, Clipboard, Hasher, Length, Point, Rectangle, Shell, Size,
};
use crate::runtime::overlay::Nested;
use ouroboros::self_referencing;
use std::cell::RefCell;
@ -260,14 +261,17 @@ where
.unwrap(),
tree: &mut tree.children[0],
overlay_builder: |element, tree| {
element.as_widget_mut().overlay(tree, layout, renderer)
element
.as_widget_mut()
.overlay(tree, layout, renderer)
.map(|overlay| RefCell::new(Nested::new(overlay)))
},
}
.build(),
));
let has_overlay = overlay
.with_overlay_maybe(|overlay| overlay::Element::position(overlay));
let has_overlay =
overlay.with_overlay_maybe(|overlay| overlay.position());
has_overlay
.map(|position| overlay::Element::new(position, Box::new(overlay)))
@ -285,8 +289,8 @@ where
tree: &'a mut Tree,
#[borrows(mut element, mut tree)]
#[covariant]
overlay: Option<overlay::Element<'this, Message, Renderer>>,
#[not_covariant]
overlay: Option<RefCell<Nested<'this, Message, Renderer>>>,
}
struct Overlay<'a, Message, Renderer>(Option<Inner<'a, Message, Renderer>>);
@ -301,19 +305,20 @@ impl<'a, Message, Renderer> Drop for Overlay<'a, Message, Renderer> {
impl<'a, Message, Renderer> Overlay<'a, Message, Renderer> {
fn with_overlay_maybe<T>(
&self,
f: impl FnOnce(&overlay::Element<'_, Message, Renderer>) -> T,
f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T,
) -> Option<T> {
self.0.as_ref().unwrap().borrow_overlay().as_ref().map(f)
self.0.as_ref().unwrap().with_overlay(|overlay| {
overlay.as_ref().map(|nested| (f)(&mut nested.borrow_mut()))
})
}
fn with_overlay_mut_maybe<T>(
&mut self,
f: impl FnOnce(&mut overlay::Element<'_, Message, Renderer>) -> T,
f: impl FnOnce(&mut Nested<'_, Message, Renderer>) -> T,
) -> Option<T> {
self.0
.as_mut()
.unwrap()
.with_overlay_mut(|overlay| overlay.as_mut().map(f))
self.0.as_mut().unwrap().with_overlay_mut(|overlay| {
overlay.as_mut().map(|nested| (f)(nested.get_mut()))
})
}
}
@ -329,9 +334,7 @@ where
position: Point,
) -> layout::Node {
self.with_overlay_maybe(|overlay| {
let translation = position - overlay.position();
overlay.layout(renderer, bounds, translation)
overlay.layout(renderer, bounds, position)
})
.unwrap_or_default()
}