Cursor availability by layer
This commit is contained in:
parent
d4bb7c0b24
commit
12c623f35b
1 changed files with 28 additions and 6 deletions
|
|
@ -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);
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue