use ratatui::{
prelude::*,
symbols::border,
widgets::{Block, Borders, Paragraph},
};
pub(in crate::tui::ui) struct ChromeBar {
border_color: Color,
left: Line<'static>,
left_alignment: Alignment,
right: String,
}
impl ChromeBar {
pub(in crate::tui::ui) fn new(
border_color: Color,
left: Line<'static>,
right: impl Into<String>,
) -> Self {
Self {
border_color,
left,
left_alignment: Alignment::Left,
right: right.into(),
}
}
pub(in crate::tui::ui) fn left_alignment(mut self, alignment: Alignment) -> Self {
self.left_alignment = alignment;
self
}
pub(in crate::tui::ui) fn render(self, frame: &mut Frame, area: Rect) {
let block = Block::default()
.borders(Borders::ALL)
.border_set(border::PLAIN)
.border_style(Style::default().fg(self.border_color));
let inner = block.inner(area);
frame.render_widget(block, area);
let right_width = if self.right.is_empty() {
0
} else {
let desired = Line::from(self.right.as_str()).width().saturating_add(1) as u16;
desired.min(inner.width.saturating_sub(16))
};
let chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Min(10), Constraint::Length(right_width)])
.split(inner);
let left = Paragraph::new(self.left).alignment(self.left_alignment);
let right = Paragraph::new(self.right).alignment(Alignment::Right);
frame.render_widget(left, chunks[0]);
frame.render_widget(right, chunks[1]);
}
}