summaryrefslogtreecommitdiffstats
path: root/native/src/user_interface.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-03-01 14:02:46 +0700
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-03-01 14:02:46 +0700
commitf85b421ae7a029ea34c91be90da1a20505d6cd4b (patch)
treeb172d692d80d94d4eb43b6dc61b253bef83be626 /native/src/user_interface.rs
parentaf7cbf0003496d757696ea6e15ea32f0649cf8f9 (diff)
downloadiced-f85b421ae7a029ea34c91be90da1a20505d6cd4b.tar.gz
iced-f85b421ae7a029ea34c91be90da1a20505d6cd4b.tar.bz2
iced-f85b421ae7a029ea34c91be90da1a20505d6cd4b.zip
Fix overlay flickering after `Application::update`
Diffstat (limited to 'native/src/user_interface.rs')
-rw-r--r--native/src/user_interface.rs46
1 files changed, 26 insertions, 20 deletions
diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs
index 00015f8b..6fc6a479 100644
--- a/native/src/user_interface.rs
+++ b/native/src/user_interface.rs
@@ -345,30 +345,36 @@ where
let viewport = Rectangle::with_size(self.bounds);
- if let Some(layout) = &self.overlay {
- let base_cursor = if layout.bounds().contains(cursor_position) {
- Point::new(-1.0, -1.0)
- } else {
- cursor_position
- };
+ let base_cursor = if let Some(overlay) =
+ self.root.overlay(Layout::new(&self.base), renderer)
+ {
+ let overlay_layout = self
+ .overlay
+ .take()
+ .unwrap_or_else(|| overlay.layout(renderer, self.bounds));
- self.root.widget.draw(
- renderer,
- &renderer::Style::default(),
- Layout::new(&self.base),
- base_cursor,
- &viewport,
- );
+ let new_cursor_position =
+ if overlay_layout.bounds().contains(cursor_position) {
+ Point::new(-1.0, -1.0)
+ } else {
+ cursor_position
+ };
+
+ self.overlay = Some(overlay_layout);
+
+ new_cursor_position
} else {
- self.root.widget.draw(
- renderer,
- &renderer::Style::default(),
- Layout::new(&self.base),
- cursor_position,
- &viewport,
- );
+ cursor_position
};
+ self.root.widget.draw(
+ renderer,
+ &renderer::Style::default(),
+ Layout::new(&self.base),
+ base_cursor,
+ &viewport,
+ );
+
let base_interaction = self.root.widget.mouse_interaction(
Layout::new(&self.base),
cursor_position,