Show highlighted symbol in the scrollbar (#7029)
Release Notes: - Added highlighted symbols to the scrollbar; partially mentioned in: - https://github.com/zed-industries/zed/issues/5308 - https://github.com/zed-industries/zed/issues/4866
This commit is contained in:
parent
871b8525b4
commit
cbcaca4153
3 changed files with 55 additions and 5 deletions
|
@ -111,7 +111,9 @@
|
||||||
// Whether to show git diff indicators in the scrollbar.
|
// Whether to show git diff indicators in the scrollbar.
|
||||||
"git_diff": true,
|
"git_diff": true,
|
||||||
// Whether to show selections in the scrollbar.
|
// Whether to show selections in the scrollbar.
|
||||||
"selections": true
|
"selections": true,
|
||||||
|
// Whether to show symbols selections in the scrollbar.
|
||||||
|
"symbols_selections": true
|
||||||
},
|
},
|
||||||
"relative_line_numbers": false,
|
"relative_line_numbers": false,
|
||||||
// When to populate a new search's query based on the text under the cursor.
|
// When to populate a new search's query based on the text under the cursor.
|
||||||
|
|
|
@ -31,6 +31,7 @@ pub struct Scrollbar {
|
||||||
pub show: ShowScrollbar,
|
pub show: ShowScrollbar,
|
||||||
pub git_diff: bool,
|
pub git_diff: bool,
|
||||||
pub selections: bool,
|
pub selections: bool,
|
||||||
|
pub symbols_selections: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// When to show the scrollbar in the editor.
|
/// When to show the scrollbar in the editor.
|
||||||
|
@ -103,6 +104,10 @@ pub struct ScrollbarContent {
|
||||||
///
|
///
|
||||||
/// Default: true
|
/// Default: true
|
||||||
pub selections: Option<bool>,
|
pub selections: Option<bool>,
|
||||||
|
/// Whether to show symbols highlighted markers in the scrollbar.
|
||||||
|
///
|
||||||
|
/// Default: true
|
||||||
|
pub symbols_selections: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Settings for EditorSettings {
|
impl Settings for EditorSettings {
|
||||||
|
|
|
@ -16,9 +16,10 @@ use crate::{
|
||||||
},
|
},
|
||||||
mouse_context_menu,
|
mouse_context_menu,
|
||||||
scroll::scroll_amount::ScrollAmount,
|
scroll::scroll_amount::ScrollAmount,
|
||||||
CursorShape, DisplayPoint, Editor, EditorMode, EditorSettings, EditorSnapshot, EditorStyle,
|
CursorShape, DisplayPoint, DocumentHighlightRead, DocumentHighlightWrite, Editor, EditorMode,
|
||||||
HalfPageDown, HalfPageUp, HoveredCursor, LineDown, LineUp, OpenExcerpts, PageDown, PageUp,
|
EditorSettings, EditorSnapshot, EditorStyle, HalfPageDown, HalfPageUp, HoveredCursor, LineDown,
|
||||||
Point, SelectPhase, Selection, SoftWrap, ToPoint, CURSORS_VISIBLE_FOR, MAX_LINE_LEN,
|
LineUp, OpenExcerpts, PageDown, PageUp, Point, SelectPhase, Selection, SoftWrap, ToPoint,
|
||||||
|
CURSORS_VISIBLE_FOR, MAX_LINE_LEN,
|
||||||
};
|
};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use collections::{BTreeMap, HashMap};
|
use collections::{BTreeMap, HashMap};
|
||||||
|
@ -1366,6 +1367,44 @@ impl EditorElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if layout.is_singleton && scrollbar_settings.symbols_selections {
|
||||||
|
let selection_ranges = self.editor.read(cx).background_highlights_in_range(
|
||||||
|
Anchor::min()..Anchor::max(),
|
||||||
|
&layout.position_map.snapshot,
|
||||||
|
cx.theme().colors(),
|
||||||
|
);
|
||||||
|
for hunk in selection_ranges {
|
||||||
|
let start_display = Point::new(hunk.0.start.row(), 0)
|
||||||
|
.to_display_point(&layout.position_map.snapshot.display_snapshot);
|
||||||
|
let end_display = Point::new(hunk.0.end.row(), 0)
|
||||||
|
.to_display_point(&layout.position_map.snapshot.display_snapshot);
|
||||||
|
let start_y = y_for_row(start_display.row() as f32);
|
||||||
|
let mut end_y = if hunk.0.start == hunk.0.end {
|
||||||
|
y_for_row((end_display.row() + 1) as f32)
|
||||||
|
} else {
|
||||||
|
y_for_row((end_display.row()) as f32)
|
||||||
|
};
|
||||||
|
|
||||||
|
if end_y - start_y < px(1.) {
|
||||||
|
end_y = start_y + px(1.);
|
||||||
|
}
|
||||||
|
let bounds = Bounds::from_corners(point(left, start_y), point(right, end_y));
|
||||||
|
|
||||||
|
cx.paint_quad(quad(
|
||||||
|
bounds,
|
||||||
|
Corners::default(),
|
||||||
|
cx.theme().status().info,
|
||||||
|
Edges {
|
||||||
|
top: Pixels::ZERO,
|
||||||
|
right: px(1.),
|
||||||
|
bottom: Pixels::ZERO,
|
||||||
|
left: px(1.),
|
||||||
|
},
|
||||||
|
cx.theme().colors().scrollbar_thumb_border,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if layout.is_singleton && scrollbar_settings.git_diff {
|
if layout.is_singleton && scrollbar_settings.git_diff {
|
||||||
for hunk in layout
|
for hunk in layout
|
||||||
.position_map
|
.position_map
|
||||||
|
@ -2032,8 +2071,12 @@ impl EditorElement {
|
||||||
||
|
||
|
||||||
// Selections
|
// Selections
|
||||||
(is_singleton && scrollbar_settings.selections && editor.has_background_highlights::<BufferSearchHighlights>())
|
(is_singleton && scrollbar_settings.selections && editor.has_background_highlights::<BufferSearchHighlights>())
|
||||||
|
||
|
||||||
|
// Symbols Selections
|
||||||
|
(is_singleton && scrollbar_settings.symbols_selections && (editor.has_background_highlights::<DocumentHighlightRead>() || editor.has_background_highlights::<DocumentHighlightWrite>()))
|
||||||
|
||
|
||||||
// Scrollmanager
|
// Scrollmanager
|
||||||
|| editor.scroll_manager.scrollbars_visible()
|
editor.scroll_manager.scrollbars_visible()
|
||||||
}
|
}
|
||||||
ShowScrollbar::System => editor.scroll_manager.scrollbars_visible(),
|
ShowScrollbar::System => editor.scroll_manager.scrollbars_visible(),
|
||||||
ShowScrollbar::Always => true,
|
ShowScrollbar::Always => true,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue