small software-rendered rust tty
Diffstat (limited to 'src/term/cells.rs')
| -rw-r--r-- | src/term/cells.rs | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/term/cells.rs b/src/term/cells.rs index 36550b1..033a534 100644 --- a/src/term/cells.rs +++ b/src/term/cells.rs @@ -10,7 +10,8 @@ pub struct Style { pub color: [u8; 3], pub flags: u8, } -use std::iter::repeat_n; +use std::default::Default::default; +use std::iter::{repeat, repeat_n}; use crate::colors; impl std::default::Default for Style { @@ -40,17 +41,16 @@ impl Cells { row: 0, } } + fn offset(&mut self) -> usize { + self.row as usize * self.size.0 as usize + } pub fn cells(&mut self) -> &mut [Cell] { + let o = self.offset(); assert!( self.cells.len() - == self.row as usize * (self.size.0 as usize) - + (self.size.0 as usize) * (self.size.1 as usize) - ); - assert!( - self.cells[self.row as usize * self.size.0 as usize..].len() - == self.size.0 as usize * self.size.1 as usize + == o + (self.size.0 as usize) * (self.size.1 as usize) ); - &mut self.cells[self.row as usize * self.size.0 as usize..] + &mut self.cells[o..] } pub fn r(&mut self) -> u16 { self.size.1 @@ -83,4 +83,19 @@ impl Cells { by as usize * (self.size.0) as usize, )); } + + pub fn insert_lines(&mut self, lines: u16, below: u16) { + let c = self.c(); + let o = self.offset(); + let next_row = o + (c * (below - 1)) as usize; + self.cells + .splice( + next_row..next_row, + repeat_n(default(), (lines * c) as usize), + ) + .for_each(drop); + self.cells + .drain(o + self.size.0 as usize * self.size.1 as usize..) + .for_each(drop); + } } |