elio 1.6.0

Snappy, batteries-included terminal file manager with rich previews, inline images, bulk actions, and trash support.
Documentation
mod browser;
mod chrome;
mod helpers;
mod overlay_manager;
pub(crate) mod theme;

use crate::{
    app::{App, FrameState},
    config,
};
use ratatui::{Frame, widgets::Block};

pub fn render(frame: &mut Frame<'_>, app: &App, state: &mut FrameState) {
    let palette = theme::palette();
    let ui_config = config::ui();

    state.sidebar_hits.clear();
    state.entry_hits.clear();
    state.search_hits.clear();
    state.goto_hits.clear();
    state.copy_hits.clear();
    state.open_with_hits.clear();
    state.trash_panel = None;
    state.trash_confirm_btn = None;
    state.trash_cancel_btn = None;
    state.restore_panel = None;
    state.restore_confirm_btn = None;
    state.restore_cancel_btn = None;
    state.create_panel = None;
    state.rename_panel = None;
    state.create_list_area = None;
    state.create_scroll_top = 0;
    state.bulk_rename_list_area = None;
    state.bulk_rename_scroll_top = 0;
    state.goto_panel = None;
    state.copy_panel = None;
    state.open_with_panel = None;
    state.search_panel = None;
    state.help_panel = None;
    state.preview_panel = None;
    state.preview_body_area = None;
    state.preview_media_area = None;
    state.back_button = None;
    state.forward_button = None;
    state.parent_button = None;
    state.hidden_button = None;
    state.view_button = None;
    state.preview_rows_visible = 0;
    state.preview_cols_visible = 0;

    let area = frame.area();
    frame.render_widget(
        Block::default().style(
            ratatui::style::Style::default()
                .bg(palette.bg)
                .fg(palette.text),
        ),
        area,
    );

    if ui_config.show_top_bar {
        let rows = ratatui::layout::Layout::default()
            .direction(ratatui::layout::Direction::Vertical)
            .constraints([
                ratatui::layout::Constraint::Length(3),
                ratatui::layout::Constraint::Min(10),
                ratatui::layout::Constraint::Length(1),
            ])
            .split(area);

        chrome::render_toolbar(frame, rows[0], app, state, palette);
        browser::render_body(frame, rows[1], app, state, palette);
        chrome::render_status(frame, rows[2], app, palette);
    } else {
        let rows = ratatui::layout::Layout::default()
            .direction(ratatui::layout::Direction::Vertical)
            .constraints([
                ratatui::layout::Constraint::Min(10),
                ratatui::layout::Constraint::Length(1),
            ])
            .split(area);

        browser::render_body(frame, rows[0], app, state, palette);
        chrome::render_status(frame, rows[1], app, palette);
    }

    if app.trash_is_open() {
        overlay_manager::render_trash_overlay(frame, area, app, state, palette);
    } else if app.restore_is_open() {
        overlay_manager::render_restore_overlay(frame, area, app, state, palette);
    } else if app.create_is_open() {
        overlay_manager::render_create_overlay(frame, area, app, state, palette);
    } else if app.rename_is_open() {
        overlay_manager::render_rename_overlay(frame, area, app, state, palette);
    } else if app.bulk_rename_is_open() {
        overlay_manager::render_bulk_rename_overlay(frame, area, app, state, palette);
    } else if app.goto_is_open() {
        overlay_manager::render_goto_overlay(frame, area, app, state, palette);
    } else if app.copy_is_open() {
        overlay_manager::render_copy_overlay(frame, area, app, state, palette);
    } else if app.open_with_is_open() {
        overlay_manager::render_open_with_overlay(frame, area, app, state, palette);
    } else if app.search_is_open() {
        overlay_manager::render_search_overlay(frame, area, app, state, palette);
    } else if app.overlays.help {
        overlay_manager::render_help(frame, area, state, palette);
    }
}