Merge pull request #764 from zed-industries/refine-event-handlers-behavior

Nathan Sobo created

Calculate hit-box based on visible bounds in `{Mouse}EventHandler`

Change summary

crates/editor/src/element.rs                    |  1 +
crates/gpui/examples/text.rs                    |  1 +
crates/gpui/src/elements.rs                     | 10 +++++++++-
crates/gpui/src/elements/align.rs               |  3 ++-
crates/gpui/src/elements/canvas.rs              |  1 +
crates/gpui/src/elements/constrained_box.rs     |  1 +
crates/gpui/src/elements/container.rs           |  1 +
crates/gpui/src/elements/empty.rs               |  1 +
crates/gpui/src/elements/event_handler.rs       | 11 ++++++-----
crates/gpui/src/elements/expanded.rs            |  1 +
crates/gpui/src/elements/flex.rs                |  8 ++------
crates/gpui/src/elements/hook.rs                |  1 +
crates/gpui/src/elements/image.rs               |  1 +
crates/gpui/src/elements/label.rs               |  1 +
crates/gpui/src/elements/list.rs                |  2 ++
crates/gpui/src/elements/mouse_event_handler.rs |  7 ++++---
crates/gpui/src/elements/overlay.rs             |  1 +
crates/gpui/src/elements/stack.rs               |  1 +
crates/gpui/src/elements/svg.rs                 |  1 +
crates/gpui/src/elements/text.rs                |  1 +
crates/gpui/src/elements/uniform_list.rs        |  1 +
crates/gpui/src/presenter.rs                    |  1 +
crates/workspace/src/workspace.rs               |  5 +++--
23 files changed, 44 insertions(+), 18 deletions(-)

Detailed changes

crates/editor/src/element.rs 🔗

