fix: drop remaining component overlay events if closed during event batch processing
This commit is contained in:
parent
042a294448
commit
44c0d75953
1 changed files with 26 additions and 23 deletions
|
|
@ -258,12 +258,11 @@ struct Overlay<'a, 'b, Message, Renderer, Event> {
|
||||||
impl<'a, 'b, Message, Renderer, Event>
|
impl<'a, 'b, Message, Renderer, Event>
|
||||||
Overlay<'a, 'b, Message, Renderer, Event>
|
Overlay<'a, 'b, Message, Renderer, Event>
|
||||||
{
|
{
|
||||||
fn with_overlay<T>(
|
fn with_overlay_maybe<T>(
|
||||||
&self,
|
&self,
|
||||||
f: impl FnOnce(&overlay::Element<'_, Event, Renderer>) -> T,
|
f: impl FnOnce(&overlay::Element<'_, Event, Renderer>) -> T,
|
||||||
) -> T {
|
) -> Option<T> {
|
||||||
f(self
|
self.instance
|
||||||
.instance
|
|
||||||
.state
|
.state
|
||||||
.borrow()
|
.borrow()
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
|
@ -273,13 +272,13 @@ impl<'a, 'b, Message, Renderer, Event>
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.borrow_overlay()
|
.borrow_overlay()
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.unwrap())
|
.map(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_overlay_mut<T>(
|
fn with_overlay_mut_maybe<T>(
|
||||||
&self,
|
&self,
|
||||||
f: impl FnOnce(&mut overlay::Element<'_, Event, Renderer>) -> T,
|
f: impl FnOnce(&mut overlay::Element<'_, Event, Renderer>) -> T,
|
||||||
) -> T {
|
) -> Option<T> {
|
||||||
self.instance
|
self.instance
|
||||||
.state
|
.state
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
|
|
@ -289,7 +288,7 @@ impl<'a, 'b, Message, Renderer, Event>
|
||||||
cache
|
cache
|
||||||
.as_mut()
|
.as_mut()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_overlay_mut(|overlay| f(overlay.as_mut().unwrap()))
|
.with_overlay_mut(|overlay| overlay.as_mut().map(f))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -305,11 +304,12 @@ where
|
||||||
bounds: Size,
|
bounds: Size,
|
||||||
position: Point,
|
position: Point,
|
||||||
) -> layout::Node {
|
) -> layout::Node {
|
||||||
self.with_overlay(|overlay| {
|
self.with_overlay_maybe(|overlay| {
|
||||||
let vector = position - overlay.position();
|
let vector = position - overlay.position();
|
||||||
|
|
||||||
overlay.layout(renderer, bounds).translate(vector)
|
overlay.layout(renderer, bounds).translate(vector)
|
||||||
})
|
})
|
||||||
|
.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw(
|
fn draw(
|
||||||
|
|
@ -319,9 +319,9 @@ where
|
||||||
layout: Layout<'_>,
|
layout: Layout<'_>,
|
||||||
cursor_position: Point,
|
cursor_position: Point,
|
||||||
) {
|
) {
|
||||||
self.with_overlay(|overlay| {
|
self.with_overlay_maybe(|overlay| {
|
||||||
overlay.draw(renderer, style, layout, cursor_position);
|
overlay.draw(renderer, style, layout, cursor_position);
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mouse_interaction(
|
fn mouse_interaction(
|
||||||
|
|
@ -330,9 +330,10 @@ where
|
||||||
cursor_position: Point,
|
cursor_position: Point,
|
||||||
viewport: &Rectangle,
|
viewport: &Rectangle,
|
||||||
) -> mouse::Interaction {
|
) -> mouse::Interaction {
|
||||||
self.with_overlay(|overlay| {
|
self.with_overlay_maybe(|overlay| {
|
||||||
overlay.mouse_interaction(layout, cursor_position, viewport)
|
overlay.mouse_interaction(layout, cursor_position, viewport)
|
||||||
})
|
})
|
||||||
|
.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn hash_layout(&self, state: &mut Hasher, position: Point) {
|
fn hash_layout(&self, state: &mut Hasher, position: Point) {
|
||||||
|
|
@ -342,7 +343,7 @@ where
|
||||||
(position.x as u32).hash(state);
|
(position.x as u32).hash(state);
|
||||||
(position.y as u32).hash(state);
|
(position.y as u32).hash(state);
|
||||||
|
|
||||||
self.with_overlay(|overlay| {
|
self.with_overlay_maybe(|overlay| {
|
||||||
overlay.hash_layout(state);
|
overlay.hash_layout(state);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -359,16 +360,18 @@ where
|
||||||
let mut local_messages = Vec::new();
|
let mut local_messages = Vec::new();
|
||||||
let mut local_shell = Shell::new(&mut local_messages);
|
let mut local_shell = Shell::new(&mut local_messages);
|
||||||
|
|
||||||
let event_status = self.with_overlay_mut(|overlay| {
|
let event_status = self
|
||||||
overlay.on_event(
|
.with_overlay_mut_maybe(|overlay| {
|
||||||
event,
|
overlay.on_event(
|
||||||
layout,
|
event,
|
||||||
cursor_position,
|
layout,
|
||||||
renderer,
|
cursor_position,
|
||||||
clipboard,
|
renderer,
|
||||||
&mut local_shell,
|
clipboard,
|
||||||
)
|
&mut local_shell,
|
||||||
});
|
)
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|| iced_native::event::Status::Ignored);
|
||||||
|
|
||||||
if !local_messages.is_empty() {
|
if !local_messages.is_empty() {
|
||||||
let mut component =
|
let mut component =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue