From a7a145ad3d78dc0b9f7c2ea289e07d60d9b51d30 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 7 Aug 2023 21:06:51 -0400 Subject: [PATCH] Center the picker preview selection using visual lines (#7837) this way the preview always shows the selection even if lines were wrapped --- helix-term/src/ui/picker.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs index f80bc512..5ee4c407 100644 --- a/helix-term/src/ui/picker.rs +++ b/helix-term/src/ui/picker.rs @@ -27,7 +27,7 @@ use std::{collections::HashMap, io::Read, path::PathBuf}; use crate::ui::{Prompt, PromptEvent}; use helix_core::{ - movement::Direction, text_annotations::TextAnnotations, + char_idx_at_visual_offset, movement::Direction, text_annotations::TextAnnotations, unicode::segmentation::UnicodeSegmentation, Position, Syntax, }; use helix_view::{ @@ -690,20 +690,20 @@ impl Picker { } }; - // align to middle - let first_line = range - .map(|(start, end)| { - let height = end.saturating_sub(start) + 1; - let middle = start + (height.saturating_sub(1) / 2); - middle.saturating_sub(inner.height as usize / 2).min(start) - }) - .unwrap_or(0); - - let offset = ViewPosition { - anchor: doc.text().line_to_char(first_line), - horizontal_offset: 0, - vertical_offset: 0, - }; + let mut offset = ViewPosition::default(); + if let Some(range) = range { + let text_fmt = doc.text_format(inner.width, None); + let annotations = TextAnnotations::default(); + (offset.anchor, offset.vertical_offset) = char_idx_at_visual_offset( + doc.text().slice(..), + doc.text().line_to_char(range.0), + // align to middle + -(inner.height as isize / 2), + 0, + &text_fmt, + &annotations, + ); + } let mut highlights = EditorView::doc_syntax_highlights( doc,