magi-code 0.64.0

Repository-aware CLI coding agent for terminal work
Documentation
use super::super::render_scroll_view_persistent_state;
use super::{SYSTEM_PROMPT_MODAL, draw_modal_panel, modal_text_area};
use crate::tui::{state::MissionControlState, theme::MATRIX_GREEN};
use ratatui::{
    Frame,
    layout::Rect,
    widgets::{Paragraph, Wrap},
};

pub(crate) fn system_prompt_text_area(area: Rect) -> Option<Rect> {
    let text_area = modal_text_area(area, "Current System Prompt", SYSTEM_PROMPT_MODAL)?;
    (text_area.height > 1).then_some(Rect::new(
        text_area.x,
        text_area.y.saturating_add(1),
        text_area.width,
        text_area.height.saturating_sub(1),
    ))
}

pub(in crate::tui::render) fn draw_system_prompt_modal(
    frame: &mut Frame<'_>,
    area: Rect,
    state: &MissionControlState,
) {
    let Some(modal_state) = &state.modals.system_prompt_modal else {
        return;
    };
    let Some(text_area) =
        draw_modal_panel(frame, area, "Current System Prompt", SYSTEM_PROMPT_MODAL)
    else {
        return;
    };
    if text_area.height == 0 {
        return;
    }
    frame.render_widget(
        Paragraph::new(super::super::hotkey_line(
            "[Esc]/[q] close  [Up]/[Down]/[Alt-Up]/[Alt-Down]/[PgUp]/[PgDn]/[Home]/[End]/wheel scroll",
            MATRIX_GREEN.muted(false),
        ))
        .style(MATRIX_GREEN.muted(false)),
        Rect::new(text_area.x, text_area.y, text_area.width, 1),
    );
    let content_area = Rect::new(
        text_area.x,
        text_area.y.saturating_add(1),
        text_area.width,
        text_area.height.saturating_sub(1),
    );
    if content_area.height == 0 {
        return;
    }
    let wrap_width = super::super::scroll_view_content_width(content_area).max(1);
    render_scroll_view_persistent_state(
        frame,
        content_area,
        super::super::usize_to_u16_saturating(crate::tui::transcript::ratatui_wrapped_visual_rows(
            &modal_state.content,
            wrap_width,
        )),
        Paragraph::new(modal_state.content.clone())
            .style(MATRIX_GREEN.pane())
            .wrap(Wrap { trim: false }),
        &state.scroll_views.system_prompt,
    );
}