From c90263d59b8cde9e007f16b286f040fa849ecb24 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Mon, 13 May 2024 12:03:13 +0200 Subject: [PATCH] editor: Use proper rows for fold indicators in the gutter (#11741) Follow-up to #11656 Release Notes: - N/A --------- Co-authored-by: Kirill --- crates/editor/src/display_map.rs | 20 +++++++------------- crates/editor/src/element.rs | 26 ++++++++++---------------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index 65794a45cc..c4b047b428 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -70,17 +70,6 @@ pub trait ToDisplayPoint { type TextHighlights = TreeMap, Arc<(HighlightStyle, Vec>)>>; type InlayHighlights = TreeMap>; -#[derive(Clone)] -pub struct DisplayBufferRows<'a>(BlockBufferRows<'a>); - -impl<'a> Iterator for DisplayBufferRows<'a> { - type Item = Option; - - fn next(&mut self) -> Option { - self.0.next().map(|row| row.map(|r| DisplayRow(r.0))) - } -} - /// Decides how text in a [`MultiBuffer`] should be displayed in a buffer, handling inlay hints, /// folding, hard tabs, soft wrapping, custom blocks (like diagnostics), and highlighting. /// @@ -398,8 +387,13 @@ impl DisplaySnapshot { self.buffer_snapshot.len() == 0 } - pub fn display_rows(&self, start_row: DisplayRow) -> DisplayBufferRows { - DisplayBufferRows(self.block_snapshot.buffer_rows(BlockRow(start_row.0))) + pub fn buffer_rows( + &self, + start_row: DisplayRow, + ) -> impl Iterator> + '_ { + self.block_snapshot + .buffer_rows(BlockRow(start_row.0)) + .map(|row| row.map(|row| MultiBufferRow(row.0))) } pub fn max_buffer_row(&self) -> MultiBufferRow { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 3c1d655551..c6e4d58219 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1516,7 +1516,7 @@ impl EditorElement { let end = rows.end.max(relative_to); let buffer_rows = snapshot - .display_rows(start) + .buffer_rows(start) .take(1 + end.minus(start) as usize) .collect::>(); @@ -1554,7 +1554,7 @@ impl EditorElement { fn layout_line_numbers( &self, rows: Range, - buffer_rows: impl Iterator>, + buffer_rows: impl Iterator>, active_rows: &BTreeMap, newest_selection_head: Option, snapshot: &EditorSnapshot, @@ -1602,10 +1602,10 @@ impl EditorElement { } else { (false, cx.theme().colors().editor_line_number) }; - if let Some(display_row) = row { + if let Some(multibuffer_row) = row { if include_line_numbers { line_number.clear(); - let default_number = display_row.0 + 1; + let default_number = multibuffer_row.0 + 1; let number = relative_rows .get(&DisplayRow(ix as u32 + rows.start.0)) .unwrap_or(&default_number); @@ -1628,9 +1628,6 @@ impl EditorElement { fold_statuses.push( is_singleton .then(|| { - let multibuffer_point = - DisplayPoint::new(display_row, 0).to_point(snapshot); - let multibuffer_row = MultiBufferRow(multibuffer_point.row); snapshot .fold_for_line(multibuffer_row) .map(|fold_status| (fold_status, multibuffer_row, active)) @@ -3861,8 +3858,9 @@ impl Element for EditorElement { let end_row = DisplayRow(end_row); let buffer_rows = snapshot - .display_rows(start_row) - .take((start_row..end_row).len()); + .buffer_rows(start_row) + .take((start_row..end_row).len()) + .collect::>(); let start_anchor = if start_row == Default::default() { Anchor::min() @@ -3905,7 +3903,7 @@ impl Element for EditorElement { let (line_numbers, fold_statuses) = self.layout_line_numbers( start_row..end_row, - buffer_rows.clone(), + buffer_rows.clone().into_iter(), &active_rows, newest_selection_head, &snapshot, @@ -3975,11 +3973,7 @@ impl Element for EditorElement { } let blamed_display_rows = self.layout_blame_entries( - buffer_rows.map(|display_row| { - display_row.map(|row| { - MultiBufferRow(DisplayPoint::new(row, 0).to_point(&snapshot).row) - }) - }), + buffer_rows.into_iter(), em_width, scroll_position, line_height, @@ -4884,7 +4878,7 @@ mod tests { element .layout_line_numbers( DisplayRow(0)..DisplayRow(6), - (0..6).map(DisplayRow).map(Some), + (0..6).map(MultiBufferRow).map(Some), &Default::default(), Some(DisplayPoint::new(DisplayRow(0), 0)), &snapshot,