diff options
Diffstat (limited to 'src/term/mod.rs')
-rw-r--r-- | src/term/mod.rs | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/src/term/mod.rs b/src/term/mod.rs index eefc432e..af464320 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -941,16 +941,11 @@ impl Term { use std::ops::Range; trait Append : PushChar { - fn append(&mut self, grid: &Grid<Cell>, line: usize, cols: Range<Column>) -> Option<Range<Column>>; + fn append(&mut self, grid: &Grid<Cell>, line: usize, cols: Range<Column>); } impl Append for String { - fn append( - &mut self, - grid: &Grid<Cell>, - mut line: usize, - cols: Range<Column> - ) -> Option<Range<Column>> { + fn append(&mut self, grid: &Grid<Cell>, mut line: usize, cols: Range<Column>) { // Select until last line still within the buffer line = min(line, grid.len() - 1); @@ -958,23 +953,18 @@ impl Term { let line_length = grid_line.line_length(); let line_end = min(line_length, cols.end + 1); - if cols.start >= line_end { - None - } else { + if line_end.0 == 0 && cols.end >= grid.num_cols() - 1 { + self.push('\n'); + } else if cols.start < line_end { for cell in &grid_line[cols.start..line_end] { if !cell.flags.contains(cell::Flags::WIDE_CHAR_SPACER) { self.push(cell.c); } } - let range = Some(cols.start..line_end); if cols.end >= grid.num_cols() - 1 { - if let Some(ref range) = range { - self.maybe_newline(grid, line, range.end); - } + self.maybe_newline(grid, line, line_end); } - - range } } } @@ -2006,7 +1996,7 @@ mod tests { use term::cell; use grid::{Grid, Scroll}; - use index::{Point, Line, Column}; + use index::{Point, Line, Column, Side}; use ansi::{self, Handler, CharsetIndex, StandardCharset}; use selection::Selection; use std::mem; @@ -2082,6 +2072,34 @@ mod tests { assert_eq!(term.selection_to_string(), Some(String::from("\"aa\"a\n"))); } + #[test] + fn selecting_empty_line() { + let size = SizeInfo { + width: 21.0, + height: 51.0, + cell_width: 3.0, + cell_height: 3.0, + padding_x: 0.0, + padding_y: 0.0, + }; + let mut term = Term::new(&Default::default(), size); + let mut grid: Grid<Cell> = Grid::new(Line(3), Column(3), 0, Cell::default()); + for l in 0..3 { + if l != 1 { + for c in 0..3 { + grid[Line(l)][Column(c)].c = 'a'; + } + } + } + + mem::swap(&mut term.grid, &mut grid); + + let mut selection = Selection::simple(Point { line: 2, col: Column(0) }, Side::Left); + selection.update(Point { line: 0, col: Column(2) }, Side::Right); + *term.selection_mut() = Some(selection); + assert_eq!(term.selection_to_string(), Some("aaa\n\naaa\n".into())); + } + /// Check that the grid can be serialized back and forth losslessly /// /// This test is in the term module as opposed to the grid since we want to |