From 6363fdab8871ff87a5143fadf26915a2c1e17145 Mon Sep 17 00:00:00 2001 From: Finn Evers Date: Mon, 26 May 2025 13:47:10 +0200 Subject: [PATCH] editor: Do not offset text in single line editors by default (#30599) Follow-up to #30138 In the linked PR, I enabled the content offset for all editors by default. However, this introduced a small regression: There are some editors where we do not want the text to be offset, most notably the rename and the filename editor. This PR adds a method to disable the content offset for specific editors. I specifically decided on an opt-out approach, since I think that having the small offset for most editors is actually a benefit instead of a disadvantage. However, open to change that or to disable the offset for all editors but full mode editors by default if that should be preferred. | `main` | This PR | | --- | --- | | ![main](https://github.com/user-attachments/assets/a7e9249e-ac5c-422f-9f30-021ebf21850b) | ![pr](https://github.com/user-attachments/assets/c5eef4e6-fad8-46ab-9f2d-d0ebdca01e2c) | Release Notes: - N/A --- .../collab_ui/src/chat_panel/message_editor.rs | 1 + crates/editor/src/editor.rs | 13 +++++++++++++ crates/editor/src/element.rs | 16 ++++++++++++---- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/crates/collab_ui/src/chat_panel/message_editor.rs b/crates/collab_ui/src/chat_panel/message_editor.rs index 25e0684c6b..d9cb0ade33 100644 --- a/crates/collab_ui/src/chat_panel/message_editor.rs +++ b/crates/collab_ui/src/chat_panel/message_editor.rs @@ -107,6 +107,7 @@ impl MessageEditor { let this = cx.entity().downgrade(); editor.update(cx, |editor, cx| { editor.set_soft_wrap_mode(SoftWrap::EditorWidth, cx); + editor.set_offset_content(false, cx); editor.set_use_autoclose(false); editor.set_show_gutter(false, cx); editor.set_show_wrap_guides(false, cx); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index df79e5eec3..355bcb0bd6 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -923,6 +923,7 @@ pub struct Editor { show_gutter: bool, show_scrollbars: bool, minimap_visibility: MinimapVisibility, + offset_content: bool, disable_expand_excerpt_buttons: bool, show_line_numbers: Option, use_relative_line_numbers: Option, @@ -1761,6 +1762,7 @@ impl Editor { show_local_selections: true, show_scrollbars: full_mode, minimap_visibility: MinimapVisibility::for_mode(&mode, cx), + offset_content: !matches!(mode, EditorMode::SingleLine { .. }), show_breadcrumbs: EditorSettings::get_global(cx).toolbar.breadcrumbs, show_gutter: mode.is_full(), show_line_numbers: None, @@ -16921,6 +16923,17 @@ impl Editor { self.set_minimap_visibility(MinimapVisibility::Disabled, window, cx); } + /// Normally the text in full mode and auto height editors is padded on the + /// left side by roughly half a character width for improved hit testing. + /// + /// Use this method to disable this for cases where this is not wanted (e.g. + /// if you want to align the editor text with some other text above or below) + /// or if you want to add this padding to single-line editors. + pub fn set_offset_content(&mut self, offset_content: bool, cx: &mut Context) { + self.offset_content = offset_content; + cx.notify(); + } + pub fn set_show_line_numbers(&mut self, show_line_numbers: bool, cx: &mut Context) { self.show_line_numbers = Some(show_line_numbers); cx.notify(); diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index ca895586b0..368b79dbc7 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -7343,9 +7343,12 @@ impl Element for EditorElement { self.max_line_number_width(&snapshot, window, cx), cx, ) - .unwrap_or_else(|| { - GutterDimensions::default_with_margin(font_id, font_size, cx) - }); + .or_else(|| { + self.editor.read(cx).offset_content.then(|| { + GutterDimensions::default_with_margin(font_id, font_size, cx) + }) + }) + .unwrap_or_default(); let text_width = bounds.size.width - gutter_dimensions.width; let settings = EditorSettings::get_global(cx); @@ -9391,7 +9394,12 @@ fn compute_auto_height_layout( let mut snapshot = editor.snapshot(window, cx); let gutter_dimensions = snapshot .gutter_dimensions(font_id, font_size, max_line_number_width, cx) - .unwrap_or_else(|| GutterDimensions::default_with_margin(font_id, font_size, cx)); + .or_else(|| { + editor + .offset_content + .then(|| GutterDimensions::default_with_margin(font_id, font_size, cx)) + }) + .unwrap_or_default(); editor.gutter_dimensions = gutter_dimensions; let text_width = width - gutter_dimensions.width;