Cursor availability by layer

This commit is contained in:
Cory Forsstrom 2023-02-18 15:58:07 -08:00 committed by Héctor Ramón Jiménez
parent d4bb7c0b24
commit 12c623f35b
No known key found for this signature in database
GPG key ID: 140CC052C94F138E

View file

@ -9,6 +9,7 @@ use crate::core::{
}; };
use std::cell::RefCell; use std::cell::RefCell;
use std::iter::Peekable;
/// An [`Overlay`] container that displays nested overlays /// An [`Overlay`] container that displays nested overlays
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
@ -92,7 +93,7 @@ where
) { ) {
fn recurse<'a, Message, Renderer>( fn recurse<'a, Message, Renderer>(
element: &mut overlay::Element<'_, 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, renderer: &mut Renderer,
theme: &<Renderer as renderer::Renderer>::Theme, theme: &<Renderer as renderer::Renderer>::Theme,
style: &renderer::Style, style: &renderer::Style,
@ -101,12 +102,33 @@ where
Renderer: renderer::Renderer, Renderer: renderer::Renderer,
{ {
if let Some(layout) = layouts.next() { if let Some(layout) = layouts.next() {
renderer.with_layer(layout.bounds(), |renderer| { let is_over = cursor
element.draw(renderer, theme, style, layout, 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| { 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) { if let Some(mut overlay) = element.overlay(layout, renderer) {
@ -123,7 +145,7 @@ where
} }
self.overlay.with_element_mut(|element| { self.overlay.with_element_mut(|element| {
let layouts = layout.children(); let layouts = layout.children().peekable();
recurse(element, layouts, renderer, theme, style, cursor); recurse(element, layouts, renderer, theme, style, cursor);
}) })