workmux 0.1.178

An opinionated workflow tool that orchestrates git worktrees and tmux
//! TUI rendering logic for the dashboard.

mod dashboard;
mod diff;
mod format;
mod help;
pub mod theme;
pub mod worktree;

use ratatui::Frame;
use ratatui::style::{Modifier, Style};

use super::app::{App, ViewMode};

/// Dim all cells in the buffer to create a backdrop effect behind modals.
fn dim_buffer(f: &mut Frame) {
    let area = f.area();
    let buf = f.buffer_mut();
    for y in area.y..area.y + area.height {
        for x in area.x..area.x + area.width {
            if let Some(cell) = buf.cell_mut((x, y)) {
                cell.set_style(Style::default().add_modifier(Modifier::DIM));
            }
        }
    }
}

pub use self::dashboard::render_dashboard;
pub use self::diff::render_diff_view;
pub use self::help::{
    render_add_worktree, render_base_picker, render_confirm_kill, render_confirm_remove,
    render_help, render_project_picker, render_sweep,
};

/// Main UI entry point - renders the appropriate view based on app state.
pub fn ui(f: &mut Frame, app: &mut App) {
    // Render either dashboard or diff view based on view mode
    match &mut app.view_mode {
        ViewMode::Dashboard => render_dashboard(f, app),
        ViewMode::Diff(diff_view) => render_diff_view(f, diff_view, &app.palette),
    }

    // Render overlays on top
    let has_modal = app.show_help
        || app.pending_kill_pane_id.is_some()
        || app.pending_remove.is_some()
        || app.pending_base_picker.is_some()
        || app.pending_project_picker.is_some()
        || app.pending_sweep.is_some()
        || app.pending_add_worktree.is_some();

    if has_modal {
        dim_buffer(f);
    }

    if app.show_help {
        render_help(f, app);
    } else if app.pending_kill_pane_id.is_some() {
        render_confirm_kill(f, app);
    } else if app.pending_remove.is_some() {
        render_confirm_remove(f, app);
    } else if app.pending_base_picker.is_some() {
        render_base_picker(f, app);
    } else if app.pending_project_picker.is_some() {
        render_project_picker(f, app);
    } else if app.pending_sweep.is_some() {
        render_sweep(f, app);
    } else if app.pending_add_worktree.is_some() {
        render_add_worktree(f, app);
    }
}