diff --git a/assets/settings/default.json b/assets/settings/default.json index a0e57b947ba88570081f61dceeaf0f08ab3a5871..1852ace708c53f6a651420b77d7e83f9afc978c3 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -255,6 +255,19 @@ // Whether to display inline and alongside documentation for items in the // completions menu "show_completion_documentation": true, + // When to show the scrollbar in the completion menu. + // This setting can take four values: + // + // 1. Show the scrollbar if there's important information or + // follow the system's configured behavior + // "auto" + // 2. Match the system's configured behavior: + // "system" + // 3. Always show the scrollbar: + // "always" + // 4. Never show the scrollbar: + // "never" (default) + "completion_menu_scrollbar": "never", // Show method signatures in the editor, when inside parentheses. "auto_signature_help": false, // Whether to show the signature help after completion or a bracket pair inserted. diff --git a/crates/editor/src/code_context_menus.rs b/crates/editor/src/code_context_menus.rs index 359c985ee9208a1a83e3458635df883c2cf991a8..b7f3d57870a9504b7e6f9f736a0951b9b4b733e5 100644 --- a/crates/editor/src/code_context_menus.rs +++ b/crates/editor/src/code_context_menus.rs @@ -28,10 +28,12 @@ use std::{ rc::Rc, }; use task::ResolvedTask; -use ui::{Color, IntoElement, ListItem, Pixels, Popover, Styled, prelude::*}; +use ui::{ + Color, IntoElement, ListItem, Pixels, Popover, ScrollAxes, Scrollbars, Styled, WithScrollbar, + prelude::*, +}; use util::ResultExt; -use crate::CodeActionSource; use crate::hover_popover::{hover_markdown_style, open_markdown_url}; use crate::{ CodeActionProvider, CompletionId, CompletionItemKind, CompletionProvider, DisplayRow, Editor, @@ -39,7 +41,8 @@ use crate::{ actions::{ConfirmCodeAction, ConfirmCompletion}, split_words, styled_runs_for_code_label, }; -use settings::SnippetSortOrder; +use crate::{CodeActionSource, EditorSettings}; +use settings::{Settings, SnippetSortOrder}; pub const MENU_GAP: Pixels = px(4.); pub const MENU_ASIDE_X_PADDING: Pixels = px(16.); @@ -261,6 +264,20 @@ impl Drop for CompletionsMenu { } } +struct CompletionMenuScrollBarSetting; + +impl ui::scrollbars::GlobalSetting for CompletionMenuScrollBarSetting { + fn get_value(_cx: &App) -> &Self { + &Self + } +} + +impl ui::scrollbars::ScrollbarVisibility for CompletionMenuScrollBarSetting { + fn visibility(&self, cx: &App) -> ui::scrollbars::ShowScrollbar { + EditorSettings::get_global(cx).completion_menu_scrollbar + } +} + impl CompletionsMenu { pub fn new( id: CompletionId, @@ -898,7 +915,17 @@ impl CompletionsMenu { } }); - Popover::new().child(list).into_any_element() + Popover::new() + .child( + div().child(list).custom_scrollbars( + Scrollbars::for_settings::() + .show_along(ScrollAxes::Vertical) + .tracked_scroll_handle(self.scroll_handle.clone()), + window, + cx, + ), + ) + .into_any_element() } fn render_aside( diff --git a/crates/editor/src/editor_settings.rs b/crates/editor/src/editor_settings.rs index 1a84631aa5a0a91a0ec56c0aab7ca58b51facbb1..77c9558eaf4ea49df981b8eb32ee075d069da08f 100644 --- a/crates/editor/src/editor_settings.rs +++ b/crates/editor/src/editor_settings.rs @@ -55,6 +55,7 @@ pub struct EditorSettings { pub drag_and_drop_selection: DragAndDropSelection, pub lsp_document_colors: DocumentColorsRenderMode, pub minimum_contrast_for_highlights: f32, + pub completion_menu_scrollbar: ShowScrollbar, } #[derive(Debug, Clone)] pub struct Jupyter { @@ -268,6 +269,7 @@ impl Settings for EditorSettings { }, lsp_document_colors: editor.lsp_document_colors.unwrap(), minimum_contrast_for_highlights: editor.minimum_contrast_for_highlights.unwrap().0, + completion_menu_scrollbar: editor.completion_menu_scrollbar.map(Into::into).unwrap(), } } } diff --git a/crates/gpui/src/elements/uniform_list.rs b/crates/gpui/src/elements/uniform_list.rs index 739fa1c5e25eb62378fbe57eea1b62c833780d9d..93082563c02f4168b1d73e2929a6bf9dbd153237 100644 --- a/crates/gpui/src/elements/uniform_list.rs +++ b/crates/gpui/src/elements/uniform_list.rs @@ -251,8 +251,6 @@ impl Element for UniformList { None } - // self.max_found_width = 0.0 - // fn request_layout( &mut self, global_id: Option<&GlobalElementId>, diff --git a/crates/settings/src/settings_content/editor.rs b/crates/settings/src/settings_content/editor.rs index d1f6347e4d86f301f64e3ec01c3932f9e7bf3bd3..a1567f9d0e5b16ed6058cef9ca954c0e842605be 100644 --- a/crates/settings/src/settings_content/editor.rs +++ b/crates/settings/src/settings_content/editor.rs @@ -197,6 +197,19 @@ pub struct EditorSettingsContent { /// /// Default: [`DocumentColorsRenderMode::Inlay`] pub lsp_document_colors: Option, + /// When to show the scrollbar in the completion menu. + /// This setting can take four values: + /// + /// 1. Show the scrollbar if there's important information or + /// follow the system's configured behavior + /// "auto" + /// 2. Match the system's configured behavior: + /// "system" + /// 3. Always show the scrollbar: + /// "always" + /// 4. Never show the scrollbar: + /// "never" (default) + pub completion_menu_scrollbar: Option, } // Toolbar related settings diff --git a/crates/settings/src/vscode_import.rs b/crates/settings/src/vscode_import.rs index 8f9c60960ce9dddf49109d0374d611f7672077ad..ba8392bcd3a3a775af7e4caaa949a79095703817 100644 --- a/crates/settings/src/vscode_import.rs +++ b/crates/settings/src/vscode_import.rs @@ -299,6 +299,7 @@ impl VsCodeSettings { toolbar: None, use_smartcase_search: self.read_bool("search.smartCase"), vertical_scroll_margin: self.read_f32("editor.cursorSurroundingLines"), + completion_menu_scrollbar: None, } } diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs index 5f1282a9a2e612c7d759231ff6ec84c06ae11e18..89986d925ce88d50629a58fb48faa629f63cab12 100644 --- a/crates/settings_ui/src/page_data.rs +++ b/crates/settings_ui/src/page_data.rs @@ -6541,6 +6541,19 @@ fn language_settings_data() -> Vec { metadata: None, files: USER | PROJECT, }), + SettingsPageItem::SettingItem(SettingItem { + title: "Completion Menu Scrollbar", + description: "When to show the scrollbar in the completion menu.", + field: Box::new(SettingField { + json_path: Some("editor.completion_menu_scrollbar"), + pick: |settings_content| settings_content.editor.completion_menu_scrollbar.as_ref(), + write: |settings_content, value| { + settings_content.editor.completion_menu_scrollbar = value; + }, + }), + metadata: None, + files: USER, + }), SettingsPageItem::SectionHeader("Inlay Hints"), SettingsPageItem::SettingItem(SettingItem { title: "Enabled", diff --git a/crates/ui/src/components/scrollbar.rs b/crates/ui/src/components/scrollbar.rs index b7548218371d0772b422adb04f1e326de040241f..d3d33a296bbd65edb24371d8f5f1e6462e77e3fe 100644 --- a/crates/ui/src/components/scrollbar.rs +++ b/crates/ui/src/components/scrollbar.rs @@ -392,7 +392,7 @@ pub struct Scrollbars { impl Scrollbars { pub fn new(show_along: ScrollAxes) -> Self { - Self::new_with_setting(show_along, |_| ShowScrollbar::Always) + Self::new_with_setting(show_along, |_| ShowScrollbar::default()) } pub fn for_settings() -> Scrollbars { diff --git a/docs/src/visual-customization.md b/docs/src/visual-customization.md index 509e47863357fa71081d8c70e34fa68d841e09f8..a5c4ccf8490458ff671fdc3425f480471df077a9 100644 --- a/docs/src/visual-customization.md +++ b/docs/src/visual-customization.md @@ -368,6 +368,8 @@ TBD: Centered layout related settings // How to render LSP `textDocument/documentColor` colors in the editor. "lsp_document_colors": "inlay", // none, inlay, border, background + // When to show the scrollbar in the completion menu. + "completion_menu_scrollbar": "never", // auto, system, always, never ``` ### Edit Predictions {#editor-ai}