aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-03 08:22:28 +0000
committerJesse Luehrs <doy@tozt.net>2019-11-03 08:22:28 +0000
commit24c4000ede94c88a263f9474df6f877450b4d60b (patch)
treec9fd9c5911b59588445c3def6368c9e040c5fd19
parenteb7bac331cfd4d6c1ee052163a3901ce0f1a2208 (diff)
downloadvt100-rust-24c4000ede94c88a263f9474df6f877450b4d60b.tar.gz
vt100-rust-24c4000ede94c88a263f9474df6f877450b4d60b.zip
use a bitset for text modes too
-rw-r--r--src/attrs.rs77
-rw-r--r--src/cell.rs8
-rw-r--r--src/screen.rs24
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<TextMode>,
}
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 {