use ratatui::{
layout::{Alignment, Constraint, Direction, Layout, Rect},
text::{Line, Span},
widgets::Paragraph,
Frame,
};
use crate::theme::Theme;
pub fn render_footer(f: &mut Frame, area: Rect, pairs: &[(&str, &str)], theme: &Theme) {
let inner = horizontal_margin(area);
f.render_widget(Paragraph::new(Line::from(keybind_spans(pairs, theme))), inner);
}
pub fn render_footer_with_app(
f: &mut Frame,
area: Rect,
pairs: &[(&str, &str)],
app_name: &str,
app_version: &str,
theme: &Theme,
) {
let inner = horizontal_margin(area);
let right_width = (app_name.len() + 1 + app_version.len()) as u16;
let chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Min(0), Constraint::Length(right_width)])
.split(inner);
f.render_widget(
Paragraph::new(Line::from(keybind_spans(pairs, theme))),
chunks[0],
);
let right_line = Line::from(vec![
Span::styled(app_name.to_string(), theme.shortcut_key),
Span::styled(format!(" {}", app_version), theme.hint),
]);
f.render_widget(
Paragraph::new(right_line).alignment(Alignment::Right),
chunks[1],
);
}
pub fn keybind_spans<'a>(pairs: &[(&'a str, &'a str)], theme: &Theme) -> Vec<Span<'a>> {
let mut spans = Vec::new();
for (i, (key, action)) in pairs.iter().enumerate() {
if i > 0 {
spans.push(Span::styled(" | ", theme.hint));
}
spans.push(Span::styled(*action, theme.shortcut_key));
spans.push(Span::styled(format!(": {}", key), theme.hint));
}
spans
}
fn horizontal_margin(area: Rect) -> Rect {
let chunks = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Length(1), Constraint::Min(0), Constraint::Length(1)])
.split(area);
chunks[1]
}