summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorLibravatar Cory Forsstrom <cforsstrom18@gmail.com>2023-02-18 15:58:07 -0800
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-06-14 10:15:52 +0200
commit12c623f35bea0b76bae5e2eeb7d46390b8b9f0e4 (patch)
treef4a3a29de16848edd8d1674fe8e4bd98865143d0 /runtime
parentd4bb7c0b24e3bf7939bdecf2f3e1e0dba67587fc (diff)
downloadiced-12c623f35bea0b76bae5e2eeb7d46390b8b9f0e4.tar.gz
iced-12c623f35bea0b76bae5e2eeb7d46390b8b9f0e4.tar.bz2
iced-12c623f35bea0b76bae5e2eeb7d46390b8b9f0e4.zip
Cursor availability by layer
Diffstat (limited to 'runtime')
-rw-r--r--runtime/src/user_interface/overlay.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/runtime/src/user_interface/overlay.rs b/runtime/src/user_interface/overlay.rs
index 332eb32d..44f64c61 100644
--- a/runtime/src/user_interface/overlay.rs
+++ b/runtime/src/user_interface/overlay.rs
@@ -9,6 +9,7 @@ use crate::core::{
};
use std::cell::RefCell;
+use std::iter::Peekable;
/// An [`Overlay`] container that displays nested overlays
#[allow(missing_debug_implementations)]
@@ -92,7 +93,7 @@ where
) {
fn recurse<'a, Message, Renderer>(
element: &mut overlay::Element<'_, Message, Renderer>,
- mut layouts: impl Iterator<Item = Layout<'a>>,
+ mut layouts: Peekable<impl Iterator<Item = Layout<'a>>>,
renderer: &mut Renderer,
theme: &<Renderer as renderer::Renderer>::Theme,
style: &renderer::Style,
@@ -101,12 +102,33 @@ where
Renderer: renderer::Renderer,
{
if let Some(layout) = layouts.next() {
- renderer.with_layer(layout.bounds(), |renderer| {
- element.draw(renderer, theme, style, layout, cursor);
- });
+ let is_over = cursor
+ .position()
+ .and_then(|cursor_position| {
+ layouts.peek().and_then(|nested_layout| {
+ element.overlay(layout, renderer).map(|overlay| {
+ overlay.is_over(
+ *nested_layout,
+ renderer,
+ cursor_position,
+ )
+ })
+ })
+ })
+ .unwrap_or_default();
renderer.with_layer(layout.bounds(), |renderer| {
- element.draw(renderer, theme, style, layout, cursor);
+ element.draw(
+ renderer,
+ theme,
+ style,
+ layout,
+ if is_over {
+ mouse::Cursor::Unavailable
+ } else {
+ cursor
+ },
+ );
});
if let Some(mut overlay) = element.overlay(layout, renderer) {
@@ -123,7 +145,7 @@ where
}
self.overlay.with_element_mut(|element| {
- let layouts = layout.children();
+ let layouts = layout.children().peekable();
recurse(element, layouts, renderer, theme, style, cursor);
})