diff options
author | 2023-01-17 11:12:10 -0800 | |
---|---|---|
committer | 2023-01-17 11:12:10 -0800 | |
commit | 3ab679725526bd095cc1a160705312b16c408b92 (patch) | |
tree | 15822dd3684c6f5d1892eb5b15385157dbf72f08 /native | |
parent | b2a3a85acb2a0722e90c46b70d574f1d676da9d1 (diff) | |
download | iced-3ab679725526bd095cc1a160705312b16c408b92.tar.gz iced-3ab679725526bd095cc1a160705312b16c408b92.tar.bz2 iced-3ab679725526bd095cc1a160705312b16c408b92.zip |
New method to determine if overlay contains cursor
This is needed for "container" overlay's such as `Group` which should
only consider it's childrens layouts and not it's own when determining
if the cursor is captured by the overlay.
Diffstat (limited to 'native')
-rw-r--r-- | native/src/overlay.rs | 9 | ||||
-rw-r--r-- | native/src/overlay/element.rs | 17 | ||||
-rw-r--r-- | native/src/overlay/group.rs | 13 | ||||
-rw-r--r-- | native/src/user_interface.rs | 11 |
4 files changed, 48 insertions, 2 deletions
diff --git a/native/src/overlay.rs b/native/src/overlay.rs index e7394494..16d8bb31 100644 --- a/native/src/overlay.rs +++ b/native/src/overlay.rs @@ -89,6 +89,15 @@ where ) -> mouse::Interaction { mouse::Interaction::Idle } + + /// Whether the [`Overlay`] contains the cursor + fn contains_cursor( + &self, + layout: Layout<'_>, + cursor_position: Point, + ) -> bool { + layout.bounds().contains(cursor_position) + } } /// Returns a [`Group`] of overlay [`Element`] children. diff --git a/native/src/overlay/element.rs b/native/src/overlay/element.rs index 41a8a597..125258c5 100644 --- a/native/src/overlay/element.rs +++ b/native/src/overlay/element.rs @@ -115,6 +115,15 @@ where ) { self.overlay.operate(layout, renderer, operation); } + + /// Whether the [`Overlay`] contains the cursor + pub fn contains_cursor( + &self, + layout: Layout<'_>, + cursor_position: Point, + ) -> bool { + self.overlay.contains_cursor(layout, cursor_position) + } } struct Map<'a, A, B, Renderer> { @@ -252,4 +261,12 @@ where self.content .draw(renderer, theme, style, layout, cursor_position) } + + fn contains_cursor( + &self, + layout: Layout<'_>, + cursor_position: Point, + ) -> bool { + self.content.contains_cursor(layout, cursor_position) + } } diff --git a/native/src/overlay/group.rs b/native/src/overlay/group.rs index f894f911..96d10c19 100644 --- a/native/src/overlay/group.rs +++ b/native/src/overlay/group.rs @@ -151,6 +151,19 @@ where ) }); } + + fn contains_cursor( + &self, + layout: Layout<'_>, + cursor_position: Point, + ) -> bool { + self.children + .iter() + .zip(layout.children()) + .any(|(child, layout)| { + child.contains_cursor(layout, cursor_position) + }) + } } impl<'a, Message, Renderer> From<Group<'a, Message, Renderer>> diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 29cc3472..8659caa3 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -261,7 +261,11 @@ where } } - let base_cursor = if layout.bounds().contains(cursor_position) { + let base_cursor = if manual_overlay + .as_ref() + .unwrap() + .contains_cursor(Layout::new(&layout), cursor_position) + { // TODO: Type-safe cursor availability Point::new(-1.0, -1.0) } else { @@ -504,7 +508,10 @@ where ); }); - if overlay_bounds.contains(cursor_position) { + if overlay.contains_cursor( + Layout::new(layout), + cursor_position, + ) { overlay_interaction } else { base_interaction |