summaryrefslogtreecommitdiff
path: root/src/widgets/statusbar.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/statusbar.rs')
-rw-r--r--src/widgets/statusbar.rs156
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);
+ }
+}