Don't dispatch events to flex children outside of parent flex's bounds

Nathan Sobo created

Change summary

crates/gpui/src/elements/flex.rs  |  6 ++++++
crates/gpui/src/platform/event.rs | 17 +++++++++++++++++
2 files changed, 23 insertions(+)

Detailed changes

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

@@ -270,6 +270,12 @@ impl Element for Flex {
         _: &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;

crates/gpui/src/platform/event.rs 🔗

@@ -61,3 +61,20 @@ pub enum Event {
         left_mouse_down: bool,
     },
 }
+
+impl Event {
+    pub fn position(&self) -> Option<Vector2F> {
+        match self {
+            Event::KeyDown { .. } => None,
+            Event::ScrollWheel { position, .. }
+            | Event::LeftMouseDown { position, .. }
+            | Event::LeftMouseUp { position }
+            | Event::LeftMouseDragged { position }
+            | Event::RightMouseDown { position, .. }
+            | Event::RightMouseUp { position }
+            | Event::NavigateMouseDown { position, .. }
+            | Event::NavigateMouseUp { position, .. }
+            | Event::MouseMoved { position, .. } => Some(*position),
+        }
+    }
+}