diff options
Diffstat (limited to 'alacritty_terminal/src/grid')
-rw-r--r-- | alacritty_terminal/src/grid/mod.rs | 40 | ||||
-rw-r--r-- | alacritty_terminal/src/grid/tests.rs | 15 |
2 files changed, 43 insertions, 12 deletions
diff --git a/alacritty_terminal/src/grid/mod.rs b/alacritty_terminal/src/grid/mod.rs index 1925a6f4..e2cda175 100644 --- a/alacritty_terminal/src/grid/mod.rs +++ b/alacritty_terminal/src/grid/mod.rs @@ -120,7 +120,7 @@ pub enum Scroll { } #[derive(Copy, Clone)] -pub enum ViewportPosition { +enum ViewportPosition { Visible(Line), Above, Below, @@ -141,11 +141,25 @@ impl<T: GridCell + Copy + Clone> Grid<T> { } } - pub fn visible_to_buffer(&self, point: Point) -> Point<usize> { - Point { line: self.visible_line_to_buffer(point.line), col: point.col } + pub fn buffer_to_visible(&self, point: impl Into<Point<usize>>) -> Point<usize> { + let mut point = point.into(); + + match self.buffer_line_to_visible(point.line) { + ViewportPosition::Visible(line) => point.line = line.0, + ViewportPosition::Above => { + point.col = Column(0); + point.line = 0; + }, + ViewportPosition::Below => { + point.col = self.num_cols(); + point.line = self.num_lines().0 - 1; + }, + } + + point } - pub fn buffer_line_to_visible(&self, line: usize) -> ViewportPosition { + fn buffer_line_to_visible(&self, line: usize) -> ViewportPosition { let offset = line.saturating_sub(self.display_offset); if line < self.display_offset { ViewportPosition::Below @@ -156,7 +170,11 @@ impl<T: GridCell + Copy + Clone> Grid<T> { } } - pub fn visible_line_to_buffer(&self, line: Line) -> usize { + pub fn visible_to_buffer(&self, point: Point) -> Point<usize> { + Point { line: self.visible_line_to_buffer(point.line), col: point.col } + } + + fn visible_line_to_buffer(&self, line: Line) -> usize { self.line_to_offset(line) + self.display_offset } @@ -596,7 +614,17 @@ pub struct GridIterator<'a, T> { grid: &'a Grid<T>, /// Current position of the iterator within the grid. - pub cur: Point<usize>, + cur: Point<usize>, +} + +impl<'a, T> GridIterator<'a, T> { + pub fn point(&self) -> Point<usize> { + self.cur + } + + pub fn cell(&self) -> &'a T { + &self.grid[self.cur.line][self.cur.col] + } } impl<'a, T> Iterator for GridIterator<'a, T> { diff --git a/alacritty_terminal/src/grid/tests.rs b/alacritty_terminal/src/grid/tests.rs index a352e747..d28e7833 100644 --- a/alacritty_terminal/src/grid/tests.rs +++ b/alacritty_terminal/src/grid/tests.rs @@ -109,8 +109,8 @@ fn test_iter() { assert_eq!(None, iter.prev()); assert_eq!(Some(&1), iter.next()); - assert_eq!(Column(1), iter.cur.col); - assert_eq!(4, iter.cur.line); + assert_eq!(Column(1), iter.point().col); + assert_eq!(4, iter.point().line); assert_eq!(Some(&2), iter.next()); assert_eq!(Some(&3), iter.next()); @@ -118,12 +118,15 @@ fn test_iter() { // test linewrapping assert_eq!(Some(&5), iter.next()); - assert_eq!(Column(0), iter.cur.col); - assert_eq!(3, iter.cur.line); + assert_eq!(Column(0), iter.point().col); + assert_eq!(3, iter.point().line); assert_eq!(Some(&4), iter.prev()); - assert_eq!(Column(4), iter.cur.col); - assert_eq!(4, iter.cur.line); + assert_eq!(Column(4), iter.point().col); + assert_eq!(4, iter.point().line); + + // Make sure iter.cell() returns the current iterator position + assert_eq!(&4, iter.cell()); // test that iter ends at end of grid let mut final_iter = grid.iter_from(Point { line: 0, col: Column(4) }); |