aboutsummaryrefslogtreecommitdiffstats
path: root/src/row.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-10-31 14:33:05 -0400
committerJesse Luehrs <doy@tozt.net>2019-10-31 14:33:05 -0400
commit91726d4e0695ac4914885aada3304992e51bfb7f (patch)
tree26c44c77dbbba329a7633b3bfa6b5bd21628bafa /src/row.rs
parent4ca747a83a82612f8fcd4e762ef701993e55b95c (diff)
downloadvt100-rust-91726d4e0695ac4914885aada3304992e51bfb7f.tar.gz
vt100-rust-91726d4e0695ac4914885aada3304992e51bfb7f.zip
implement window_contents_formatted
Diffstat (limited to 'src/row.rs')
-rw-r--r--src/row.rs60
1 files changed, 52 insertions, 8 deletions
diff --git a/src/row.rs b/src/row.rs
index 1d9df56..e87bc04 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -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
}
}