Fix cursor passthrough in Stack during draw
This commit is contained in:
parent
8b45d620d0
commit
9ed7fb8866
2 changed files with 67 additions and 30 deletions
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue