Merge pull request #2345 from iced-rs/fix/responsive-layout-invalidation

Fix layout invalidation for `Responsive` widget
This commit is contained in:
Héctor Ramón 2024-03-21 00:47:09 +01:00 committed by GitHub
commit 3013463baa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 36 additions and 11 deletions

View file

@ -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,

View file

@ -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(