diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-10-31 14:33:05 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-10-31 14:33:05 -0400 |
commit | 91726d4e0695ac4914885aada3304992e51bfb7f (patch) | |
tree | 26c44c77dbbba329a7633b3bfa6b5bd21628bafa /src/row.rs | |
parent | 4ca747a83a82612f8fcd4e762ef701993e55b95c (diff) | |
download | vt100-rust-91726d4e0695ac4914885aada3304992e51bfb7f.tar.gz vt100-rust-91726d4e0695ac4914885aada3304992e51bfb7f.zip |
implement window_contents_formatted
Diffstat (limited to 'src/row.rs')
-rw-r--r-- | src/row.rs | 60 |
1 files changed, 52 insertions, 8 deletions
@@ -46,18 +46,41 @@ impl Row { pub fn contents(&self, col_start: u16, col_end: u16) -> String { let mut prev_was_wide = false; - // XXX very inefficient - let mut max_col = None; - for (col, cell) in self.cells.iter().enumerate() { - if cell.has_contents() || prev_was_wide { - max_col = Some(col); + let mut contents = String::new(); + if let Some(max_col) = self.max_col() { + for col in col_start..=(col_end.min(max_col as u16)) { + if prev_was_wide { + prev_was_wide = false; + continue; + } + + let cell = &self.cells[col as usize]; + let cell_contents = cell.contents(); + let cell_contents = if cell_contents == "" { + " " + } else { + cell_contents + }; + contents += cell_contents; prev_was_wide = cell.is_wide(); } } + if !self.wrapped { + contents += "\n"; + } + contents + } - prev_was_wide = false; + pub fn contents_formatted( + &self, + col_start: u16, + col_end: u16, + attrs: crate::attrs::Attrs, + ) -> (String, crate::attrs::Attrs) { + let mut prev_was_wide = false; let mut contents = String::new(); - if let Some(max_col) = max_col { + let mut prev_attrs = attrs; + if let Some(max_col) = self.max_col() { for col in col_start..=(col_end.min(max_col as u16)) { if prev_was_wide { prev_was_wide = false; @@ -65,6 +88,13 @@ impl Row { } let cell = &self.cells[col as usize]; + + let attrs = cell.attrs(); + if &prev_attrs != attrs { + contents += &attrs.escape_code_diff(&prev_attrs); + prev_attrs = *attrs; + } + let cell_contents = cell.contents(); let cell_contents = if cell_contents == "" { " " @@ -72,12 +102,26 @@ impl Row { cell_contents }; contents += cell_contents; + prev_was_wide = cell.is_wide(); } } if !self.wrapped { contents += "\n"; } - contents + (contents, prev_attrs) + } + + fn max_col(&self) -> Option<u16> { + let mut prev_was_wide = false; + // XXX very inefficient + let mut max_col = None; + for (col, cell) in self.cells.iter().enumerate() { + if cell.has_contents() || prev_was_wide { + max_col = Some(col as u16); + prev_was_wide = cell.is_wide(); + } + } + max_col } } |