magi-code 0.96.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::*;

pub(super) fn clamp_picker_selection(selected: &mut usize, item_count: usize) {
    *selected = (*selected).min(item_count.saturating_sub(1));
}

pub(super) fn keep_picker_selection_visible(
    selected: usize,
    item_count: usize,
    visible_rows: usize,
    offset: &mut usize,
) {
    let visible_rows = visible_rows.max(1);
    let max_offset = item_count.saturating_sub(visible_rows);
    *offset = (*offset).min(max_offset);
    if selected < *offset {
        *offset = selected;
    } else if selected >= (*offset).saturating_add(visible_rows) {
        *offset = selected
            .saturating_add(1)
            .saturating_sub(visible_rows)
            .min(max_offset);
    }
}

pub(super) fn picker_selection_after_move(
    selected: usize,
    item_count: usize,
    amount: usize,
    down: bool,
    visible_rows: usize,
    mut offset: usize,
) -> (usize, usize) {
    let last = item_count.saturating_sub(1);
    let selected = if down {
        selected.saturating_add(amount).min(last)
    } else {
        selected.saturating_sub(amount).min(last)
    };
    keep_picker_selection_visible(selected, item_count, visible_rows, &mut offset);
    (selected, offset)
}

pub(super) fn skill_row_visual_position(
    rows: &[SkillToggleRow],
    selected: usize,
) -> (usize, usize) {
    let mut visual_row: usize = 0;
    let mut previous_source: Option<&str> = None;
    let mut selected_visual_row: usize = 0;
    for (index, row) in rows.iter().enumerate() {
        if previous_source != Some(row.source.as_str()) {
            if previous_source.is_some() {
                visual_row = visual_row.saturating_add(2);
            }
            visual_row = visual_row.saturating_add(1);
            previous_source = Some(&row.source);
        }
        if index == selected {
            selected_visual_row = visual_row;
        }
        visual_row = visual_row.saturating_add(1);
    }
    (selected_visual_row, visual_row.saturating_add(1))
}