bettertree 1.0.0

An interactive terminal file tree driven like Helix
mod command_bar;
mod help;
mod icons;
mod search_bar;
mod status_bar;
mod tree_view;

use ratatui::Frame;
use ratatui::layout::{Constraint, Layout};
use ratatui::style::Style;
use ratatui::widgets::Paragraph;

use crate::app::{App, Mode};

pub fn render(app: &App, frame: &mut Frame) {
    let [status_area, tree_area, prompt_area] = Layout::vertical([
        Constraint::Length(1),
        Constraint::Min(0),
        Constraint::Length(1),
    ])
    .areas(frame.area());

    status_bar::render(app, frame, status_area);

    tree_view::render(app, frame, tree_area);

    match app.mode {
        Mode::Normal => render_message(app, frame, prompt_area),
        Mode::Command => command_bar::render(
            &app.command_line,
            &app.config,
            frame,
            tree_area,
            prompt_area,
        ),
        Mode::Search => search_bar::render(
            &app.search,
            app.tree.match_count(),
            &app.config,
            frame,
            prompt_area,
        ),
        Mode::Help => {
            help::render(&app.config, app.help_scroll, frame, tree_area);
            render_message(app, frame, prompt_area);
        }
    }
}

fn render_message(app: &App, frame: &mut Frame, area: ratatui::layout::Rect) {
    let message = app.message.clone().unwrap_or_default();

    frame.render_widget(
        Paragraph::new(format!(" {message}"))
            .style(Style::default().fg(app.config.colors.ui_muted_fg.0)),
        area,
    );
}