From a47a6f2f22b04b3d02630ec951fea88b34993bb1 Mon Sep 17 00:00:00 2001 From: ForLoveOfCats Date: Mon, 8 Aug 2022 15:59:33 -0400 Subject: [PATCH] Handle Cmd/Shift + Click go-to action on mouse-up instead of mouse-down --- crates/editor/src/editor.rs | 8 ++++ crates/editor/src/element.rs | 75 +++++++++++++++++++----------------- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 7c2d560a41..f7d9c9be79 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -1787,6 +1787,14 @@ impl Editor { cx.notify(); } + pub fn are_selections_empty(&self) -> bool { + let pending_empty = match self.selections.pending_anchor() { + Some(Selection { start, end, .. }) => start == end, + None => true, + }; + pending_empty && self.columnar_selection_tail.is_none() + } + pub fn is_selecting(&self) -> bool { self.selections.pending_anchor().is_some() || self.columnar_selection_tail.is_some() } diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 95d760846f..25a71b93dc 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -113,7 +113,6 @@ impl EditorElement { fn mouse_down( &self, position: Vector2F, - cmd: bool, alt: bool, shift: bool, mut click_count: usize, @@ -121,20 +120,6 @@ impl EditorElement { paint: &mut PaintState, cx: &mut EventContext, ) -> bool { - if cmd && paint.text_bounds.contains_point(position) { - let (point, target_point) = - paint.point_for_position(&self.snapshot(cx), layout, position); - if point == target_point { - if shift { - cx.dispatch_action(GoToFetchedTypeDefinition { point }); - } else { - cx.dispatch_action(GoToFetchedDefinition { point }); - } - - return true; - } - } - if paint.gutter_bounds.contains_point(position) { click_count = 3; // Simulate triple-click when clicking the gutter to select lines } else if !paint.text_bounds.contains_point(position) { @@ -183,13 +168,39 @@ impl EditorElement { true } - fn mouse_up(&self, _position: Vector2F, cx: &mut EventContext) -> bool { - if self.view(cx.app.as_ref()).is_selecting() { + fn mouse_up( + &self, + position: Vector2F, + cmd: bool, + shift: bool, + layout: &mut LayoutState, + paint: &mut PaintState, + cx: &mut EventContext, + ) -> bool { + let view = self.view(cx.app.as_ref()); + let end_selection = view.is_selecting(); + let selections_empty = view.are_selections_empty(); + + if end_selection { cx.dispatch_action(Select(SelectPhase::End)); - true - } else { - false } + + if selections_empty && cmd && paint.text_bounds.contains_point(position) { + let (point, target_point) = + paint.point_for_position(&self.snapshot(cx), layout, position); + + if point == target_point { + if shift { + cx.dispatch_action(GoToFetchedTypeDefinition { point }); + } else { + cx.dispatch_action(GoToFetchedDefinition { point }); + } + + return true; + } + } + + end_selection } fn mouse_dragged( @@ -1533,36 +1544,28 @@ impl Element for EditorElement { } match event { - Event::MouseDown(MouseButtonEvent { + &Event::MouseDown(MouseButtonEvent { button: MouseButton::Left, position, - cmd, alt, shift, click_count, .. - }) => self.mouse_down( - *position, - *cmd, - *alt, - *shift, - *click_count, - layout, - paint, - cx, - ), + }) => self.mouse_down(position, alt, shift, click_count, layout, paint, cx), - Event::MouseDown(MouseButtonEvent { + &Event::MouseDown(MouseButtonEvent { button: MouseButton::Right, position, .. - }) => self.mouse_right_down(*position, layout, paint, cx), + }) => self.mouse_right_down(position, layout, paint, cx), - Event::MouseUp(MouseButtonEvent { + &Event::MouseUp(MouseButtonEvent { button: MouseButton::Left, position, + cmd, + shift, .. - }) => self.mouse_up(*position, cx), + }) => self.mouse_up(position, cmd, shift, layout, paint, cx), Event::MouseMoved(MouseMovedEvent { pressed_button: Some(MouseButton::Left),