aven 0.1.9

Local-first task manager CLI and sync server
Documentation
use ratatui::Frame;
use ratatui::text::Text;

use super::super::dialog::Dialog;
use super::super::dialog::dialog_hint_line;
use crate::tui::overlay::{TEXT_PANEL_VISIBLE_ROWS, TEXT_PANEL_WIDTH, TextPanelView};

pub(crate) fn text_panel_scroll_cap(lines: &[String]) -> u16 {
    crate::tui::overlay::text_panel_scroll_cap(lines.len())
}

pub(in crate::tui::ui) fn render_text_panel(frame: &mut Frame, state: &TextPanelView) {
    let visible_rows = TEXT_PANEL_VISIBLE_ROWS;
    let content_rows = state.lines.len().clamp(1, visible_rows);
    let height = (content_rows as u16).saturating_add(4).min(16);
    let start = (state.scroll as usize).min(text_panel_scroll_cap(&state.lines) as usize);
    let mut lines = state
        .lines
        .iter()
        .skip(start)
        .take(visible_rows)
        .map(|line| ratatui::text::Line::from(line.as_str()))
        .collect::<Vec<_>>();
    lines.push(dialog_hint_line(&[
        ("j/k", "scroll"),
        ("Enter/Esc", "close"),
    ]));
    Dialog::new(&state.title, TEXT_PANEL_WIDTH, height)
        .wrap()
        .render_text(frame, Text::from(lines));
}