From 24c4000ede94c88a263f9474df6f877450b4d60b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 3 Nov 2019 08:22:28 +0000 Subject: use a bitset for text modes too --- src/attrs.rs | 77 +++++++++++++++++++++++++++++++++++++++++++++++++---------- src/cell.rs | 8 +++---- src/screen.rs | 24 +++++++++---------- 3 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/attrs.rs b/src/attrs.rs index 1e137e9..87acb93 100644 --- a/src/attrs.rs +++ b/src/attrs.rs @@ -1,14 +1,67 @@ +#[derive(enumset::EnumSetType, Debug)] +pub enum TextMode { + Bold, + Italic, + Underline, + Inverse, +} + #[derive(Default, Clone, Copy, PartialEq, Eq, Debug)] pub struct Attrs { pub fgcolor: crate::color::Color, pub bgcolor: crate::color::Color, - pub bold: bool, - pub italic: bool, - pub underline: bool, - pub inverse: bool, + pub mode: enumset::EnumSet, } impl Attrs { + pub fn bold(&self) -> bool { + self.mode.contains(TextMode::Bold) + } + + pub fn set_bold(&mut self, bold: bool) { + if bold { + self.mode.insert(TextMode::Bold); + } else { + self.mode.remove(TextMode::Bold); + } + } + + pub fn italic(&self) -> bool { + self.mode.contains(TextMode::Italic) + } + + pub fn set_italic(&mut self, italic: bool) { + if italic { + self.mode.insert(TextMode::Italic); + } else { + self.mode.remove(TextMode::Italic); + } + } + + pub fn underline(&self) -> bool { + self.mode.contains(TextMode::Underline) + } + + pub fn set_underline(&mut self, underline: bool) { + if underline { + self.mode.insert(TextMode::Underline); + } else { + self.mode.remove(TextMode::Underline); + } + } + + pub fn inverse(&self) -> bool { + self.mode.contains(TextMode::Inverse) + } + + pub fn set_inverse(&mut self, inverse: bool) { + if inverse { + self.mode.insert(TextMode::Inverse); + } else { + self.mode.remove(TextMode::Inverse); + } + } + pub fn escape_code_diff(&self, other: &Self) -> String { let mut opts = vec![]; @@ -64,17 +117,17 @@ impl Attrs { } } - if self.bold != other.bold { - opts.push(if self.bold { 1 } else { 21 }); + if self.bold() != other.bold() { + opts.push(if self.bold() { 1 } else { 21 }); } - if self.italic != other.italic { - opts.push(if self.italic { 3 } else { 23 }); + if self.italic() != other.italic() { + opts.push(if self.italic() { 3 } else { 23 }); } - if self.underline != other.underline { - opts.push(if self.underline { 4 } else { 24 }); + if self.underline() != other.underline() { + opts.push(if self.underline() { 4 } else { 24 }); } - if self.inverse != other.inverse { - opts.push(if self.inverse { 7 } else { 27 }); + if self.inverse() != other.inverse() { + opts.push(if self.inverse() { 7 } else { 27 }); } let strs: Vec<_> = diff --git a/src/cell.rs b/src/cell.rs index 8c330ac..c32071e 100644 --- a/src/cell.rs +++ b/src/cell.rs @@ -56,18 +56,18 @@ impl Cell { } pub fn bold(&self) -> bool { - self.attrs.bold + self.attrs.bold() } pub fn italic(&self) -> bool { - self.attrs.italic + self.attrs.italic() } pub fn inverse(&self) -> bool { - self.attrs.inverse + self.attrs.inverse() } pub fn underline(&self) -> bool { - self.attrs.underline + self.attrs.underline() } } diff --git a/src/screen.rs b/src/screen.rs index 366c723..94665e2 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -496,14 +496,14 @@ impl State { loop { match next_param!() { 0 => self.attrs = crate::attrs::Attrs::default(), - 1 => self.attrs.bold = true, - 3 => self.attrs.italic = true, - 4 => self.attrs.underline = true, - 7 => self.attrs.inverse = true, - 22 => self.attrs.bold = false, - 23 => self.attrs.italic = false, - 24 => self.attrs.underline = false, - 27 => self.attrs.inverse = false, + 1 => self.attrs.set_bold(true), + 3 => self.attrs.set_italic(true), + 4 => self.attrs.set_underline(true), + 7 => self.attrs.set_inverse(true), + 22 => self.attrs.set_bold(false), + 23 => self.attrs.set_italic(false), + 24 => self.attrs.set_underline(false), + 27 => self.attrs.set_inverse(false), n if n >= 30 && n <= 37 => { self.attrs.fgcolor = crate::color::Color::Idx(n - 30); } @@ -813,19 +813,19 @@ impl Screen { } pub fn bold(&self) -> bool { - self.state.attrs.bold + self.state.attrs.bold() } pub fn italic(&self) -> bool { - self.state.attrs.italic + self.state.attrs.italic() } pub fn underline(&self) -> bool { - self.state.attrs.underline + self.state.attrs.underline() } pub fn inverse(&self) -> bool { - self.state.attrs.inverse + self.state.attrs.inverse() } pub fn title(&self) -> &str { -- cgit v1.2.3-54-g00ecf