Merge pull request #2345 from iced-rs/fix/responsive-layout-invalidation
Fix layout invalidation for `Responsive` widget
This commit is contained in:
commit
3013463baa
2 changed files with 36 additions and 11 deletions
|
|
@ -478,12 +478,14 @@ where
|
||||||
translation: Vector,
|
translation: Vector,
|
||||||
) -> Option<overlay::Element<'b, Message, Theme, Renderer>> {
|
) -> Option<overlay::Element<'b, Message, Theme, Renderer>> {
|
||||||
self.rebuild_element_if_necessary();
|
self.rebuild_element_if_necessary();
|
||||||
|
|
||||||
let tree = tree
|
let tree = tree
|
||||||
.state
|
.state
|
||||||
.downcast_mut::<Rc<RefCell<Option<Tree>>>>()
|
.downcast_mut::<Rc<RefCell<Option<Tree>>>>()
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.take()
|
.take()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let overlay = Overlay(Some(
|
let overlay = Overlay(Some(
|
||||||
InnerBuilder {
|
InnerBuilder {
|
||||||
instance: self,
|
instance: self,
|
||||||
|
|
|
||||||
|
|
@ -308,10 +308,13 @@ where
|
||||||
content_layout_node.as_ref().unwrap(),
|
content_layout_node.as_ref().unwrap(),
|
||||||
);
|
);
|
||||||
|
|
||||||
element
|
(
|
||||||
.as_widget_mut()
|
element
|
||||||
.overlay(tree, content_layout, renderer, translation)
|
.as_widget_mut()
|
||||||
.map(|overlay| RefCell::new(Nested::new(overlay)))
|
.overlay(tree, content_layout, renderer, translation)
|
||||||
|
.map(|overlay| RefCell::new(Nested::new(overlay))),
|
||||||
|
content_layout_node,
|
||||||
|
)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
.build();
|
.build();
|
||||||
|
|
@ -341,7 +344,10 @@ struct Overlay<'a, 'b, Message, Theme, Renderer> {
|
||||||
|
|
||||||
#[borrows(mut content, mut tree)]
|
#[borrows(mut content, mut tree)]
|
||||||
#[not_covariant]
|
#[not_covariant]
|
||||||
overlay: Option<RefCell<Nested<'this, Message, Theme, Renderer>>>,
|
overlay: (
|
||||||
|
Option<RefCell<Nested<'this, Message, Theme, Renderer>>>,
|
||||||
|
&'this mut Option<layout::Node>,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'b, Message, Theme, Renderer>
|
impl<'a, 'b, Message, Theme, Renderer>
|
||||||
|
|
@ -351,7 +357,7 @@ impl<'a, 'b, Message, Theme, Renderer>
|
||||||
&self,
|
&self,
|
||||||
f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T,
|
f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T,
|
||||||
) -> Option<T> {
|
) -> Option<T> {
|
||||||
self.with_overlay(|overlay| {
|
self.with_overlay(|(overlay, _layout)| {
|
||||||
overlay.as_ref().map(|nested| (f)(&mut nested.borrow_mut()))
|
overlay.as_ref().map(|nested| (f)(&mut nested.borrow_mut()))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -360,7 +366,7 @@ impl<'a, 'b, Message, Theme, Renderer>
|
||||||
&mut self,
|
&mut self,
|
||||||
f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T,
|
f: impl FnOnce(&mut Nested<'_, Message, Theme, Renderer>) -> T,
|
||||||
) -> Option<T> {
|
) -> Option<T> {
|
||||||
self.with_overlay_mut(|overlay| {
|
self.with_overlay_mut(|(overlay, _layout)| {
|
||||||
overlay.as_mut().map(|nested| (f)(nested.get_mut()))
|
overlay.as_mut().map(|nested| (f)(nested.get_mut()))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -412,10 +418,27 @@ where
|
||||||
clipboard: &mut dyn Clipboard,
|
clipboard: &mut dyn Clipboard,
|
||||||
shell: &mut Shell<'_, Message>,
|
shell: &mut Shell<'_, Message>,
|
||||||
) -> event::Status {
|
) -> event::Status {
|
||||||
self.with_overlay_mut_maybe(|overlay| {
|
let mut is_layout_invalid = false;
|
||||||
overlay.on_event(event, layout, cursor, renderer, clipboard, shell)
|
|
||||||
})
|
let event_status = self
|
||||||
.unwrap_or(event::Status::Ignored)
|
.with_overlay_mut_maybe(|overlay| {
|
||||||
|
let event_status = overlay.on_event(
|
||||||
|
event, layout, cursor, renderer, clipboard, shell,
|
||||||
|
);
|
||||||
|
|
||||||
|
is_layout_invalid = shell.is_layout_invalid();
|
||||||
|
|
||||||
|
event_status
|
||||||
|
})
|
||||||
|
.unwrap_or(event::Status::Ignored);
|
||||||
|
|
||||||
|
if is_layout_invalid {
|
||||||
|
self.with_overlay_mut(|(_overlay, layout)| {
|
||||||
|
**layout = None;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
event_status
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_over(
|
fn is_over(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue