aboutsummaryrefslogtreecommitdiff
path: root/helix-view
diff options
context:
space:
mode:
authorCossonLeo2021-11-09 02:11:45 +0000
committerGitHub2021-11-09 02:11:45 +0000
commita69caff450ff8201e16d0a0b4617114e03ed3c97 (patch)
treedc33ad1996083c776234645cf4afd30167c2a136 /helix-view
parentf96be0fcbc69e7a2fd6cb4ccd16ae99002109893 (diff)
search_impl will only align cursor center when it isn't in view (#959)
Diffstat (limited to 'helix-view')
-rw-r--r--helix-view/src/view.rs41
1 files changed, 33 insertions, 8 deletions
diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs
index 11f30155..6a624ded 100644
--- a/helix-view/src/view.rs
+++ b/helix-view/src/view.rs
@@ -85,7 +85,12 @@ impl View {
self.area.clip_left(OFFSET).clip_bottom(1) // -1 for statusline
}
- pub fn ensure_cursor_in_view(&mut self, doc: &Document, scrolloff: usize) {
+ //
+ pub fn offset_coords_to_in_view(
+ &self,
+ doc: &Document,
+ scrolloff: usize,
+ ) -> Option<(usize, usize)> {
let cursor = doc
.selection(self.id)
.primary()
@@ -104,23 +109,43 @@ impl View {
let last_col = self.offset.col + inner_area.width.saturating_sub(1) as usize;
- if line > last_line.saturating_sub(scrolloff) {
+ let row = if line > last_line.saturating_sub(scrolloff) {
// scroll down
- self.offset.row += line - (last_line.saturating_sub(scrolloff));
+ self.offset.row + line - (last_line.saturating_sub(scrolloff))
} else if line < self.offset.row + scrolloff {
// scroll up
- self.offset.row = line.saturating_sub(scrolloff);
- }
+ line.saturating_sub(scrolloff)
+ } else {
+ self.offset.row
+ };
- if col > last_col.saturating_sub(scrolloff) {
+ let col = if col > last_col.saturating_sub(scrolloff) {
// scroll right
- self.offset.col += col - (last_col.saturating_sub(scrolloff));
+ self.offset.col + col - (last_col.saturating_sub(scrolloff))
} else if col < self.offset.col + scrolloff {
// scroll left
- self.offset.col = col.saturating_sub(scrolloff);
+ col.saturating_sub(scrolloff)
+ } else {
+ self.offset.col
+ };
+ if row == self.offset.row && col == self.offset.col {
+ None
+ } else {
+ Some((row, col))
}
}
+ pub fn ensure_cursor_in_view(&mut self, doc: &Document, scrolloff: usize) {
+ if let Some((row, col)) = self.offset_coords_to_in_view(doc, scrolloff) {
+ self.offset.row = row;
+ self.offset.col = col;
+ }
+ }
+
+ pub fn is_cursor_in_view(&mut self, doc: &Document, scrolloff: usize) -> bool {
+ self.offset_coords_to_in_view(doc, scrolloff).is_none()
+ }
+
/// Calculates the last visible line on screen
#[inline]
pub fn last_line(&self, doc: &Document) -> usize {