-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathstatus_bar.rs
71 lines (64 loc) · 1.96 KB
/
status_bar.rs
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
use crate::language::Language;
use crate::text_buffer::TextBuffer;
pub struct StatusBar {
pub modified: bool,
pub filename: String,
pub lang: Language,
pub buf_pos: (usize, usize),
pub line_pos: (usize, usize),
pub redraw: bool,
}
macro_rules! setter {
($method:ident, $field:ident, $t:ty) => {
pub fn $method(&mut self, $field: $t) {
if self.$field != $field {
self.redraw = true;
self.$field = $field;
}
}
};
($method:ident, $field:ident, $t:ty, $conv:expr) => {
pub fn $method(&mut self, $field: $t) {
if self.$field != $field {
self.redraw = true;
self.$field = $conv;
}
}
};
}
impl StatusBar {
setter!(set_buf_pos, buf_pos, (usize, usize));
setter!(set_modified, modified, bool);
setter!(set_filename, filename, &str, filename.to_string());
setter!(set_lang, lang, Language);
setter!(set_line_pos, line_pos, (usize, usize));
pub fn from_buffer(buf: &TextBuffer, buf_pos: (usize, usize)) -> Self {
Self {
modified: buf.modified(),
filename: buf.filename().to_string(),
lang: buf.lang(),
buf_pos,
line_pos: (buf.cy() + 1, buf.rows().len()),
redraw: false,
}
}
pub fn left(&self) -> String {
format!(
"{:<20?} - {}/{} {}",
self.filename,
self.buf_pos.0,
self.buf_pos.1,
if self.modified { "(modified) " } else { "" }
)
}
pub fn right(&self) -> String {
let (lang, (y, len)) = (self.lang, self.line_pos);
format!("{} {}/{}", lang.name(), y, len)
}
pub fn update_from_buf(&mut self, buf: &TextBuffer) {
self.set_modified(buf.modified());
self.set_lang(buf.lang());
self.set_filename(buf.filename());
self.set_line_pos((buf.cy() + 1, buf.rows().len()));
}
}