Add Cell::keep_attrs() method

master
Manos Pitsidianakis 2020-06-07 18:30:30 +03:00
parent 4bc8ff2ce9
commit 465c78e903
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
2 changed files with 28 additions and 11 deletions

View File

@ -1038,12 +1038,13 @@ impl CompactListing {
columns[4][c].set_bg(color); columns[4][c].set_bg(color);
} }
for c in columns[4].row_iter(_x..(_x + 1), idx) { for c in columns[4].row_iter(_x..(_x + 1), idx) {
columns[4][c].set_bg(color); columns[4][c].set_bg(color).set_keep_bg(true);
columns[4][c].set_keep_bg(true);
} }
for c in columns[4].row_iter((x + 1)..(_x + 1), idx) { for c in columns[4].row_iter((x + 1)..(_x + 1), idx) {
columns[4][c].set_keep_fg(true); columns[4][c]
columns[4][c].set_keep_bg(true); .set_keep_fg(true)
.set_keep_bg(true)
.set_keep_attrs(true);
} }
for c in columns[4].row_iter(x..(x + 1), idx) { for c in columns[4].row_iter(x..(x + 1), idx) {
columns[4][c].set_keep_bg(true); columns[4][c].set_keep_bg(true);
@ -1241,12 +1242,15 @@ impl CompactListing {
); );
self.data_columns.columns[4][(x, idx)].set_bg(color); self.data_columns.columns[4][(x, idx)].set_bg(color);
if _x < min_width.4 { if _x < min_width.4 {
self.data_columns.columns[4][(_x, idx)].set_bg(color); self.data_columns.columns[4][(_x, idx)]
self.data_columns.columns[4][(_x, idx)].set_keep_bg(true); .set_bg(color)
.set_keep_bg(true);
} }
for x in (x + 1).._x { for x in (x + 1).._x {
self.data_columns.columns[4][(x, idx)].set_keep_fg(true); self.data_columns.columns[4][(x, idx)]
self.data_columns.columns[4][(x, idx)].set_keep_bg(true); .set_keep_fg(true)
.set_keep_bg(true)
.set_keep_attrs(true);
} }
self.data_columns.columns[4][(x, idx)].set_keep_bg(true); self.data_columns.columns[4][(x, idx)].set_keep_bg(true);
x = _x + 1; x = _x + 1;

View File

@ -492,6 +492,7 @@ pub struct Cell {
attrs: Attr, attrs: Attr,
keep_fg: bool, keep_fg: bool,
keep_bg: bool, keep_bg: bool,
keep_attrs: bool,
} }
impl Cell { impl Cell {
@ -515,6 +516,7 @@ impl Cell {
empty: false, empty: false,
keep_fg: false, keep_fg: false,
keep_bg: false, keep_bg: false,
keep_attrs: false,
} }
} }
@ -575,6 +577,7 @@ impl Cell {
self.ch = newch; self.ch = newch;
self.keep_fg = false; self.keep_fg = false;
self.keep_bg = false; self.keep_bg = false;
self.keep_attrs = false;
self self
} }
@ -643,7 +646,9 @@ impl Cell {
} }
pub fn set_attrs(&mut self, newattrs: Attr) -> &mut Cell { pub fn set_attrs(&mut self, newattrs: Attr) -> &mut Cell {
self.attrs = newattrs; if !self.keep_attrs {
self.attrs = newattrs;
}
self self
} }
@ -671,6 +676,13 @@ impl Cell {
self.keep_bg = new_val; self.keep_bg = new_val;
self self
} }
/// Sets `keep_attrs` field. If true, the text attributes will not be altered if attempted so
/// until the character content of the cell is changed.
pub fn set_keep_attrs(&mut self, new_val: bool) -> &mut Cell {
self.keep_attrs = new_val;
self
}
} }
impl Default for Cell { impl Default for Cell {
@ -1719,13 +1731,14 @@ pub fn copy_area(grid_dest: &mut CellBuffer, grid_src: &CellBuffer, dest: Area,
grid_dest[(x, y)] = grid_src[(src_x, src_y)]; grid_dest[(x, y)] = grid_src[(src_x, src_y)];
for t in &stack { for t in &stack {
if let Some(fg) = grid_src.tag_table()[&t].fg { if let Some(fg) = grid_src.tag_table()[&t].fg {
grid_dest[(x, y)].set_fg(fg); grid_dest[(x, y)].set_fg(fg).set_keep_fg(true);
} }
if let Some(bg) = grid_src.tag_table()[&t].bg { if let Some(bg) = grid_src.tag_table()[&t].bg {
grid_dest[(x, y)].set_bg(bg); grid_dest[(x, y)].set_bg(bg).set_keep_bg(true);
} }
if let Some(attrs) = grid_src.tag_table()[&t].attrs { if let Some(attrs) = grid_src.tag_table()[&t].attrs {
grid_dest[(x, y)].attrs |= attrs; grid_dest[(x, y)].attrs |= attrs;
grid_dest[(x, y)].set_keep_attrs(true);
} }
} }
if src_x >= get_x(bottom_right!(src)) { if src_x >= get_x(bottom_right!(src)) {