Add click out handler

Mikayla Maki created

Make all context menus on button click toggles instead of re-shows

Change summary

crates/context_menu/src/context_menu.rs         | 31 +++++++-----------
crates/gpui/src/app/window.rs                   |  2 
crates/gpui/src/elements/mouse_event_handler.rs | 12 ++++++
crates/gpui/src/scene/mouse_region.rs           |  6 +++
4 files changed, 30 insertions(+), 21 deletions(-)

Detailed changes

crates/context_menu/src/context_menu.rs 🔗

@@ -301,23 +301,18 @@ impl ContextMenu {
         cx: &mut ViewContext<Self>,
     ) {
         let mut items = items.into_iter().peekable();
-        dbg!(self.visible);
-        if (self.visible) {
-            self.visible = false;
-        } else {
-            if items.peek().is_some() {
-                self.items = items.collect();
-                self.anchor_position = anchor_position;
-                self.anchor_corner = anchor_corner;
-                self.visible = true;
-                self.show_count += 1;
-                if !cx.is_self_focused() {
-                    self.previously_focused_view_id = cx.focused_view_id();
-                }
-                cx.focus_self();
-            } else {
-                self.visible = false;
+        if items.peek().is_some() {
+            self.items = items.collect();
+            self.anchor_position = anchor_position;
+            self.anchor_corner = anchor_corner;
+            self.visible = true;
+            self.show_count += 1;
+            if !cx.is_self_focused() {
+                self.previously_focused_view_id = cx.focused_view_id();
             }
+            cx.focus_self();
+        } else {
+            self.visible = false;
         }
         cx.notify();
     }
@@ -482,10 +477,10 @@ impl ContextMenu {
                 .contained()
                 .with_style(style.container)
         })
-        .on_down_out(MouseButton::Left, |_, this, cx| {
+        .on_click_out(MouseButton::Left, |_, this, cx| {
             this.cancel(&Default::default(), cx);
         })
-        .on_down_out(MouseButton::Right, |_, this, cx| {
+        .on_click_out(MouseButton::Right, |_, this, cx| {
             this.cancel(&Default::default(), cx);
         })
     }

crates/gpui/src/app/window.rs 🔗

@@ -716,7 +716,7 @@ impl<'a> WindowContext<'a> {
                     }
                 }
 
-                MouseEvent::MoveOut(_) | MouseEvent::UpOut(_) | MouseEvent::DownOut(_) => {
+                MouseEvent::MoveOut(_) | MouseEvent::UpOut(_) | MouseEvent::DownOut(_) | MouseEvent::ClickOut(_) => {
                     for (mouse_region, _) in self.window.mouse_regions.iter().rev() {
                         // NOT contains
                         if !mouse_region

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

@@ -8,7 +8,7 @@ use crate::{
     platform::MouseButton,
     scene::{
         CursorRegion, HandlerSet, MouseClick, MouseDown, MouseDownOut, MouseDrag, MouseHover,
-        MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut,
+        MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, MouseClickOut,
     },
     AnyElement, Element, EventContext, LayoutContext, MouseRegion, MouseState, SceneBuilder,
     SizeConstraint, View, ViewContext,
@@ -136,6 +136,16 @@ impl<Tag, V: View> MouseEventHandler<Tag, V> {
         self
     }
 
+    pub fn on_click_out(
+        mut self,
+        button: MouseButton,
+        handler: impl Fn(MouseClickOut, &mut V, &mut EventContext<V>) + 'static,
+    ) -> Self {
+        self.handlers = self.handlers.on_click_out(button, handler);
+        self
+    }
+
+
     pub fn on_down_out(
         mut self,
         button: MouseButton,

crates/gpui/src/scene/mouse_region.rs 🔗

@@ -94,7 +94,7 @@ impl MouseRegion {
         V: View,
         F: Fn(MouseClickOut, &mut V, &mut EventContext<V>) + 'static,
     {
-        self.handlers = self.handlers.on_click(button, handler);
+        self.handlers = self.handlers.on_click_out(button, handler);
         self
     }
 
@@ -255,6 +255,10 @@ impl HandlerSet {
                 HandlerKey::new(MouseEvent::click_disc(), Some(button)),
                 SmallVec::from_buf([Rc::new(|_, _, _, _| true)]),
             );
+            set.insert(
+                HandlerKey::new(MouseEvent::click_out_disc(), Some(button)),
+                SmallVec::from_buf([Rc::new(|_, _, _, _| true)]),
+            );
             set.insert(
                 HandlerKey::new(MouseEvent::down_out_disc(), Some(button)),
                 SmallVec::from_buf([Rc::new(|_, _, _, _| true)]),