Reuse visual_coords_at_pos function in view
This commit is contained in:
parent
74a9dd51ff
commit
5d14f56fa9
3 changed files with 17 additions and 22 deletions
|
@ -1,8 +1,9 @@
|
|||
use std::borrow::Cow;
|
||||
|
||||
use crate::{
|
||||
chars::char_is_line_ending,
|
||||
graphemes::{ensure_grapheme_boundary_prev, RopeGraphemes},
|
||||
graphemes::{ensure_grapheme_boundary_prev, grapheme_width, RopeGraphemes},
|
||||
line_ending::line_end_char_index,
|
||||
unicode::width::UnicodeWidthChar,
|
||||
RopeSlice,
|
||||
};
|
||||
|
||||
|
@ -77,14 +78,17 @@ pub fn visual_coords_at_pos(text: RopeSlice, pos: usize, tab_width: usize) -> Po
|
|||
|
||||
let line_start = text.line_to_char(line);
|
||||
let pos = ensure_grapheme_boundary_prev(text, pos);
|
||||
let col = text
|
||||
.slice(line_start..pos)
|
||||
.chars()
|
||||
.flat_map(|c| match c {
|
||||
'\t' => Some(tab_width),
|
||||
c => UnicodeWidthChar::width(c),
|
||||
})
|
||||
.sum();
|
||||
|
||||
let mut col = 0;
|
||||
|
||||
for grapheme in RopeGraphemes::new(text.slice(line_start..pos)) {
|
||||
if grapheme == "\t" {
|
||||
col += tab_width;
|
||||
} else {
|
||||
let grapheme = Cow::from(grapheme);
|
||||
col += grapheme_width(&grapheme);
|
||||
}
|
||||
}
|
||||
|
||||
Position::new(line, col)
|
||||
}
|
||||
|
|
|
@ -1551,6 +1551,7 @@ fn search_impl(
|
|||
};
|
||||
|
||||
doc.set_selection(view.id, selection);
|
||||
// TODO: is_cursor_in_view does the same calculation as ensure_cursor_in_view
|
||||
if view.is_cursor_in_view(doc, 0) {
|
||||
view.ensure_cursor_in_view(doc, scrolloff);
|
||||
} else {
|
||||
|
|
|
@ -204,19 +204,9 @@ impl View {
|
|||
return None;
|
||||
}
|
||||
|
||||
let line_start = text.line_to_char(line);
|
||||
let line_slice = text.slice(line_start..pos);
|
||||
let mut col = 0;
|
||||
let tab_width = doc.tab_width();
|
||||
|
||||
for grapheme in RopeGraphemes::new(line_slice) {
|
||||
if grapheme == "\t" {
|
||||
col += tab_width;
|
||||
} else {
|
||||
let grapheme = Cow::from(grapheme);
|
||||
col += grapheme_width(&grapheme);
|
||||
}
|
||||
}
|
||||
// TODO: visual_coords_at_pos also does char_to_line which we ignore, can we reuse the call?
|
||||
let Position { col, .. } = visual_coords_at_pos(text, pos, tab_width);
|
||||
|
||||
// It is possible for underflow to occur if the buffer length is larger than the terminal width.
|
||||
let row = line.saturating_sub(self.offset.row);
|
||||
|
|
Loading…
Reference in a new issue