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()));
}
}