diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-12-06 23:27:51 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-12-06 23:28:04 -0500 |
commit | e6b26a5f6ac8f79f0fd26da4fe285fa3c33da21c (patch) | |
tree | 8d6b1fbffec6b7b0397f908e7b02fa78dacf62fc /src | |
parent | e13049c91c036354b311bc529b0b258aa4b61952 (diff) | |
download | vt100-rust-e6b26a5f6ac8f79f0fd26da4fe285fa3c33da21c.tar.gz vt100-rust-e6b26a5f6ac8f79f0fd26da4fe285fa3c33da21c.zip |
more line wrapping fixes
Diffstat (limited to 'src')
-rw-r--r-- | src/grid.rs | 1 | ||||
-rw-r--r-- | src/row.rs | 32 |
2 files changed, 32 insertions, 1 deletions
diff --git a/src/grid.rs b/src/grid.rs index 07bcd6f..b12216c 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -428,7 +428,6 @@ impl Grid { let size = self.size; let pos = self.pos; let row = self.current_row_mut(); - row.wrap(false); for col in pos.col..size.cols { row.erase(col as usize, attrs); } @@ -40,24 +40,31 @@ impl Row { pub fn insert(&mut self, i: usize, cell: crate::cell::Cell) { self.cells.insert(i, cell); + self.wrapped = false; } pub fn remove(&mut self, i: usize) { self.clear_wide(i.try_into().unwrap()); self.cells.remove(i); + self.wrapped = false; } pub fn erase(&mut self, i: usize, attrs: crate::attrs::Attrs) { self.clear_wide(i.try_into().unwrap()); self.cells.get_mut(i).unwrap().clear(attrs); + if i == self.cols() as usize - 1 { + self.wrapped = false; + } } pub fn truncate(&mut self, len: usize) { self.cells.truncate(len); + self.wrapped = false; } pub fn resize(&mut self, len: usize, cell: crate::cell::Cell) { self.cells.resize(len, cell); + self.wrapped = false; } pub fn wrap(&mut self, wrap: bool) { @@ -381,6 +388,31 @@ impl Row { crate::term::ClearRowForward::default().write_buf(contents); } + if prev.wrapped && !self.wrapped { + let end_pos = if self + .get(self.cols() - 1) + .unwrap() + .is_wide_continuation() + { + crate::grid::Pos { + row, + col: self.cols() - 2, + } + } else { + crate::grid::Pos { + row, + col: self.cols() - 1, + } + }; + crate::term::MoveFromTo::new(prev_pos, end_pos) + .write_buf(contents); + prev_pos = end_pos; + crate::term::EraseChar::new(1).write_buf(contents); + let end_cell = self.get(end_pos.col).unwrap(); + contents.extend(end_cell.contents().as_bytes()); + prev_pos.col += if end_cell.is_wide() { 2 } else { 1 }; + } + (prev_pos, prev_attrs) } } |