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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use super::{i3block_data::I3BlockData, I3BarWidget, Spacing, State};
use crate::config::SharedConfig;
use crate::errors::*;
#[derive(Clone, Debug)]
pub struct TextWidget {
id: usize,
pub instance: usize,
content: Option<String>,
icon: Option<String>,
state: State,
spacing: Spacing,
shared_config: SharedConfig,
inner: I3BlockData,
}
impl TextWidget {
pub fn new(id: usize, instance: usize, shared_config: SharedConfig) -> Self {
let (key_bg, key_fg) = State::Idle.theme_keys(&shared_config.theme);
let inner = I3BlockData {
name: Some(id.to_string()),
instance: Some(instance.to_string()),
color: key_fg.clone(),
background: key_bg.clone(),
..I3BlockData::default()
};
TextWidget {
id,
instance,
content: None,
icon: None,
state: State::Idle,
spacing: Spacing::Normal,
shared_config,
inner,
}
}
pub fn with_icon(mut self, name: &str) -> Result<Self> {
self.icon = Some(self.shared_config.get_icon(name)?);
self.update();
Ok(self)
}
pub fn with_text(mut self, content: &str) -> Self {
self.content = Some(String::from(content));
self.update();
self
}
pub fn with_state(mut self, state: State) -> Self {
self.state = state;
self.update();
self
}
pub fn with_spacing(mut self, spacing: Spacing) -> Self {
self.spacing = spacing;
self.update();
self
}
pub fn set_icon(&mut self, name: &str) -> Result<()> {
self.icon = Some(self.shared_config.get_icon(name)?);
self.update();
Ok(())
}
pub fn set_text(&mut self, content: String) {
if content.is_empty() {
self.spacing = Spacing::Hidden;
}
self.content = Some(content);
self.update();
}
pub fn set_state(&mut self, state: State) {
self.state = state;
self.update();
}
pub fn set_spacing(&mut self, spacing: Spacing) {
self.spacing = spacing;
self.update();
}
fn update(&mut self) {
let (key_bg, key_fg) = self.state.theme_keys(&self.shared_config.theme);
self.inner.full_text = format!(
"{}{}{}",
self.icon.clone().unwrap_or_else(|| {
match self.spacing {
Spacing::Normal => String::from(" "),
_ => String::from(""),
}
}),
self.content.clone().unwrap_or_default(),
match self.spacing {
Spacing::Hidden => String::from(""),
_ => String::from(" "),
}
);
self.inner.background = key_bg.clone();
self.inner.color = key_fg.clone();
}
}
impl I3BarWidget for TextWidget {
fn get_data(&self) -> I3BlockData {
self.inner.clone()
}
}