magi-code 0.77.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::{
    PICKER_MODAL, draw_modal_panel, picker_list_area, picker_modal_list_area, render_picker_list,
};
use crate::tui::state::MissionControlState;
use ratatui::{
    Frame,
    layout::Rect,
    text::{Line, Span},
    widgets::{ListItem, Paragraph},
};

pub(crate) fn models_modal_list_area(area: Rect) -> Option<Rect> {
    picker_modal_list_area(area, "Models", 2)
}

pub(in crate::tui::render) fn draw_models_modal(
    frame: &mut Frame<'_>,
    area: Rect,
    state: &MissionControlState,
) {
    let Some(modal_state) = &state.modals.models_modal else {
        return;
    };
    let theme = state.theme;
    let Some(text_area) = draw_modal_panel(frame, area, "Models", PICKER_MODAL, theme) else {
        return;
    };
    if text_area.height == 0 {
        return;
    }
    frame.render_widget(
        Paragraph::new(super::super::hotkey_line_with_theme(
            theme,
            "[Tab] switch scope • [Up]/[Down] move • [Enter] toggle • [Esc] close",
            theme.muted(false),
        ))
        .style(theme.muted(false)),
        Rect::new(text_area.x, text_area.y, text_area.width, 1),
    );
    frame.render_widget(
        Paragraph::new(format!("Scope: {}", modal_state.scope_label)).style(theme.pane()),
        Rect::new(
            text_area.x,
            text_area.y.saturating_add(1),
            text_area.width,
            1,
        ),
    );
    let Some(list_area) = picker_list_area(text_area, 2) else {
        return;
    };
    if modal_state.loading {
        frame.render_widget(
            Paragraph::new("Loading models...").style(theme.pane()),
            list_area,
        );
        return;
    }
    if modal_state.rows.is_empty() {
        frame.render_widget(
            Paragraph::new("No models discovered").style(theme.pane()),
            list_area,
        );
        return;
    }
    let items = modal_state
        .rows
        .iter()
        .map(|row| {
            let mark = if row.enabled { "[x]" } else { "[ ]" };
            let disabled = if row.enabled { "" } else { " [disabled]" };
            let label = if row.display_name.is_empty() || row.display_name == row.id {
                format!("{mark} {}{disabled}", row.id)
            } else {
                format!("{mark} {}  {}{disabled}", row.id, row.display_name)
            };
            ListItem::new(Line::from(vec![Span::raw(label)]))
        })
        .collect::<Vec<_>>();
    render_picker_list(
        frame,
        list_area,
        items,
        modal_state.selected,
        &state.scroll_views.models_modal,
        theme,
    );
}