1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use unicode_normalization::UnicodeNormalization as _;
use unicode_width::UnicodeWidthChar as _;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct Cell {
contents: String,
attrs: crate::attrs::Attrs,
}
impl Cell {
pub(crate) fn set(&mut self, c: String, a: crate::attrs::Attrs) {
self.contents = c;
self.attrs = a;
}
pub(crate) fn append(&mut self, c: char) {
self.contents.push(c);
if !unicode_normalization::is_nfc(&self.contents) {
self.contents = self.contents.nfc().collect();
}
}
pub(crate) fn clear(&mut self, bgcolor: crate::attrs::Color) {
self.contents.clear();
self.attrs.clear();
self.attrs.bgcolor = bgcolor;
}
pub fn contents(&self) -> &str {
&self.contents
}
pub fn has_contents(&self) -> bool {
self.contents != ""
}
pub fn is_wide(&self) -> bool {
let width = self
.contents
.chars()
.next()
.map_or(0, |c| c.width().unwrap_or(0));
width > 1
}
pub(crate) fn attrs(&self) -> &crate::attrs::Attrs {
&self.attrs
}
pub fn fgcolor(&self) -> crate::attrs::Color {
self.attrs.fgcolor
}
pub fn bgcolor(&self) -> crate::attrs::Color {
self.attrs.bgcolor
}
pub fn bold(&self) -> bool {
self.attrs.bold()
}
pub fn italic(&self) -> bool {
self.attrs.italic()
}
pub fn underline(&self) -> bool {
self.attrs.underline()
}
pub fn inverse(&self) -> bool {
self.attrs.inverse()
}
}