@@ -4,6 +4,7 @@ use std::borrow::Cow;
44
55use crate::{Document, DocumentId, ViewId};
66use helix_core::{
7+ coords_at_pos,
78 graphemes::{grapheme_width, RopeGraphemes},
89 Position, RopeSlice, Selection,
910};
@@ -56,6 +57,7 @@ pub struct View {
5657 pub id: ViewId,
5758 pub doc: DocumentId,
5859 pub first_line: usize,
60+ pub first_col: usize,
5961 pub area: Rect,
6062 pub jumps: JumpList,
6163}
@@ -66,6 +68,7 @@ impl View {
6668 id: ViewId::default(),
6769 doc,
6870 first_line: 0,
71+ first_col: 0,
6972 area: Rect::default(), // will get calculated upon inserting into tree
7073 jumps: JumpList::new((doc, Selection::point(0))), // TODO: use actual sel
7174 };
@@ -75,18 +78,30 @@ impl View {
7578
7679 pub fn ensure_cursor_in_view(&mut self, doc: &Document) {
7780 let cursor = doc.selection(self.id).cursor();
78− let line = doc.text().char_to_line(cursor);
79− let document_end = self.first_line + (self.area.height as usize).saturating_sub(2);
81+ let pos = coords_at_pos(doc.text().slice(..), cursor);
82+ let line = pos.row;
83+ let col = pos.col;
84+ let last_line = self.first_line + (self.area.height as usize).saturating_sub(2);
8085
81− // TODO: side scroll
86+ // TODO: not ideal
87+ const OFFSET: usize = 7; // 1 diagnostic + 5 linenr + 1 gutter
88+ let last_col = self.first_col + (self.area.width as usize - OFFSET);
8289
83− if line > document_end.saturating_sub(PADDING) {
90+ if line > last_line.saturating_sub(PADDING) {
8491 // scroll down
85− self.first_line += line - (document_end.saturating_sub(PADDING));
92+ self.first_line += line - (last_line.saturating_sub(PADDING));
8693 } else if line < self.first_line + PADDING {
8794 // scroll up
8895 self.first_line = line.saturating_sub(PADDING);
8996 }
97+
98+ if col > last_col.saturating_sub(PADDING) {
99+ // scroll right
100+ self.first_col += col - (last_col.saturating_sub(PADDING));
101+ } else if col < self.first_col + PADDING {
102+ // scroll left
103+ self.first_col = col.saturating_sub(PADDING);
104+ }
90105 }
91106
92107 /// Calculates the last visible line on screen
@@ -130,6 +145,7 @@ impl View {
130145 }
131146
132147 let row = line - self.first_line as usize;
148+ let col = col - self.first_col as usize;
133149
134150 Some(Position::new(row, col))
135151 }