From e3bb5e5103ca7dcbdda1b327414c4b50cd82291f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 8 Aug 2023 17:39:05 -0700 Subject: [PATCH] Fix failure to remove hovered region_ids on element removal Co-authored-by: Mikayla --- crates/gpui/src/app/window.rs | 13 +++++++++---- crates/gpui/src/scene/mouse_region.rs | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index 789341d46fa4788e24c7b4d7b1e44d0558e1f3b7..889dd2510eb06c733b288fd49909b3bec121e094 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -51,8 +51,8 @@ pub struct Window { cursor_regions: Vec, mouse_regions: Vec<(MouseRegion, usize)>, last_mouse_moved_event: Option, - pub(crate) hovered_region_ids: HashSet, - pub(crate) clicked_region_ids: HashSet, + pub(crate) hovered_region_ids: Vec, + pub(crate) clicked_region_ids: Vec, pub(crate) clicked_region: Option<(MouseRegionId, MouseButton)>, mouse_position: Vector2F, text_layout_cache: TextLayoutCache, @@ -664,6 +664,7 @@ impl<'a> WindowContext<'a> { let mut highest_z_index = None; let mouse_position = self.window.mouse_position.clone(); let window = &mut *self.window; + let prev_hovered_regions = mem::take(&mut window.hovered_region_ids); for (region, z_index) in window.mouse_regions.iter().rev() { // Allow mouse regions to appear transparent to hovers if !region.hoverable { @@ -682,7 +683,11 @@ impl<'a> WindowContext<'a> { // highest_z_index is set. if contains_mouse && z_index == highest_z_index.unwrap() { //Ensure that hover entrance events aren't sent twice - if window.hovered_region_ids.insert(region.id()) { + if let Err(ix) = window.hovered_region_ids.binary_search(®ion.id()) { + window.hovered_region_ids.insert(ix, region.id()); + } + // window.hovered_region_ids.insert(region.id()); + if !prev_hovered_regions.contains(®ion.id()) { valid_regions.push(region.clone()); if region.notify_on_hover { notified_views.insert(region.id().view_id()); @@ -690,7 +695,7 @@ impl<'a> WindowContext<'a> { } } else { // Ensure that hover exit events aren't sent twice - if window.hovered_region_ids.remove(®ion.id()) { + if prev_hovered_regions.contains(®ion.id()) { valid_regions.push(region.clone()); if region.notify_on_hover { notified_views.insert(region.id().view_id()); diff --git a/crates/gpui/src/scene/mouse_region.rs b/crates/gpui/src/scene/mouse_region.rs index ca2cc04b9d1cf75c54ee9593705172f93c6f8ec4..cf39ac782fca327a627105a8ebe88f0f29f95ca5 100644 --- a/crates/gpui/src/scene/mouse_region.rs +++ b/crates/gpui/src/scene/mouse_region.rs @@ -177,7 +177,7 @@ impl MouseRegion { } } -#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] +#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, PartialOrd, Ord)] pub struct MouseRegionId { view_id: usize, tag: TypeId,