cuj-tui 0.1.0

cui — a read-only TUI browser for cuj vaults
Documentation
//! The two command bars: global (top, reversed) and context
//! (below, dim). Both render whatever `keymap::bar_items` derives
//! from the binding table, so they cannot drift from dispatch.

use ratatui::Frame;
use ratatui::layout::Rect;
use ratatui::style::{Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::Paragraph;

use crate::keymap::{self, Bar};
use crate::state::{AppState, Mode};

pub fn draw(f: &mut Frame, global: Rect, context: Rect, state: &AppState) {
    let g = bar_line(&keymap::bar_items(state, Bar::Global));
    f.render_widget(
        Paragraph::new(g).style(Style::new().add_modifier(Modifier::REVERSED)),
        global,
    );

    let c = match state.mode {
        Mode::Command => bar_line(&[("", "run"), ("Esc", "cancel"), ("C-u", "clear")]),
        Mode::Help => bar_line(&[("any key", "close")]),
        Mode::Normal => bar_line(&keymap::bar_items(state, Bar::Context)),
    };
    f.render_widget(
        Paragraph::new(c).style(Style::new().add_modifier(Modifier::DIM)),
        context,
    );
}

fn bar_line(items: &[(&'static str, &'static str)]) -> Line<'static> {
    let mut spans = vec![Span::raw(" ")];
    for (i, (key, action)) in items.iter().enumerate() {
        if i > 0 {
            spans.push(Span::raw("   "));
        }
        spans.push(Span::styled(
            *key,
            Style::new().add_modifier(Modifier::BOLD),
        ));
        spans.push(Span::raw(" "));
        spans.push(Span::raw(*action));
    }
    Line::from(spans)
}