magi-code 0.63.4

Repository-aware CLI coding agent for terminal work
Documentation
use super::{PICKER_MODAL, draw_modal_panel, picker_modal_list_area};
use crate::tui::{state::MissionControlState, theme::MATRIX_GREEN};
use ratatui::{
    Frame,
    layout::{Rect, Size},
    text::Line,
    widgets::{List, ListItem, ListState, Paragraph},
};
use tui_scrollview::{ScrollView, ScrollbarVisibility};
pub(crate) fn mcp_modal_list_area(area: Rect) -> Option<Rect> {
    picker_modal_list_area(area, "MCP Servers", 1)
}
pub(in crate::tui::render) fn draw_mcp_modal(
    frame: &mut Frame<'_>,
    area: Rect,
    state: &MissionControlState,
) {
    let Some(m) = &state.modals.mcp_modal else {
        return;
    };
    let Some(a) = draw_modal_panel(frame, area, "MCP Servers", PICKER_MODAL) else {
        return;
    };
    if a.height == 0 {
        return;
    }
    frame.render_widget(
        Paragraph::new(super::super::hotkey_line(
            "[Up]/[Down] move • [Enter] toggle • [Esc] close",
            MATRIX_GREEN.muted(false),
        ))
        .style(MATRIX_GREEN.muted(false)),
        Rect::new(a.x, a.y, a.width, 1),
    );
    let y = a.y + 1;
    let h = a.y + a.height - y;
    if h == 0 {
        return;
    }
    if m.rows.is_empty() {
        frame.render_widget(
            Paragraph::new("No MCP servers configured").style(MATRIX_GREEN.pane()),
            Rect::new(a.x, y, a.width, h),
        );
        return;
    }
    let ch = super::super::usize_to_u16_saturating(m.rows.len().max(usize::from(h)));
    let content_width = super::super::scroll_view_content_width(Rect::new(0, 0, a.width, h));
    let mut v = ScrollView::new(Size::new(content_width, ch))
        .vertical_scrollbar_visibility(ScrollbarVisibility::Always)
        .horizontal_scrollbar_visibility(ScrollbarVisibility::Never);
    let items = m
        .rows
        .iter()
        .map(|r| {
            ListItem::new(Line::from(format!(
                "{} {} ({})",
                if r.enabled { "[x]" } else { "[ ]" },
                r.name,
                r.kind
            )))
        })
        .collect::<Vec<_>>();
    let mut ls = ListState::default().with_selected(Some(m.selected));
    v.render_stateful_widget(
        List::new(items)
            .style(MATRIX_GREEN.pane())
            .highlight_style(MATRIX_GREEN.selection())
            .highlight_symbol("> "),
        Rect::new(0, 0, content_width, ch),
        &mut ls,
    );
    frame.render_stateful_widget(
        v,
        Rect::new(a.x, y, a.width, h),
        &mut *state.scroll_views.mcp_modal.borrow_mut(),
    );
}