magi-code 0.96.1

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

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct UsageModalState {
    pub(crate) loading: bool,
    pub(crate) result: Option<crate::tui::usage::UsageLoadResult>,
}

impl MissionControlState {
    pub(crate) fn open_usage_modal_loading(&mut self) {
        self.modals.usage_modal = Some(UsageModalState {
            loading: true,
            result: None,
        });
        self.hide_autocomplete();
    }

    pub(crate) fn set_usage_modal_result(
        &mut self,
        result: crate::tui::usage::UsageLoadResult,
    ) -> bool {
        let Some(modal) = &mut self.modals.usage_modal else {
            return false;
        };
        let changed = modal.loading || modal.result.as_ref() != Some(&result);
        modal.loading = false;
        modal.result = Some(result);
        self.set_scroll_offset(&self.scroll_views.usage_modal, 0);
        changed
    }

    pub(crate) fn close_usage_modal(&mut self) -> bool {
        self.pending_usage_request_id = None;
        self.modals.usage_modal.take().is_some()
    }

    pub(crate) fn usage_modal_visible(&self) -> bool {
        self.modals.usage_modal.is_some()
    }

    pub(crate) fn scroll_usage_up_by(
        &mut self,
        rows: u16,
        visible_rows: u16,
        wrap_width: u16,
    ) -> bool {
        let before = self.scroll_offset(&self.scroll_views.usage_modal);
        let overflow = self.usage_scroll_overflow(visible_rows, wrap_width);
        self.set_scroll_offset(
            &self.scroll_views.usage_modal,
            before.saturating_sub(usize::from(rows)).min(overflow),
        );
        self.scroll_offset(&self.scroll_views.usage_modal) != before
    }

    pub(crate) fn scroll_usage_down_by(
        &mut self,
        rows: u16,
        visible_rows: u16,
        wrap_width: u16,
    ) -> bool {
        let before = self.scroll_offset(&self.scroll_views.usage_modal);
        let overflow = self.usage_scroll_overflow(visible_rows, wrap_width);
        self.set_scroll_offset(
            &self.scroll_views.usage_modal,
            before.saturating_add(usize::from(rows)).min(overflow),
        );
        self.scroll_offset(&self.scroll_views.usage_modal) != before
    }

    pub(crate) fn usage_scroll_overflow(&self, visible_rows: u16, wrap_width: u16) -> usize {
        let Some(modal) = &self.modals.usage_modal else {
            return 0;
        };
        crate::tui::usage::usage_visual_rows(modal.loading, modal.result.as_ref(), wrap_width)
            .saturating_sub(visible_rows.max(1) as usize)
    }
}