dot-viewer 0.1.1

A viewer/debugger for large DAGs in Vim-like TUI
use crate::ui::{centered_rect, surrounding_block};
use crate::viewer::{App, Mode, PopupMode};

use tui::{
    backend::Backend,
    layout::{Constraint, Rect},
    style::{Color, Modifier, Style},
    widgets::{Block, Borders, Cell, Row, Table},
    Frame,
};
use tui_tree_widget::Tree as TUITree;

pub(super) fn draw_popup<B: Backend>(f: &mut Frame<B>, size: Rect, app: &mut App) {
    let popup = centered_rect(90, 90, size);

    match &app.mode {
        Mode::Popup(pmode) => match pmode {
            PopupMode::Tree => draw_tree(f, popup, app),
            PopupMode::Help => draw_help(f, popup, app),
        },
        _ => unreachable!(),
    };
}

fn draw_tree<B: Backend>(f: &mut Frame<B>, chunk: Rect, app: &mut App) {
    let block = surrounding_block("Select a subgraph".to_string(), false);

    let view = app.tabs.selected();
    let subtree = &mut view.subtree;

    let tree = TUITree::new(subtree.tree.clone())
        .block(Block::default().borders(Borders::ALL))
        .highlight_style(
            Style::default().fg(Color::Black).bg(Color::LightGreen).add_modifier(Modifier::BOLD),
        )
        .highlight_symbol(">> ");

    f.render_stateful_widget(tree, chunk, &mut subtree.state);

    f.render_widget(block, chunk);
}

fn draw_help<B: Backend>(f: &mut Frame<B>, chunk: Rect, app: &mut App) {
    let header = app.help.header.iter().map(|s| {
        Cell::from(s.as_str()).style(Style::default().fg(Color::Green).add_modifier(Modifier::BOLD))
    });
    let header = Row::new(header).height(1).bottom_margin(1);

    let rows = (app.help.rows.iter()).map(|row| {
        let row = row.iter().map(|s| Cell::from(s.as_str()));
        Row::new(row).height(1).bottom_margin(1)
    });

    let table = Table::new(rows)
        .header(header)
        .block(Block::default().borders(Borders::ALL))
        .highlight_style(Style::default().add_modifier(Modifier::REVERSED))
        .highlight_symbol("> ")
        .widths(&[
            Constraint::Percentage(15),
            Constraint::Percentage(10),
            Constraint::Percentage(15),
            Constraint::Percentage(60),
        ]);

    f.render_stateful_widget(table, chunk, &mut app.help.state);
}