use ratatui::{
layout::Rect,
style::{Modifier, Style},
text::{Line, Span},
widgets::Paragraph,
Frame,
};
use crate::app::ActiveView;
use super::styles::Palette;
pub fn render_footer(
f: &mut Frame,
area: Rect,
active_view: &ActiveView,
palette: &Palette,
filter_active: bool,
filter_text: &str,
) {
if filter_active || !filter_text.is_empty() {
render_filter_bar(f, area, palette, filter_text);
return;
}
render_key_hints(f, area, active_view, palette);
}
fn render_filter_bar(f: &mut Frame, area: Rect, palette: &Palette, filter_text: &str) {
let prefix_style = Style::new().fg(palette.label).add_modifier(Modifier::BOLD);
let text_style = Style::new().fg(palette.foreground);
let cursor_style = Style::new().fg(palette.label).add_modifier(Modifier::BOLD);
let spans = vec![
Span::styled("/ ", prefix_style),
Span::styled(filter_text, text_style),
Span::styled("\u{2588}", cursor_style),
];
f.render_widget(Paragraph::new(Line::from(spans)), area);
}
fn render_key_hints(f: &mut Frame, area: Rect, active_view: &ActiveView, palette: &Palette) {
let hints: &[(&str, &str)] = match active_view {
ActiveView::Tree => &[
("q", ": Quit"),
(" ↑/↓", ": Navigate"),
(" Enter", ": Details"),
(" Space", ": Expand"),
(" Tab", ": Sort"),
(" s", ": Dir"),
(" x", ": Kill"),
(" c", ": Config"),
(" /", ": Filter"),
],
ActiveView::Detail => &[
("Esc", ": Back"),
(" q", ": Quit"),
(" x", ": Kill"),
(" c", ": Config"),
],
};
let key_style = Style::new().fg(palette.label).add_modifier(Modifier::BOLD);
let desc_style = palette.dim_style();
let spans: Vec<Span> = hints
.iter()
.flat_map(|(key, desc)| {
[
Span::styled(*key, key_style),
Span::styled(*desc, desc_style),
]
})
.collect();
f.render_widget(Paragraph::new(Line::from(spans)), area);
}