From 417cee4eeeaf7516dfeb59cdbe34fed18f30e0f7 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Sun, 28 Jul 2024 12:50:02 +0200 Subject: add statusbar widget --- src/widgets/statusbar.rs | 156 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/widgets/statusbar.rs (limited to 'src/widgets/statusbar.rs') 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(mut self, text: S) -> Self + where + S: AsRef, + { + self.left = text.as_ref().to_string(); + self + } + + pub fn middle(mut self, text: S) -> Self + where + S: AsRef, + { + self.middle = text.as_ref().to_string(); + self + } + + pub fn right(mut self, text: S) -> Self + where + S: AsRef, + { + 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(&mut self, text: S) + where + S: AsRef, + { + self.left = text.as_ref().to_string(); + } + + pub fn set_middle(&mut self, text: S) + where + S: AsRef, + { + self.middle = text.as_ref().to_string(); + } + + pub fn set_right(&mut self, text: S) + where + S: AsRef, + { + 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); + } +} -- cgit v1.2.3-70-g09d2