diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 91c357ddee8eb6fd09238ebdb940e365c77afa82..3575accbeb1b79e5dcbfb5f9aad2c976b597dfb7 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -3484,8 +3484,7 @@ impl<'a, V: View> RenderContext<'a, V> { pub fn mouse_state(&self, region_id: usize) -> MouseState { let region_id = MouseRegionId { view_id: self.view_id, - tag: TypeId::of::(), - region_id, + discriminant: (TypeId::of::(), region_id), }; MouseState { hovered: self.hovered_region_ids.contains(®ion_id), diff --git a/crates/gpui/src/elements/mouse_event_handler.rs b/crates/gpui/src/elements/mouse_event_handler.rs index 1ca4c13fc856e21f886883aa1101dca27ae879d6..ee809746ae79adf586e0f51a61ddc516133d7bad 100644 --- a/crates/gpui/src/elements/mouse_event_handler.rs +++ b/crates/gpui/src/elements/mouse_event_handler.rs @@ -131,8 +131,7 @@ impl Element for MouseEventHandler { cx.scene.push_mouse_region(MouseRegion { view_id: cx.current_view_id(), - tag: self.tag, - region_id: self.id, + discriminant: Some((self.tag, self.id)), bounds: self.hit_bounds(bounds), hover: None, click: self.click_handler.clone(), diff --git a/crates/gpui/src/elements/overlay.rs b/crates/gpui/src/elements/overlay.rs index 3d90a7554cd15a641217173974295c5b61e6e086..d841bcbc04ab7d6ab063511408e521024e3bdf8d 100644 --- a/crates/gpui/src/elements/overlay.rs +++ b/crates/gpui/src/elements/overlay.rs @@ -3,8 +3,8 @@ use serde_json::json; use crate::{ geometry::{rect::RectF, vector::Vector2F}, json::ToJson, - DebugContext, Element, ElementBox, Event, EventContext, LayoutContext, PaintContext, - SizeConstraint, + DebugContext, Element, ElementBox, Event, EventContext, LayoutContext, MouseRegion, + PaintContext, SizeConstraint, }; pub struct Overlay { @@ -54,6 +54,11 @@ impl Element for Overlay { let origin = self.abs_position.unwrap_or(bounds.origin()); let visible_bounds = RectF::new(origin, *size); cx.scene.push_stacking_context(None); + cx.scene.push_mouse_region(MouseRegion { + view_id: cx.current_view_id(), + bounds: visible_bounds, + ..Default::default() + }); self.child.paint(origin, visible_bounds, cx); cx.scene.pop_stacking_context(); } diff --git a/crates/gpui/src/presenter.rs b/crates/gpui/src/presenter.rs index 54d5d90d49f91574324153df18ce2538ed5db9d7..6d2def4716b952195738e6223fea44c026f88829 100644 --- a/crates/gpui/src/presenter.rs +++ b/crates/gpui/src/presenter.rs @@ -103,11 +103,11 @@ impl Presenter { view_id: *view_id, titlebar_height: self.titlebar_height, hovered_region_ids: self.hovered_region_ids.clone(), - clicked_region_id: self.clicked_region.as_ref().map(MouseRegion::id), + clicked_region_id: self.clicked_region.as_ref().and_then(MouseRegion::id), right_clicked_region_id: self .right_clicked_region .as_ref() - .map(MouseRegion::id), + .and_then(MouseRegion::id), refreshing: false, }) .unwrap(), @@ -125,11 +125,11 @@ impl Presenter { view_id: *view_id, titlebar_height: self.titlebar_height, hovered_region_ids: self.hovered_region_ids.clone(), - clicked_region_id: self.clicked_region.as_ref().map(MouseRegion::id), + clicked_region_id: self.clicked_region.as_ref().and_then(MouseRegion::id), right_clicked_region_id: self .right_clicked_region .as_ref() - .map(MouseRegion::id), + .and_then(MouseRegion::id), refreshing: true, }) .unwrap(); @@ -194,8 +194,8 @@ impl Presenter { view_stack: Vec::new(), refreshing, hovered_region_ids: self.hovered_region_ids.clone(), - clicked_region_id: self.clicked_region.as_ref().map(MouseRegion::id), - right_clicked_region_id: self.right_clicked_region.as_ref().map(MouseRegion::id), + clicked_region_id: self.clicked_region.as_ref().and_then(MouseRegion::id), + right_clicked_region_id: self.right_clicked_region.as_ref().and_then(MouseRegion::id), titlebar_height: self.titlebar_height, window_size, app: cx, @@ -293,21 +293,24 @@ impl Presenter { 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) && 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()); - self.hovered_region_ids.insert(region_id); + if let Some(region_id) = region.id() { + if !self.hovered_region_ids.contains(®ion_id) { + invalidated_views.push(region.view_id); + hovered_regions.push(region.clone()); + self.hovered_region_ids.insert(region_id); + } } } else { - if self.hovered_region_ids.contains(®ion_id) { - invalidated_views.push(region.view_id); - unhovered_regions.push(region.clone()); - self.hovered_region_ids.remove(®ion_id); + if let Some(region_id) = region.id() { + if self.hovered_region_ids.contains(®ion_id) { + invalidated_views.push(region.view_id); + unhovered_regions.push(region.clone()); + self.hovered_region_ids.remove(®ion_id); + } } } } diff --git a/crates/gpui/src/scene.rs b/crates/gpui/src/scene.rs index c9891177476ee3e2f40d490f0a9263a6cef8954f..22762ea9dafc21589d1491ef7e3c4975c325104c 100644 --- a/crates/gpui/src/scene.rs +++ b/crates/gpui/src/scene.rs @@ -43,11 +43,10 @@ pub struct CursorRegion { pub style: CursorStyle, } -#[derive(Clone)] +#[derive(Clone, Default)] pub struct MouseRegion { pub view_id: usize, - pub tag: TypeId, - pub region_id: usize, + pub discriminant: Option<(TypeId, usize)>, pub bounds: RectF, pub hover: Option>, pub mouse_down: Option>, @@ -60,8 +59,7 @@ pub struct MouseRegion { #[derive(Copy, Clone, Eq, PartialEq, Hash)] pub struct MouseRegionId { pub view_id: usize, - pub tag: TypeId, - pub region_id: usize, + pub discriminant: (TypeId, usize), } #[derive(Default, Debug)] @@ -544,12 +542,11 @@ impl ToJson for Border { } impl MouseRegion { - pub fn id(&self) -> MouseRegionId { - MouseRegionId { + pub fn id(&self) -> Option { + self.discriminant.map(|discriminant| MouseRegionId { view_id: self.view_id, - tag: self.tag, - region_id: self.region_id, - } + discriminant, + }) } }