diff options
Diffstat (limited to 'src/widgets/statusbar.rs')
| -rw-r--r-- | src/widgets/statusbar.rs | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/widgets/statusbar.rs b/src/widgets/statusbar.rs new file mode 100644 index 0000000..97b514d --- /dev/null +++ b/src/widgets/statusbar.rs @@ -0,0 +1,156 @@ +use ratatui::{layout::{Alignment, Rect}, style::Style, text::ToLine, widgets::Widget}; + +#[derive(Clone)] +pub struct StatusBar { + left: String, + left_style: Style, + middle: String, + middle_style: Style, + middle_alignment: Alignment, + right: String, + right_style: Style, +} + +impl StatusBar { + pub fn new() -> Self { + Self { + left: String::new(), + left_style: Style::default(), + middle: String::new(), + middle_style: Style::default(), + middle_alignment: Alignment::Center, + right: String::new(), + right_style: Style::default(), + } + } + + pub fn left<S>(mut self, text: S) -> Self + where + S: AsRef<str>, + { + self.left = text.as_ref().to_string(); + self + } + + pub fn middle<S>(mut self, text: S) -> Self + where + S: AsRef<str>, + { + self.middle = text.as_ref().to_string(); + self + } + + pub fn right<S>(mut self, text: S) -> Self + where + S: AsRef<str>, + { + self.right = text.as_ref().to_string(); + self + } + + pub fn left_style(mut self, style: Style) -> Self { + self.left_style = style; + self + } + + pub fn middle_style(mut self, style: Style) -> Self { + self.left_style = style; + self + } + + pub fn middle_alignment(mut self, alignment: Alignment) -> Self { + self.middle_alignment = alignment; + self + } + + pub fn right_style(mut self, style: Style) -> Self { + self.right_style = style; + self + } + + pub fn set_left<S>(&mut self, text: S) + where + S: AsRef<str>, + { + self.left = text.as_ref().to_string(); + } + + pub fn set_middle<S>(&mut self, text: S) + where + S: AsRef<str>, + { + self.middle = text.as_ref().to_string(); + } + + pub fn set_right<S>(&mut self, text: S) + where + S: AsRef<str>, + { + self.right = text.as_ref().to_string(); + } + + pub fn set_left_style(&mut self, style: Style) { + self.left_style = style; + } + + pub fn set_middle_style(&mut self, style: Style) { + self.left_style = style; + } + + pub fn set_right_style(&mut self, style: Style) { + self.right_style = style; + } + + pub fn set_middle_alignment(&mut self, alignment: Alignment) { + self.middle_alignment = alignment; + } + + pub fn area(&self, rect: Rect) -> Rect { + let mut inner = rect.clone(); + inner.height -= 1; + inner + } + + fn layout(&self, mut area: Rect) -> (Rect, Rect, Rect) { + area.y += area.height - 1; + area.height = 1; + + let mut left = area.clone(); + let mut right = area.clone(); + let mut middle = area.clone(); + + left.width = self.left.len() as u16; + right.width = self.right.len() as u16; + right.x = area.x + area.width - right.width; + + middle.x = left.x + left.width; + middle.width = area.width - left.width - right.width; + + (left, middle, right) + } +} + +impl Widget for &mut StatusBar { + fn render(self, area: Rect, buf: &mut ratatui::prelude::Buffer) + where + Self: Sized, + { + let (left, middle, right) = self.layout(area); + + self.left + .to_line() + .left_aligned() + .style(self.left_style) + .render(left, buf); + self.middle + .to_line() + .alignment(self.middle_alignment) + .style(self.middle_style) + .render(middle, buf); + self.right + .to_line() + .right_aligned() + .style(self.right_style) + .render(right, buf); + } +} |