starweaver-cli 0.10.0

Command-line interface for Starweaver
Documentation
use super::{InteractiveTuiState, TaskPanelItem};

impl InteractiveTuiState {
    pub(in crate::tui) fn reset_task_panel_for_session(&mut self) {
        self.task_panel_items.clear();
        self.task_panel_open = false;
        self.task_panel_index = 0;
        self.task_panel_completed_hidden = false;
    }

    pub(in crate::tui) fn set_task_panel_items(&mut self, items: Vec<TaskPanelItem>) {
        let had_items = !self.task_panel_items.is_empty();
        let was_complete = had_items
            && self
                .task_panel_items
                .iter()
                .all(|item| item.status == "completed");
        let is_complete = !items.is_empty() && items.iter().all(|item| item.status == "completed");
        let selected_task_id = self
            .task_panel_items
            .get(self.task_panel_index)
            .map(|item| item.id.as_str());
        let latest_changed_index = items
            .iter()
            .enumerate()
            .filter(|(_, item)| {
                self.task_panel_items
                    .iter()
                    .find(|previous| previous.id == item.id)
                    != Some(*item)
            })
            .map(|(index, _)| index)
            .next_back();
        let retained_index = selected_task_id
            .and_then(|id| items.iter().position(|item| item.id == id))
            .unwrap_or(0);
        self.task_panel_index = latest_changed_index
            .unwrap_or(retained_index)
            .min(items.len().saturating_sub(1));
        self.task_panel_items = items;
        if is_complete {
            self.task_panel_open = false;
            self.task_panel_completed_hidden = true;
            if !was_complete {
                self.input_status = Some(format!(
                    "tasks completed {}/{}",
                    self.task_panel_items.len(),
                    self.task_panel_items.len()
                ));
            }
        } else {
            self.task_panel_completed_hidden = false;
            if (!had_items || was_complete) && !self.task_panel_items.is_empty() {
                self.task_panel_open = true;
                self.task_panel_index = self
                    .task_panel_items
                    .iter()
                    .position(|item| item.status.starts_with("in_progress"))
                    .unwrap_or(0);
            }
        }
    }

    pub(in crate::tui) fn toggle_task_panel(&mut self) {
        if self.task_panel_open {
            self.close_task_panel();
        } else {
            self.open_task_panel();
        }
    }

    pub(in crate::tui) fn open_task_panel(&mut self) {
        if self.task_panel_items.is_empty() {
            self.input_status = Some("no tasks".to_string());
            return;
        }
        self.command_palette = None;
        self.model_picker_open = false;
        self.session_picker_open = false;
        self.selection_mode = false;
        self.task_panel_open = true;
        self.task_panel_completed_hidden = false;
        self.task_panel_index = self
            .task_panel_items
            .iter()
            .position(|item| item.status.starts_with("in_progress"))
            .unwrap_or(0);
        self.input_status = Some("task list".to_string());
    }

    pub(in crate::tui) fn close_task_panel(&mut self) {
        self.task_panel_open = false;
        self.input_status = Some("tasks minimized".to_string());
    }

    pub(in crate::tui) const fn task_panel_expanded(&self) -> bool {
        self.task_panel_open
    }

    pub(in crate::tui) const fn task_panel_index(&self) -> usize {
        self.task_panel_index
    }

    pub(in crate::tui) const fn task_summary_visible(&self) -> bool {
        !self.task_panel_items.is_empty() && !self.task_panel_completed_hidden
    }
}