Respect a div's own z-index when adding its event listeners

This commit is contained in:
Max Brunsfeld 2023-12-18 18:02:19 -08:00
parent ee8e1454fc
commit b88370d5ad
2 changed files with 539 additions and 540 deletions

View file

@ -778,9 +778,6 @@ impl Element for Div {
&mut element_state.interactive_state, &mut element_state.interactive_state,
cx, cx,
|style, scroll_offset, cx| { |style, scroll_offset, cx| {
let z_index = style.z_index.unwrap_or(0);
cx.with_z_index(z_index, |cx| {
style.paint(bounds, cx, |cx| { style.paint(bounds, cx, |cx| {
cx.with_text_style(style.text_style().cloned(), |cx| { cx.with_text_style(style.text_style().cloned(), |cx| {
cx.with_content_mask(style.overflow_mask(bounds), |cx| { cx.with_content_mask(style.overflow_mask(bounds), |cx| {
@ -791,7 +788,6 @@ impl Element for Div {
}) })
}) })
}) })
});
}) })
}, },
); );
@ -918,6 +914,8 @@ impl Interactivity {
return; return;
} }
let z_index = style.z_index.unwrap_or(0);
cx.with_z_index(z_index, |cx| {
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
if self.element_id.is_some() if self.element_id.is_some()
&& (style.debug || style.debug_below || cx.has_global::<crate::DebugBelow>()) && (style.debug || style.debug_below || cx.has_global::<crate::DebugBelow>())
@ -1034,7 +1032,7 @@ impl Interactivity {
.as_ref() .as_ref()
.is_some_and(|fill| fill.color().is_some_and(|color| !color.is_transparent())) .is_some_and(|fill| fill.color().is_some_and(|color| !color.is_transparent()))
{ {
cx.with_z_index(style.z_index.unwrap_or(0), |cx| cx.add_opaque_layer(bounds)) cx.add_opaque_layer(bounds)
} }
let interactive_bounds = InteractiveBounds { let interactive_bounds = InteractiveBounds {
@ -1189,13 +1187,15 @@ impl Interactivity {
let pending_mouse_down = pending_mouse_down.clone(); let pending_mouse_down = pending_mouse_down.clone();
move |event: &MouseMoveEvent, phase, cx| { move |event: &MouseMoveEvent, phase, cx| {
let mut pending_mouse_down = pending_mouse_down.borrow_mut(); let mut pending_mouse_down = pending_mouse_down.borrow_mut();
if let Some(mouse_down) = pending_mouse_down.clone() { if let Some(mouse_down) = pending_mouse_down.clone() {
if cx.active_drag.is_some() { if cx.active_drag.is_some() {
if phase == DispatchPhase::Capture { if phase == DispatchPhase::Capture {
cx.notify(); cx.notify();
} }
} else if phase == DispatchPhase::Bubble } else if phase == DispatchPhase::Bubble
&& (event.position - mouse_down.position).magnitude() > DRAG_THRESHOLD && (event.position - mouse_down.position).magnitude()
> DRAG_THRESHOLD
{ {
if let Some((drag_value, drag_listener)) = drag_listener.take() { if let Some((drag_value, drag_listener)) = drag_listener.take() {
*active_state.borrow_mut() = ElementClickedState::default(); *active_state.borrow_mut() = ElementClickedState::default();
@ -1364,8 +1364,8 @@ impl Interactivity {
let interactive_bounds = interactive_bounds.clone(); let interactive_bounds = interactive_bounds.clone();
cx.on_mouse_event(move |down: &MouseDownEvent, phase, cx| { cx.on_mouse_event(move |down: &MouseDownEvent, phase, cx| {
if phase == DispatchPhase::Bubble && !cx.default_prevented() { if phase == DispatchPhase::Bubble && !cx.default_prevented() {
let group = let group = active_group_bounds
active_group_bounds.map_or(false, |bounds| bounds.contains(&down.position)); .map_or(false, |bounds| bounds.contains(&down.position));
let element = interactive_bounds.visibly_contains(&down.position, cx); let element = interactive_bounds.visibly_contains(&down.position, cx);
if group || element { if group || element {
*active_state.borrow_mut() = ElementClickedState { group, element }; *active_state.borrow_mut() = ElementClickedState { group, element };
@ -1454,6 +1454,7 @@ impl Interactivity {
if let Some(group) = self.group.as_ref() { if let Some(group) = self.group.as_ref() {
GroupBounds::pop(group, cx); GroupBounds::pop(group, cx);
} }
});
} }
pub fn compute_style( pub fn compute_style(

View file

@ -200,7 +200,6 @@ impl Element for UniformList {
bounds.lower_right() - point(border.right + padding.right, border.bottom), bounds.lower_right() - point(border.right + padding.right, border.bottom),
); );
cx.with_z_index(style.z_index.unwrap_or(0), |cx| {
style.paint(bounds, cx, |cx| { style.paint(bounds, cx, |cx| {
if self.item_count > 0 { if self.item_count > 0 {
let content_height = let content_height =
@ -224,8 +223,8 @@ impl Element for UniformList {
let first_visible_element_ix = let first_visible_element_ix =
(-(scroll_offset.y + padding.top) / item_height).floor() as usize; (-(scroll_offset.y + padding.top) / item_height).floor() as usize;
let last_visible_element_ix = let last_visible_element_ix =
((-scroll_offset.y + padded_bounds.size.height) / item_height) ((-scroll_offset.y + padded_bounds.size.height) / item_height).ceil()
.ceil() as usize; as usize;
let visible_range = first_visible_element_ix let visible_range = first_visible_element_ix
..cmp::min(last_visible_element_ix, self.item_count); ..cmp::min(last_visible_element_ix, self.item_count);
@ -249,9 +248,8 @@ impl Element for UniformList {
}); });
} }
}); });
})
}, },
); )
} }
} }