From 987a8dbd0d3176942ecc29f603b050f476dbd9fe Mon Sep 17 00:00:00 2001 From: SoraTenshi Date: Tue, 28 Feb 2023 21:01:06 +0100 Subject: [PATCH] Make the gutter render the correct sticky note line number --- helix-term/src/ui/editor.rs | 34 +++++++++++++++++++++++++++------- helix-view/src/gutter.rs | 34 ++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index df6dfc6b4..32740f3c4 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -198,7 +198,15 @@ impl EditorView { translated_positions.push((cursor, Box::new(update_cursor_cache))); } - Self::render_gutter(editor, doc, view, theme, is_focused, &mut line_decorations); + Self::render_gutter( + editor, + doc, + &self.sticky_nodes, + view, + theme, + is_focused, + &mut line_decorations, + ); render_document( surface, @@ -595,6 +603,7 @@ impl EditorView { pub fn render_gutter<'d>( editor: &'d Editor, doc: &'d Document, + context: &'d Option>, view: &View, theme: &Theme, is_focused: bool, @@ -634,9 +643,20 @@ impl EditorView { (true, false) => gutter_selected_style_virtual, }; - if let Some(style) = - gutter(pos.doc_line, selected, pos.first_visual_line, &mut text) + let mut doc_line = Some(pos.doc_line); + + if let Some(current_context) = context + .as_ref() + .and_then(|c| c.iter().find(|n| n.visual_line == pos.visual_line)) { + doc_line = if current_context.indicator.is_some() { + None + } else { + Some(current_context.line_nr) + }; + } + + if let Some(style) = gutter(doc_line, selected, pos.first_visual_line, &mut text) { renderer .surface .set_stringn(x, y, &text, width, gutter_style.patch(style)); @@ -863,12 +883,12 @@ impl EditorView { context = context .into_iter() .rev() - .take(viewport.height as usize / 3) + .take(viewport.height as usize / 3) // only take the nodes until 1 / 3 of the viewport is reached .enumerate() - .take_while(|(i, _)| *i + 1 != visual_cursor_pos as usize) - .map(|(index, node)| { + .take_while(|(i, _)| *i + 1 != visual_cursor_pos as usize) // also only nodes that don't overlap with the visual cursor position + .map(|(i, node)| { let mut new_node = node; - new_node.visual_line = index as u16; + new_node.visual_line = i as u16; new_node }) .collect(); diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs index cb9e43336..351edb030 100644 --- a/helix-view/src/gutter.rs +++ b/helix-view/src/gutter.rs @@ -11,7 +11,8 @@ fn count_digits(n: usize) -> usize { std::iter::successors(Some(n), |&n| (n >= 10).then_some(n / 10)).count() } -pub type GutterFn<'doc> = Box Option