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 subagents_modal_list_area(area: Rect) -> Option<Rect> {
picker_modal_list_area(area, "Subagents", 2)
}
pub(in crate::tui::render) fn draw_subagents_modal(
frame: &mut Frame<'_>,
area: Rect,
state: &MissionControlState,
) {
let Some(m) = &state.modals.subagents_modal else {
return;
};
let Some(a) = draw_modal_panel(frame, area, "Subagents", PICKER_MODAL) else {
return;
};
if a.height == 0 {
return;
};
frame.render_widget(
Paragraph::new(super::super::hotkey_line(
"[Tab] switch scope • [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),
);
frame.render_widget(
Paragraph::new(format!("Scope: {}", m.scope_label)).style(MATRIX_GREEN.pane()),
Rect::new(a.x, a.y + 1, a.width, 1),
);
let y = a.y + 2;
let h = a.y + a.height - y;
if h == 0 {
return;
};
if m.rows.is_empty() {
frame.render_widget(
Paragraph::new("No subagent profiles discovered").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(if r.description.is_empty() {
format!("{} {}", if r.enabled { "[x]" } else { "[ ]" }, r.id)
} else {
format!(
"{} {} — {}",
if r.enabled { "[x]" } else { "[ ]" },
r.id,
r.description
)
}))
})
.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.subagents_modal.borrow_mut(),
);
}