Invalidate responsive layout when layout is called
This commit is contained in:
parent
4b05f42fd6
commit
07dfebfec0
1 changed files with 26 additions and 25 deletions
|
|
@ -41,7 +41,7 @@ where
|
||||||
view: Box::new(view),
|
view: Box::new(view),
|
||||||
content: RefCell::new(Content {
|
content: RefCell::new(Content {
|
||||||
size: Size::ZERO,
|
size: Size::ZERO,
|
||||||
layout: layout::Node::new(Size::ZERO),
|
layout: None,
|
||||||
element: Element::new(horizontal_space(0)),
|
element: Element::new(horizontal_space(0)),
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
@ -50,7 +50,7 @@ where
|
||||||
|
|
||||||
struct Content<'a, Message, Renderer> {
|
struct Content<'a, Message, Renderer> {
|
||||||
size: Size,
|
size: Size,
|
||||||
layout: layout::Node,
|
layout: Option<layout::Node>,
|
||||||
element: Element<'a, Message, Renderer>,
|
element: Element<'a, Message, Renderer>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -58,10 +58,21 @@ impl<'a, Message, Renderer> Content<'a, Message, Renderer>
|
||||||
where
|
where
|
||||||
Renderer: iced_native::Renderer,
|
Renderer: iced_native::Renderer,
|
||||||
{
|
{
|
||||||
|
fn layout(&mut self, renderer: &Renderer) -> layout::Node {
|
||||||
|
if self.layout.is_none() {
|
||||||
|
self.layout =
|
||||||
|
Some(self.element.as_widget().layout(
|
||||||
|
renderer,
|
||||||
|
&layout::Limits::new(Size::ZERO, self.size),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
self.layout.clone().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
fn update(
|
fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
tree: &mut Tree,
|
tree: &mut Tree,
|
||||||
renderer: &Renderer,
|
|
||||||
new_size: Size,
|
new_size: Size,
|
||||||
view: &dyn Fn(Size) -> Element<'a, Message, Renderer>,
|
view: &dyn Fn(Size) -> Element<'a, Message, Renderer>,
|
||||||
) {
|
) {
|
||||||
|
|
@ -73,11 +84,6 @@ where
|
||||||
self.size = new_size;
|
self.size = new_size;
|
||||||
|
|
||||||
tree.diff(&self.element);
|
tree.diff(&self.element);
|
||||||
|
|
||||||
self.layout = self
|
|
||||||
.element
|
|
||||||
.as_widget()
|
|
||||||
.layout(renderer, &layout::Limits::new(Size::ZERO, self.size));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve<R, T>(
|
fn resolve<R, T>(
|
||||||
|
|
@ -96,12 +102,12 @@ where
|
||||||
where
|
where
|
||||||
R: Deref<Target = Renderer>,
|
R: Deref<Target = Renderer>,
|
||||||
{
|
{
|
||||||
self.update(tree, renderer.deref(), layout.bounds().size(), view);
|
self.update(tree, layout.bounds().size(), view);
|
||||||
|
|
||||||
let content_layout = Layout::with_offset(
|
let node = self.layout(renderer.deref());
|
||||||
layout.position() - Point::ORIGIN,
|
|
||||||
&self.layout,
|
let content_layout =
|
||||||
);
|
Layout::with_offset(layout.position() - Point::ORIGIN, &node);
|
||||||
|
|
||||||
f(tree, renderer, content_layout, &mut self.element)
|
f(tree, renderer, content_layout, &mut self.element)
|
||||||
}
|
}
|
||||||
|
|
@ -139,6 +145,8 @@ where
|
||||||
_renderer: &Renderer,
|
_renderer: &Renderer,
|
||||||
limits: &layout::Limits,
|
limits: &layout::Limits,
|
||||||
) -> layout::Node {
|
) -> layout::Node {
|
||||||
|
let _ = self.content.borrow_mut().layout.take();
|
||||||
|
|
||||||
layout::Node::new(limits.max())
|
layout::Node::new(limits.max())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -272,22 +280,15 @@ where
|
||||||
tree: state.tree.borrow_mut(),
|
tree: state.tree.borrow_mut(),
|
||||||
types: PhantomData,
|
types: PhantomData,
|
||||||
overlay_builder: |content: &mut RefMut<Content<_, _>>, tree| {
|
overlay_builder: |content: &mut RefMut<Content<_, _>>, tree| {
|
||||||
content.update(
|
content.update(tree, layout.bounds().size(), &self.view);
|
||||||
tree,
|
|
||||||
renderer,
|
|
||||||
layout.bounds().size(),
|
|
||||||
&self.view,
|
|
||||||
);
|
|
||||||
|
|
||||||
let Content {
|
let node = content.layout(renderer);
|
||||||
element,
|
|
||||||
layout: content_layout,
|
let Content { element, .. } = content.deref_mut();
|
||||||
..
|
|
||||||
} = content.deref_mut();
|
|
||||||
|
|
||||||
let content_layout = Layout::with_offset(
|
let content_layout = Layout::with_offset(
|
||||||
layout.bounds().position() - Point::ORIGIN,
|
layout.bounds().position() - Point::ORIGIN,
|
||||||
content_layout,
|
&node,
|
||||||
);
|
);
|
||||||
|
|
||||||
element
|
element
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue