diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 670ec54933..e1e9d6ead5 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -46,7 +46,9 @@ use language::{ DiagnosticSeverity, IndentKind, IndentSize, Language, OffsetRangeExt, OffsetUtf16, Point, Selection, SelectionGoal, TransactionId, }; -use link_go_to_definition::{hide_link_definition, LinkGoToDefinitionState}; +use link_go_to_definition::{ + hide_link_definition, show_link_definition, LinkDefinitionKind, LinkGoToDefinitionState, +}; pub use multi_buffer::{ Anchor, AnchorRangeExt, ExcerptId, ExcerptRange, MultiBuffer, MultiBufferSnapshot, ToOffset, ToPoint, @@ -6510,6 +6512,44 @@ impl View for Editor { cx.notify(); } + fn modifiers_changed( + &mut self, + event: &gpui::ModifiersChangedEvent, + cx: &mut ViewContext, + ) -> bool { + let pending_selection = self.has_pending_selection(); + + if let Some(point) = self.link_go_to_definition_state.last_mouse_location.clone() { + if event.cmd && !pending_selection { + let snapshot = self.snapshot(cx); + let kind = if event.shift { + LinkDefinitionKind::Type + } else { + LinkDefinitionKind::Symbol + }; + + show_link_definition(kind, self, point, snapshot, cx); + return false; + } + } + + { + if self.link_go_to_definition_state.symbol_range.is_some() + || !self.link_go_to_definition_state.definitions.is_empty() + { + self.link_go_to_definition_state.symbol_range.take(); + self.link_go_to_definition_state.definitions.clear(); + cx.notify(); + } + + self.link_go_to_definition_state.task = None; + + self.clear_text_highlights::(cx); + } + + false + } + fn keymap_context(&self, _: &AppContext) -> gpui::keymap::Context { let mut context = Self::default_keymap_context(); let mode = match self.mode { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index afc9bdd494..794bfb30cd 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -9,7 +9,7 @@ use crate::{ HoverAt, HOVER_POPOVER_GAP, MIN_POPOVER_CHARACTER_WIDTH, MIN_POPOVER_LINE_HEIGHT, }, link_go_to_definition::{ - CmdShiftChanged, GoToFetchedDefinition, GoToFetchedTypeDefinition, UpdateGoToDefinitionLink, + GoToFetchedDefinition, GoToFetchedTypeDefinition, UpdateGoToDefinitionLink, }, mouse_context_menu::DeployMouseContextMenu, EditorStyle, @@ -30,9 +30,8 @@ use gpui::{ platform::CursorStyle, text_layout::{self, Line, RunStyle, TextLayoutCache}, AppContext, Axis, Border, CursorRegion, Element, ElementBox, Event, EventContext, - LayoutContext, ModifiersChangedEvent, MouseButton, MouseButtonEvent, MouseMovedEvent, - MouseRegion, MutableAppContext, PaintContext, Quad, Scene, SizeConstraint, ViewContext, - WeakViewHandle, + LayoutContext, MouseButton, MouseButtonEvent, MouseMovedEvent, MouseRegion, MutableAppContext, + PaintContext, Quad, Scene, SizeConstraint, ViewContext, WeakViewHandle, }; use json::json; use language::{Bias, DiagnosticSeverity, OffsetUtf16, Selection}; @@ -408,14 +407,6 @@ impl EditorElement { true } - fn modifiers_changed(&self, event: ModifiersChangedEvent, cx: &mut EventContext) -> bool { - cx.dispatch_action(CmdShiftChanged { - cmd_down: event.cmd, - shift_down: event.shift, - }); - false - } - fn scroll( position: Vector2F, mut delta: Vector2F, @@ -1889,17 +1880,13 @@ impl Element for EditorElement { fn dispatch_event( &mut self, - event: &Event, + _: &Event, _: RectF, _: RectF, _: &mut LayoutState, _: &mut (), - cx: &mut EventContext, + _: &mut EventContext, ) -> bool { - if let Event::ModifiersChanged(event) = event { - self.modifiers_changed(*event, cx); - } - false } diff --git a/crates/editor/src/link_go_to_definition.rs b/crates/editor/src/link_go_to_definition.rs index c8294ddb43..705a1b2760 100644 --- a/crates/editor/src/link_go_to_definition.rs +++ b/crates/editor/src/link_go_to_definition.rs @@ -19,12 +19,6 @@ pub struct UpdateGoToDefinitionLink { pub shift_held: bool, } -#[derive(Clone, PartialEq)] -pub struct CmdShiftChanged { - pub cmd_down: bool, - pub shift_down: bool, -} - #[derive(Clone, PartialEq)] pub struct GoToFetchedDefinition { pub point: DisplayPoint, @@ -39,7 +33,6 @@ impl_internal_actions!( editor, [ UpdateGoToDefinitionLink, - CmdShiftChanged, GoToFetchedDefinition, GoToFetchedTypeDefinition ] @@ -47,7 +40,6 @@ impl_internal_actions!( pub fn init(cx: &mut MutableAppContext) { cx.add_action(update_go_to_definition_link); - cx.add_action(cmd_shift_changed); cx.add_action(go_to_fetched_definition); cx.add_action(go_to_fetched_type_definition); } @@ -113,37 +105,6 @@ pub fn update_go_to_definition_link( hide_link_definition(editor, cx); } -pub fn cmd_shift_changed( - editor: &mut Editor, - &CmdShiftChanged { - cmd_down, - shift_down, - }: &CmdShiftChanged, - cx: &mut ViewContext, -) { - let pending_selection = editor.has_pending_selection(); - - if let Some(point) = editor - .link_go_to_definition_state - .last_mouse_location - .clone() - { - if cmd_down && !pending_selection { - let snapshot = editor.snapshot(cx); - let kind = if shift_down { - LinkDefinitionKind::Type - } else { - LinkDefinitionKind::Symbol - }; - - show_link_definition(kind, editor, point, snapshot, cx); - return; - } - } - - hide_link_definition(editor, cx) -} - #[derive(Debug, Clone, Copy, PartialEq)] pub enum LinkDefinitionKind { Symbol, @@ -397,6 +358,7 @@ fn go_to_fetched_definition_of_kind( #[cfg(test)] mod tests { use futures::StreamExt; + use gpui::{ModifiersChangedEvent, View}; use indoc::indoc; use lsp::request::{GotoDefinition, GotoTypeDefinition}; @@ -467,11 +429,10 @@ mod tests { // Unpress shift causes highlight to go away (normal goto-definition is not valid here) cx.update_editor(|editor, cx| { - cmd_shift_changed( - editor, - &CmdShiftChanged { - cmd_down: true, - shift_down: false, + editor.modifiers_changed( + &gpui::ModifiersChangedEvent { + cmd: true, + ..Default::default() }, cx, ); @@ -581,14 +542,7 @@ mod tests { // Unpress cmd causes highlight to go away cx.update_editor(|editor, cx| { - cmd_shift_changed( - editor, - &CmdShiftChanged { - cmd_down: false, - shift_down: false, - }, - cx, - ); + editor.modifiers_changed(&Default::default(), cx); }); // Assert no link highlights @@ -704,11 +658,10 @@ mod tests { ]))) }); cx.update_editor(|editor, cx| { - cmd_shift_changed( - editor, - &CmdShiftChanged { - cmd_down: true, - shift_down: false, + editor.modifiers_changed( + &ModifiersChangedEvent { + cmd: true, + ..Default::default() }, cx, ); diff --git a/crates/gpui/src/platform/event.rs b/crates/gpui/src/platform/event.rs index 48043ac918..7e4b95c9a1 100644 --- a/crates/gpui/src/platform/event.rs +++ b/crates/gpui/src/platform/event.rs @@ -11,7 +11,7 @@ pub struct KeyUpEvent { pub keystroke: Keystroke, } -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Default)] pub struct ModifiersChangedEvent { pub ctrl: bool, pub alt: bool,