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