@@ -213,11 +213,14 @@ use workspace::{
searchable::SearchEvent,
};
-use crate::signature_help::{SignatureHelpHiddenBy, SignatureHelpState};
use crate::{
code_context_menus::CompletionsMenuSource,
hover_links::{find_url, find_url_from_range},
};
+use crate::{
+ editor_settings::MultiCursorModifier,
+ signature_help::{SignatureHelpHiddenBy, SignatureHelpState},
+};
pub const FILE_HEADER_HEIGHT: u32 = 2;
pub const MULTI_BUFFER_EXCERPT_HEADER_HEIGHT: u32 = 1;
@@ -253,14 +256,6 @@ pub type RenderDiffHunkControlsFn = Arc<
) -> AnyElement,
>;
-const COLUMNAR_SELECTION_MODIFIERS: Modifiers = Modifiers {
- alt: true,
- shift: true,
- control: false,
- platform: false,
- function: false,
-};
-
struct InlineValueCache {
enabled: bool,
inlays: Vec<InlayId>,
@@ -7091,6 +7086,29 @@ impl Editor {
)
}
+ fn multi_cursor_modifier(
+ cursor_event: bool,
+ modifiers: &Modifiers,
+ cx: &mut Context<Self>,
+ ) -> bool {
+ let multi_cursor_setting = EditorSettings::get_global(cx).multi_cursor_modifier;
+ if cursor_event {
+ match multi_cursor_setting {
+ MultiCursorModifier::Alt => modifiers.alt,
+ MultiCursorModifier::CmdOrCtrl => modifiers.secondary(),
+ }
+ } else {
+ match multi_cursor_setting {
+ MultiCursorModifier::Alt => modifiers.secondary(),
+ MultiCursorModifier::CmdOrCtrl => modifiers.alt,
+ }
+ }
+ }
+
+ fn columnar_selection_modifiers(multi_cursor_modifier: bool, modifiers: &Modifiers) -> bool {
+ modifiers.shift && multi_cursor_modifier && modifiers.number_of_modifiers() == 2
+ }
+
fn update_selection_mode(
&mut self,
modifiers: &Modifiers,
@@ -7098,7 +7116,10 @@ impl Editor {
window: &mut Window,
cx: &mut Context<Self>,
) {
- if modifiers != &COLUMNAR_SELECTION_MODIFIERS || self.selections.pending.is_none() {
+ let multi_cursor_modifier = Self::multi_cursor_modifier(true, modifiers, cx);
+ if !Self::columnar_selection_modifiers(multi_cursor_modifier, modifiers)
+ || self.selections.pending.is_none()
+ {
return;
}
@@ -1,15 +1,15 @@
use crate::{
- ActiveDiagnostic, BlockId, COLUMNAR_SELECTION_MODIFIERS, CURSORS_VISIBLE_FOR,
- ChunkRendererContext, ChunkReplacement, CodeActionSource, ConflictsOurs, ConflictsOursMarker,
- ConflictsOuter, ConflictsTheirs, ConflictsTheirsMarker, ContextMenuPlacement, CursorShape,
- CustomBlockId, DisplayDiffHunk, DisplayPoint, DisplayRow, DocumentHighlightRead,
- DocumentHighlightWrite, EditDisplayMode, Editor, EditorMode, EditorSettings, EditorSnapshot,
- EditorStyle, FILE_HEADER_HEIGHT, FocusedBlock, GutterDimensions, HalfPageDown, HalfPageUp,
- HandleInput, HoveredCursor, InlayHintRefreshReason, InlineCompletion, JumpData, LineDown,
- LineHighlight, LineUp, MAX_LINE_LEN, MIN_LINE_NUMBER_DIGITS, MINIMAP_FONT_SIZE,
- MULTI_BUFFER_EXCERPT_HEADER_HEIGHT, OpenExcerpts, PageDown, PageUp, PhantomBreakpointIndicator,
- Point, RowExt, RowRangeExt, SelectPhase, SelectedTextHighlight, Selection, SoftWrap,
- StickyHeaderExcerpt, ToPoint, ToggleFold,
+ ActiveDiagnostic, BlockId, CURSORS_VISIBLE_FOR, ChunkRendererContext, ChunkReplacement,
+ CodeActionSource, ConflictsOurs, ConflictsOursMarker, ConflictsOuter, ConflictsTheirs,
+ ConflictsTheirsMarker, ContextMenuPlacement, CursorShape, CustomBlockId, DisplayDiffHunk,
+ DisplayPoint, DisplayRow, DocumentHighlightRead, DocumentHighlightWrite, EditDisplayMode,
+ Editor, EditorMode, EditorSettings, EditorSnapshot, EditorStyle, FILE_HEADER_HEIGHT,
+ FocusedBlock, GutterDimensions, HalfPageDown, HalfPageUp, HandleInput, HoveredCursor,
+ InlayHintRefreshReason, InlineCompletion, JumpData, LineDown, LineHighlight, LineUp,
+ MAX_LINE_LEN, MIN_LINE_NUMBER_DIGITS, MINIMAP_FONT_SIZE, MULTI_BUFFER_EXCERPT_HEADER_HEIGHT,
+ OpenExcerpts, PageDown, PageUp, PhantomBreakpointIndicator, Point, RowExt, RowRangeExt,
+ SelectPhase, SelectedTextHighlight, Selection, SoftWrap, StickyHeaderExcerpt, ToPoint,
+ ToggleFold,
code_context_menus::{CodeActionsMenu, MENU_ASIDE_MAX_WIDTH, MENU_ASIDE_MIN_WIDTH, MENU_GAP},
display_map::{
Block, BlockContext, BlockStyle, DisplaySnapshot, EditorMargins, FoldId, HighlightedChunk,
@@ -17,8 +17,7 @@ use crate::{
},
editor_settings::{
CurrentLineHighlight, DoubleClickInMultibuffer, MinimapThumb, MinimapThumbBorder,
- MultiCursorModifier, ScrollBeyondLastLine, ScrollbarAxes, ScrollbarDiagnostics,
- ShowMinimap, ShowScrollbar,
+ ScrollBeyondLastLine, ScrollbarAxes, ScrollbarDiagnostics, ShowMinimap, ShowScrollbar,
},
git::blame::{BlameRenderer, GitBlame, GlobalBlameRenderer},
hover_popover::{
@@ -678,7 +677,10 @@ impl EditorElement {
let point_for_position = position_map.point_for_position(event.position);
let position = point_for_position.previous_valid;
- if modifiers == COLUMNAR_SELECTION_MODIFIERS {
+
+ let multi_cursor_modifier = Editor::multi_cursor_modifier(true, &modifiers, cx);
+
+ if Editor::columnar_selection_modifiers(multi_cursor_modifier, &modifiers) {
editor.select(
SelectPhase::BeginColumnar {
position,
@@ -699,11 +701,6 @@ impl EditorElement {
cx,
);
} else {
- let multi_cursor_setting = EditorSettings::get_global(cx).multi_cursor_modifier;
- let multi_cursor_modifier = match multi_cursor_setting {
- MultiCursorModifier::Alt => modifiers.alt,
- MultiCursorModifier::CmdOrCtrl => modifiers.secondary(),
- };
editor.select(
SelectPhase::Begin {
position,
@@ -867,13 +864,9 @@ impl EditorElement {
let text_hitbox = &position_map.text_hitbox;
let pending_nonempty_selections = editor.has_pending_nonempty_selection();
- let multi_cursor_setting = EditorSettings::get_global(cx).multi_cursor_modifier;
- let multi_cursor_modifier = match multi_cursor_setting {
- MultiCursorModifier::Alt => event.modifiers().secondary(),
- MultiCursorModifier::CmdOrCtrl => event.modifiers().alt,
- };
+ let hovered_link_modifier = Editor::multi_cursor_modifier(false, &event.modifiers(), cx);
- if !pending_nonempty_selections && multi_cursor_modifier && text_hitbox.is_hovered(window) {
+ if !pending_nonempty_selections && hovered_link_modifier && text_hitbox.is_hovered(window) {
let point = position_map.point_for_position(event.up.position);
editor.handle_click_hovered_link(point, event.modifiers(), window, cx);
@@ -1,7 +1,7 @@
use crate::{
Anchor, Editor, EditorSettings, EditorSnapshot, FindAllReferences, GoToDefinition,
GoToTypeDefinition, GotoDefinitionKind, InlayId, Navigated, PointForPosition, SelectPhase,
- editor_settings::{GoToDefinitionFallback, MultiCursorModifier},
+ editor_settings::GoToDefinitionFallback,
hover_popover::{self, InlayHover},
scroll::ScrollAmount,
};
@@ -120,11 +120,7 @@ impl Editor {
window: &mut Window,
cx: &mut Context<Self>,
) {
- let multi_cursor_setting = EditorSettings::get_global(cx).multi_cursor_modifier;
- let hovered_link_modifier = match multi_cursor_setting {
- MultiCursorModifier::Alt => modifiers.secondary(),
- MultiCursorModifier::CmdOrCtrl => modifiers.alt,
- };
+ let hovered_link_modifier = Editor::multi_cursor_modifier(false, &modifiers, cx);
if !hovered_link_modifier || self.has_pending_selection() {
self.hide_hovered_link(cx);
return;