From 5413a97c7efa86eb5260f97cd559d0c45d551f90 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 27 May 2022 11:09:07 -0600 Subject: [PATCH] Restrict multiple hovered regions to a single stacking context We won't hover regions from stacking contexts that are below the one being hovered. --- crates/gpui/src/presenter.rs | 14 +++++++++----- crates/gpui/src/scene.rs | 15 ++++++++++----- crates/project_panel/src/project_panel.rs | 4 +--- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/crates/gpui/src/presenter.rs b/crates/gpui/src/presenter.rs index 87e40db1ea..54d5d90d49 100644 --- a/crates/gpui/src/presenter.rs +++ b/crates/gpui/src/presenter.rs @@ -28,7 +28,7 @@ pub struct Presenter { pub(crate) rendered_views: HashMap, parents: HashMap, cursor_regions: Vec, - mouse_regions: Vec, + mouse_regions: Vec<(MouseRegion, usize)>, font_cache: Arc, text_layout_cache: TextLayoutCache, asset_cache: Arc, @@ -230,7 +230,7 @@ impl Presenter { match event { Event::LeftMouseDown { position, .. } => { - for region in self.mouse_regions.iter().rev() { + for (region, _) in self.mouse_regions.iter().rev() { if region.bounds.contains_point(position) { invalidated_views.push(region.view_id); mouse_down_region = Some((region.clone(), position)); @@ -254,7 +254,7 @@ impl Presenter { } } Event::RightMouseDown { position, .. } => { - for region in self.mouse_regions.iter().rev() { + for (region, _) in self.mouse_regions.iter().rev() { if region.bounds.contains_point(position) { invalidated_views.push(region.view_id); right_mouse_down_region = Some((region.clone(), position)); @@ -291,9 +291,13 @@ impl Presenter { } cx.platform().set_cursor_style(style_to_assign); - for region in self.mouse_regions.iter().rev() { + let mut hover_depth = None; + for (region, depth) in self.mouse_regions.iter().rev() { let region_id = region.id(); - if region.bounds.contains_point(position) { + if region.bounds.contains_point(position) + && hover_depth.map_or(true, |hover_depth| hover_depth == *depth) + { + hover_depth = Some(*depth); if !self.hovered_region_ids.contains(®ion_id) { invalidated_views.push(region.view_id); hovered_regions.push(region.clone()); diff --git a/crates/gpui/src/scene.rs b/crates/gpui/src/scene.rs index 843a3b62d6..c989117747 100644 --- a/crates/gpui/src/scene.rs +++ b/crates/gpui/src/scene.rs @@ -210,11 +210,16 @@ impl Scene { .collect() } - pub fn mouse_regions(&self) -> Vec { - self.layers() - .flat_map(|layer| &layer.mouse_regions) - .cloned() - .collect() + pub fn mouse_regions(&self) -> Vec<(MouseRegion, usize)> { + let mut regions = Vec::new(); + for (stacking_depth, stacking_context) in self.stacking_contexts.iter().enumerate() { + for layer in &stacking_context.layers { + for mouse_region in &layer.mouse_regions { + regions.push((mouse_region.clone(), stacking_depth)); + } + } + } + regions } pub fn push_stacking_context(&mut self, clip_bounds: Option) { diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 2ce233fa21..9046917e39 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -12,7 +12,7 @@ use gpui::{ impl_internal_actions, keymap, platform::CursorStyle, AppContext, ClipboardItem, Element, ElementBox, Entity, ModelHandle, MutableAppContext, - PromptLevel, RenderContext, Task, View, ViewContext, ViewHandle, WeakViewHandle, + PromptLevel, RenderContext, Task, View, ViewContext, ViewHandle, }; use menu::{Confirm, SelectNext, SelectPrev}; use project::{Entry, EntryKind, Project, ProjectEntryId, ProjectPath, Worktree, WorktreeId}; @@ -38,7 +38,6 @@ pub struct ProjectPanel { edit_state: Option, filename_editor: ViewHandle, context_menu: ViewHandle, - handle: WeakViewHandle, } #[derive(Copy, Clone)] @@ -174,7 +173,6 @@ impl ProjectPanel { edit_state: None, filename_editor, context_menu: cx.add_view(|_| ContextMenu::new()), - handle: cx.weak_handle(), }; this.update_visible_entries(None, cx); this