diff options
Diffstat (limited to 'helix-view/src')
-rw-r--r-- | helix-view/src/editor.rs | 4 | ||||
-rw-r--r-- | helix-view/src/view.rs | 34 |
2 files changed, 18 insertions, 20 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 32f5fe86..478f3818 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -180,7 +180,7 @@ impl Editor { view.jumps.push(jump); view.last_accessed_doc = Some(view.doc); view.doc = id; - view.first_line = 0; + view.offset = Position::default(); let (view, doc) = current!(self); @@ -194,7 +194,7 @@ impl Editor { .primary() .cursor(doc.text().slice(..)); let line = doc.text().char_to_line(pos); - view.first_line = line.saturating_sub(view.area.height as usize / 2); + view.offset.row = line.saturating_sub(view.area.height as usize / 2); return; } diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs index c7309fe9..f688dd7f 100644 --- a/helix-view/src/view.rs +++ b/helix-view/src/view.rs @@ -61,8 +61,7 @@ impl JumpList { pub struct View { pub id: ViewId, pub doc: DocumentId, - pub first_line: usize, - pub first_col: usize, + pub offset: Position, pub area: Rect, pub jumps: JumpList, /// the last accessed file before the current one @@ -74,8 +73,7 @@ impl View { Self { id: ViewId::default(), doc, - first_line: 0, - first_col: 0, + offset: Position::new(0, 0), area: Rect::default(), // will get calculated upon inserting into tree jumps: JumpList::new((doc, Selection::point(0))), // TODO: use actual sel last_accessed_doc: None, @@ -91,7 +89,7 @@ impl View { let line = pos.row; let col = pos.col; let height = self.area.height.saturating_sub(1); // - 1 for statusline - let last_line = (self.first_line + height as usize).saturating_sub(1); + let last_line = (self.offset.row + height as usize).saturating_sub(1); // - 1 so we have at least one gap in the middle. // a height of 6 with padding of 3 on each side will keep shifting the view back and forth @@ -100,22 +98,22 @@ impl View { // TODO: not ideal const OFFSET: usize = 7; // 1 diagnostic + 5 linenr + 1 gutter - let last_col = (self.first_col + self.area.width as usize).saturating_sub(OFFSET + 1); + let last_col = (self.offset.col + self.area.width as usize).saturating_sub(OFFSET + 1); if line > last_line.saturating_sub(scrolloff) { // scroll down - self.first_line += line - (last_line.saturating_sub(scrolloff)); - } else if line < self.first_line + scrolloff { + self.offset.row += line - (last_line.saturating_sub(scrolloff)); + } else if line < self.offset.row + scrolloff { // scroll up - self.first_line = line.saturating_sub(scrolloff); + self.offset.row = line.saturating_sub(scrolloff); } if col > last_col.saturating_sub(scrolloff) { // scroll right - self.first_col += col - (last_col.saturating_sub(scrolloff)); - } else if col < self.first_col + scrolloff { + self.offset.col += col - (last_col.saturating_sub(scrolloff)); + } else if col < self.offset.col + scrolloff { // scroll left - self.first_col = col.saturating_sub(scrolloff); + self.offset.col = col.saturating_sub(scrolloff); } } @@ -125,7 +123,7 @@ impl View { let height = self.area.height.saturating_sub(1); // - 1 for statusline std::cmp::min( // Saturating subs to make it inclusive zero indexing. - (self.first_line + height as usize).saturating_sub(1), + (self.offset.row + height as usize).saturating_sub(1), doc.text().len_lines().saturating_sub(1), ) } @@ -141,7 +139,7 @@ impl View { ) -> Option<Position> { let line = text.char_to_line(pos); - if line < self.first_line || line > self.last_line(doc) { + if line < self.offset.row || line > self.last_line(doc) { // Line is not visible on screen return None; } @@ -161,8 +159,8 @@ impl View { } // It is possible for underflow to occur if the buffer length is larger than the terminal width. - let row = line.saturating_sub(self.first_line); - let col = col.saturating_sub(self.first_col); + let row = line.saturating_sub(self.offset.row); + let col = col.saturating_sub(self.offset.col); Some(Position::new(row, col)) } @@ -186,7 +184,7 @@ impl View { return None; } - let line_number = (row - self.area.y) as usize + self.first_line; + let line_number = (row - self.area.y) as usize + self.offset.row; if line_number > text.len_lines() - 1 { return Some(text.len_chars()); @@ -196,7 +194,7 @@ impl View { let current_line = text.line(line_number); - let target = (column - OFFSET - self.area.x) as usize + self.first_col; + let target = (column - OFFSET - self.area.x) as usize + self.offset.col; let mut selected = 0; for grapheme in RopeGraphemes::new(current_line) { |