ratatui-markdown 0.3.0

Markdown rendering, syntax highlighting, collapsible trees, and rich scroll widgets for ratatui
Documentation
use super::SpanTree;

pub(super) fn navigate_up(tree: &mut SpanTree) {
    if tree.entries.is_empty() {
        return;
    }

    let current = tree.selected_index().unwrap_or(0);
    if current > 0 {
        let new_idx = current - 1;
        tree.selected_id = Some(tree.entries[new_idx].id.clone());
        tree.scroll_to_selected();
    } else if current == 0 {
        tree.scroll_offset = tree.scroll_offset.saturating_sub(1);
    }
}

pub(super) fn navigate_down(tree: &mut SpanTree) {
    if tree.entries.is_empty() {
        return;
    }

    let current = tree.selected_index();
    match current {
        Some(idx) if idx + 1 < tree.entries.len() => {
            let new_idx = idx + 1;
            tree.selected_id = Some(tree.entries[new_idx].id.clone());
            tree.scroll_to_selected();
        }
        Some(_) => {
            let max = tree.max_scroll_offset();
            if tree.scroll_offset < max {
                tree.scroll_offset += 1;
            }
        }
        None => {
            tree.selected_id = Some(tree.entries[0].id.clone());
            tree.scroll_to_selected();
        }
    }
}

pub(super) fn navigate_to_first(tree: &mut SpanTree) {
    if tree.entries.is_empty() {
        return;
    }
    tree.selected_id = Some(tree.entries[0].id.clone());
    tree.scroll_offset = 0;
}

pub(super) fn navigate_to_last(tree: &mut SpanTree) {
    if tree.entries.is_empty() {
        return;
    }
    let last_idx = tree.entries.len() - 1;
    tree.selected_id = Some(tree.entries[last_idx].id.clone());
    tree.scroll_to_selected();
}

pub(super) fn scroll_up(tree: &mut SpanTree, lines: usize) {
    for _ in 0..lines {
        tree.scroll_offset = tree.scroll_offset.saturating_sub(1);
    }
}

pub(super) fn scroll_down(tree: &mut SpanTree, lines: usize) {
    let max = tree.max_scroll_offset();
    tree.scroll_offset = (tree.scroll_offset + lines).min(max);
}