Fix cursor passthrough in Stack during draw

This commit is contained in:
Héctor Ramón Jiménez 2024-08-14 18:02:33 +02:00
parent 8b45d620d0
commit 9ed7fb8866
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
2 changed files with 67 additions and 30 deletions

View file

@ -201,19 +201,21 @@ where
{ {
stack![ stack![
base.into(), base.into(),
mouse_area(center(opaque(content)).style(|_theme| { opaque(
container::Style { mouse_area(center(opaque(content)).style(|_theme| {
background: Some( container::Style {
Color { background: Some(
a: 0.8, Color {
..Color::BLACK a: 0.8,
} ..Color::BLACK
.into(), }
), .into(),
..container::Style::default() ),
} ..container::Style::default()
})) }
.on_press(on_blur) }))
.on_press(on_blur)
)
] ]
.into() .into()
} }

View file

@ -269,15 +269,53 @@ where
viewport: &Rectangle, viewport: &Rectangle,
) { ) {
if let Some(clipped_viewport) = layout.bounds().intersection(viewport) { if let Some(clipped_viewport) = layout.bounds().intersection(viewport) {
for (i, ((layer, state), layout)) in self let layers_below = if cursor == mouse::Cursor::Unavailable {
self.children.len()
} else {
self.children
.iter()
.rev()
.zip(tree.children.iter().rev())
.zip(layout.children().rev())
.position(|((layer, state), layout)| {
let interaction = layer.as_widget().mouse_interaction(
state, layout, cursor, viewport, renderer,
);
interaction != mouse::Interaction::None
})
.map(|i| self.children.len() - i - 1)
.unwrap_or(self.children.len())
};
let mut layers = self
.children .children
.iter() .iter()
.zip(&tree.children) .zip(&tree.children)
.zip(layout.children()) .zip(layout.children())
.enumerate() .enumerate();
{
if i > 0 { let layers = layers.by_ref();
renderer.with_layer(clipped_viewport, |renderer| {
let mut draw_layer =
|i,
layer: &Element<'a, Message, Theme, Renderer>,
state,
layout,
cursor| {
if i > 0 {
renderer.with_layer(clipped_viewport, |renderer| {
layer.as_widget().draw(
state,
renderer,
theme,
style,
layout,
cursor,
&clipped_viewport,
);
});
} else {
layer.as_widget().draw( layer.as_widget().draw(
state, state,
renderer, renderer,
@ -287,18 +325,15 @@ where
cursor, cursor,
&clipped_viewport, &clipped_viewport,
); );
}); }
} else { };
layer.as_widget().draw(
state, for (i, ((layer, state), layout)) in layers.take(layers_below) {
renderer, draw_layer(i, layer, state, layout, mouse::Cursor::Unavailable);
theme, }
style,
layout, for (i, ((layer, state), layout)) in layers {
cursor, draw_layer(i, layer, state, layout, cursor);
&clipped_viewport,
);
}
} }
} }
} }