@@ -1147,6 +1147,7 @@ impl Element for EditorElement {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         layout: &mut LayoutState,
         paint: &mut PaintState,
         cx: &mut EventContext,

crates/gpui/examples/text.rs 🔗

@@ -104,6 +104,7 @@ impl gpui::Element for TextElement {
         &mut self,
         _: &gpui::Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut gpui::EventContext,

crates/gpui/src/elements.rs 🔗

@@ -74,6 +74,7 @@ pub trait Element {
         &mut self,
         event: &Event,
         bounds: RectF,
+        visible_bounds: RectF,
         layout: &mut Self::LayoutState,
         paint: &mut Self::PaintState,
         cx: &mut EventContext,
@@ -169,6 +170,7 @@ pub enum Lifecycle<T: Element> {
         element: T,
         constraint: SizeConstraint,
         bounds: RectF,
+        visible_bounds: RectF,
         layout: T::LayoutState,
         paint: T::PaintState,
     },
@@ -222,6 +224,7 @@ impl<T: Element> AnyElement for Lifecycle<T> {
                     element,
                     constraint,
                     bounds,
+                    visible_bounds,
                     layout,
                     paint,
                 }
@@ -242,6 +245,7 @@ impl<T: Element> AnyElement for Lifecycle<T> {
                     element,
                     constraint,
                     bounds,
+                    visible_bounds,
                     layout,
                     paint,
                 }
@@ -254,12 +258,13 @@ impl<T: Element> AnyElement for Lifecycle<T> {
         if let Lifecycle::PostPaint {
             element,
             bounds,
+            visible_bounds,
             layout,
             paint,
             ..
         } = self
         {
-            element.dispatch_event(event, *bounds, layout, paint, cx)
+            element.dispatch_event(event, *bounds, *visible_bounds, layout, paint, cx)
         } else {
             panic!("invalid element lifecycle state");
         }
@@ -288,6 +293,7 @@ impl<T: Element> AnyElement for Lifecycle<T> {
                 element,
                 constraint,
                 bounds,
+                visible_bounds,
                 layout,
                 paint,
             } => {
@@ -299,6 +305,8 @@ impl<T: Element> AnyElement for Lifecycle<T> {
                         new_map.insert("type".into(), typ);
                     }
                     new_map.insert("constraint".into(), constraint.to_json());
+                    new_map.insert("bounds".into(), bounds.to_json());
+                    new_map.insert("visible_bounds".into(), visible_bounds.to_json());
                     new_map.append(map);
                     json::Value::Object(new_map)
                 } else {

crates/gpui/src/elements/align.rs 🔗

@@ -85,7 +85,8 @@ impl Element for Align {
     fn dispatch_event(
         &mut self,
         event: &Event,
-        _: pathfinder_geometry::rect::RectF,
+        _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/gpui/src/elements/canvas.rs 🔗

@@ -59,6 +59,7 @@ where
         &mut self,
         _: &crate::Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut crate::EventContext,

crates/gpui/src/elements/container.rs 🔗

@@ -247,6 +247,7 @@ impl Element for Container {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/gpui/src/elements/empty.rs 🔗

@@ -52,6 +52,7 @@ impl Element for Empty {
         &mut self,
         _: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut EventContext,

crates/gpui/src/elements/event_handler.rs 🔗

@@ -84,13 +84,14 @@ impl Element for EventHandler {
     fn dispatch_event(
         &mut self,
         event: &Event,
-        bounds: RectF,
+        _: RectF,
+        visible_bounds: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,
     ) -> bool {
         if let Some(capture) = self.capture.as_mut() {
-            if capture(event, bounds, cx) {
+            if capture(event, visible_bounds, cx) {
                 return true;
             }
         }
@@ -101,7 +102,7 @@ impl Element for EventHandler {
             match event {
                 Event::LeftMouseDown { position, .. } => {
                     if let Some(callback) = self.mouse_down.as_mut() {
-                        if bounds.contains_point(*position) {
+                        if visible_bounds.contains_point(*position) {
                             return callback(cx);
                         }
                     }
@@ -109,7 +110,7 @@ impl Element for EventHandler {
                 }
                 Event::RightMouseDown { position, .. } => {
                     if let Some(callback) = self.right_mouse_down.as_mut() {
-                        if bounds.contains_point(*position) {
+                        if visible_bounds.contains_point(*position) {
                             return callback(cx);
                         }
                     }
@@ -121,7 +122,7 @@ impl Element for EventHandler {
                     ..
                 } => {
                     if let Some(callback) = self.navigate_mouse_down.as_mut() {
-                        if bounds.contains_point(*position) {
+                        if visible_bounds.contains_point(*position) {
                             return callback(*direction, cx);
                         }
                     }

crates/gpui/src/elements/expanded.rs 🔗

@@ -66,6 +66,7 @@ impl Element for Expanded {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/gpui/src/elements/flex.rs 🔗

@@ -266,16 +266,11 @@ impl Element for Flex {
         &mut self,
         event: &Event,
         bounds: RectF,
+        _: RectF,
         remaining_space: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,
     ) -> bool {
-        if let Some(position) = event.position() {
-            if !bounds.contains_point(position) {
-                return false;
-            }
-        }
-
         let mut handled = false;
         for child in &mut self.children {
             handled = child.dispatch_event(event, cx) || handled;
@@ -391,6 +386,7 @@ impl Element for FlexItem {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/gpui/src/elements/hook.rs 🔗

@@ -57,6 +57,7 @@ impl Element for Hook {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/gpui/src/elements/image.rs 🔗

@@ -81,6 +81,7 @@ impl Element for Image {
         &mut self,
         _: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut EventContext,

crates/gpui/src/elements/label.rs 🔗

@@ -166,6 +166,7 @@ impl Element for Label {
         &mut self,
         _: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut EventContext,

crates/gpui/src/elements/list.rs 🔗

@@ -253,6 +253,7 @@ impl Element for List {
         &mut self,
         event: &Event,
         bounds: RectF,
+        _: RectF,
         scroll_top: &mut ListOffset,
         _: &mut (),
         cx: &mut EventContext,
@@ -872,6 +873,7 @@ mod tests {
             &mut self,
             _: &Event,
             _: RectF,
+            _: RectF,
             _: &mut (),
             _: &mut (),
             _: &mut EventContext,

crates/gpui/src/elements/mouse_event_handler.rs 🔗

@@ -99,7 +99,8 @@ impl Element for MouseEventHandler {
     fn dispatch_event(
         &mut self,
         event: &Event,
-        bounds: RectF,
+        _: RectF,
+        visible_bounds: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,
@@ -112,8 +113,8 @@ impl Element for MouseEventHandler {
         let handled_in_child = self.child.dispatch_event(event, cx);
 
         let hit_bounds = RectF::from_points(
-            bounds.origin() - vec2f(self.padding.left, self.padding.top),
-            bounds.lower_right() + vec2f(self.padding.right, self.padding.bottom),
+            visible_bounds.origin() - vec2f(self.padding.left, self.padding.top),
+            visible_bounds.lower_right() + vec2f(self.padding.right, self.padding.bottom),
         )
         .round_out();
 

crates/gpui/src/elements/overlay.rs 🔗

@@ -44,6 +44,7 @@ impl Element for Overlay {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/gpui/src/elements/stack.rs 🔗

@@ -51,6 +51,7 @@ impl Element for Stack {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/gpui/src/elements/svg.rs 🔗

@@ -76,6 +76,7 @@ impl Element for Svg {
         &mut self,
         _: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut EventContext,

crates/gpui/src/elements/text.rs 🔗

@@ -172,6 +172,7 @@ impl Element for Text {
         &mut self,
         _: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut EventContext,

crates/gpui/src/presenter.rs 🔗

@@ -535,6 +535,7 @@ impl Element for ChildView {
         &mut self,
         event: &Event,
         _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         cx: &mut EventContext,

crates/workspace/src/workspace.rs 🔗

@@ -16,7 +16,7 @@ use gpui::{
     action,
     color::Color,
     elements::*,
-    geometry::{vector::vec2f, PathBuilder},
+    geometry::{rect::RectF, vector::vec2f, PathBuilder},
     json::{self, to_string_pretty, ToJson},
     keymap::Binding,
     platform::{CursorStyle, WindowOptions},
@@ -2068,7 +2068,8 @@ impl Element for AvatarRibbon {
     fn dispatch_event(
         &mut self,
         _: &gpui::Event,
-        _: gpui::geometry::rect::RectF,
+        _: RectF,
+        _: RectF,
         _: &mut Self::LayoutState,
         _: &mut Self::PaintState,
         _: &mut gpui::EventContext,