quinjet 0.0.40

A fast, live, keyboard-first Git source-control interface for the terminal
#[cfg_attr(not(test), expect(clippy::wildcard_imports, reason = "shared"))]
use super::*;

impl App {
    #[expect(
        clippy::too_many_lines,
        reason = "the constructor explicitly initializes every independent state field"
    )]
    pub(crate) fn new(root: impl AsRef<Path>, name: impl Into<String>) -> Self {
        Self {
            repository_root: root.as_ref().to_path_buf(),
            repository_name: name.into(),
            view: View::Changes,
            focus: Focus::Sidebar,
            diff_layout: DiffLayout::SideBySide,
            theme: Theme::default(),
            theme_name: ThemeName::default(),
            appearance_choice: AppearanceChoice::default(),
            appearance: Appearance::Dark,
            status: RepoStatus::default(),
            history: Vec::new(),
            worktrees: Vec::new(),
            project_groups: Vec::new(),
            history_branch: None,
            pull_request: None,
            github_repositories: Vec::new(),
            local_github_repository: None,
            pull_request_repository: None,
            pull_request_warnings: Vec::new(),
            pull_request_error: None,
            pull_request_exact_number: None,
            pull_request_from_cache: false,
            history_branches: Vec::new(),
            history_branches_loading: false,
            history_branches_loaded: false,
            pull_request_lookup: TextBuffer::default(),
            pull_request_lookup_active: false,
            recent_pull_requests: initial_recent_pull_requests(),
            recent_pull_request_cursor: 0,
            pull_request_section: PullRequestSection::Overview,
            pull_request_file_view: PullRequestFileView::AllFiles,
            pull_request_files: Vec::new(),
            pull_request_tree: Vec::new(),
            pull_request_total_files: 0,
            pull_request_files_truncated: false,
            pull_request_file_cursor: 0,
            pull_request_tree_cursor: 0,
            collapsed_pull_request_directories: HashSet::new(),
            pull_request_checks: Vec::new(),
            pull_request_check_cursor: None,
            selected_check_section: None,
            collapsed_check_sections: HashSet::new(),
            pull_request_checks_loading: false,
            pull_request_checks_error: None,
            pull_request_checks_from_cache: false,
            pull_request_prefetched_logs: HashSet::new(),
            pull_request_conversation: PullRequestConversation::default(),
            pull_request_conversation_loading: false,
            pull_request_conversation_refresh_again: false,
            pull_request_conversation_error: None,
            pull_request_review: PullRequestReviewSnapshot::default(),
            pull_request_review_loading: false,
            pull_request_review_mutating: false,
            pull_request_review_error: None,
            pull_request_review_cursor: None,
            pull_request_review_line_threads: HashMap::new(),
            pull_request_check_log: None,
            pull_request_check_log_loading: false,
            pull_request_check_log_error: None,
            expanded_check_steps: HashSet::new(),
            pull_request_step_cursor: 0,
            pull_request_step_reveal: false,
            pull_request_content_rows: Vec::new(),
            pull_request_content_rows_key: None,
            pull_request_content_width: 0,
            pull_request_content_links: Vec::new(),
            pull_request_content_generation: 0,
            content_at_bottom: true,
            pull_request_progress: None,
            auxiliary_preview: None,
            document: DiffDocument::empty("Working Tree", "Loading changes…"),
            document_layout_generation: 0,
            unified_diff_rows: Vec::new(),
            side_by_side_diff_rows: Vec::new(),
            diff_rows_key: None,
            selected_change_section: Some(ChangeSection::Unstaged),
            collapsed_change_sections: HashSet::new(),
            checked_change_paths: HashSet::new(),
            scm_menu_open: false,
            scm_menu_selected: 0,
            pr_menu_open: false,
            pr_menu_selected: 0,
            preferred_merge_method: PullRequestMergeMethod::default(),
            selected_preview_file: None,
            preview_file_cursor: 0,
            collapsed_preview_files: HashSet::new(),
            expanded_preview_files: HashSet::new(),
            change_cursor: 0,
            history_cursor: 0,
            sidebar_offset: 0,
            sidebar_free_scroll: false,
            sidebar_last_cursor: None,
            content_scroll: 0,
            horizontal_scroll: 0,
            sidebar_width: DEFAULT_SIDEBAR_WIDTH,
            sidebar_hidden: false,
            diff_split_percent: DEFAULT_DIFF_SPLIT_PERCENT,
            expanded_diff: false,
            files_collapsed: false,
            collapse_preference_set: false,
            resize_target: None,
            filter: String::new(),
            modal: None,
            toast: None,
            mouse_capture: true,
            mouse_capture_preference: true,
            link_hover: None,
            text_selection: None,
            rendered_cells: Vec::new(),
            webhooks_listening: false,
            busy: None,
            operation_frame: 0,
            refreshing: false,
            document_loading: false,
            history_loading: false,
            history_complete: false,
            pull_request_loading: false,
            last_refresh: None,
            geometry: UiGeometry::default(),
            status_generation: 0,
            changes_diff_version: 0,
            diff_generation: 0,
            history_generation: 0,
            pull_request_generation: 0,
            repository_generation: 0,
            pull_request_workspace_generation: None,
            pull_request_documents: HashMap::new(),
            pull_request_document_order: VecDeque::new(),
            pull_request_document_bytes: 0,
            pull_request_prefetched_paths: HashSet::new(),
            pull_request_loading_path: None,
            pull_request_single_file: None,
            pull_request_prefetching: false,
            pull_request_prefetch_retrying: false,
            pull_request_checks_generation: 0,
            pull_request_conversation_generation: 0,
            pull_request_review_generation: 0,
            pull_request_check_log_generation: 0,
            pull_request_check_log_target: None,
            local_diff_request: None,
            local_diff_change_section: None,
            local_diff_preserving_document: false,
            local_diff_preserved_paths: HashSet::new(),
            local_diff_workspace_generation: None,
            local_diff_index: None,
            local_diff_documents: HashMap::new(),
            local_diff_loading_path: None,
            local_diff_pending_paths: VecDeque::new(),
            local_diff_single_loaded: false,
            branch_generation: 0,
            history_branch_generation: 0,
            stash_generation: 0,
            worktree_generation: 0,
            project_generation: 0,
            operation_id: 0,
            refresh_again: false,
            history_refresh_again: false,
            preview_due: None,
            pull_request_poll_due: None,
            pull_request_checks_read_at: None,
            pull_request_detail_read_at: None,
            pull_request_log_read_at: None,
            pending_g: None,
            last_resize_tap: None,
        }
    }

    pub(crate) fn set_theme_selection(&mut self, name: ThemeName, choice: AppearanceChoice) {
        let appearance = choice.resolve();
        self.theme = Theme::new(name, appearance);
        self.theme_name = name;
        self.appearance_choice = choice;
        self.appearance = appearance;
        self.invalidate_pull_request_content_rows();
    }

    /// Launch straight into one pull request: the `--pr` flag arrives here
    /// before the first frame, so the lookup races the initial status reads
    /// instead of waiting for them.
    pub(crate) fn open_pull_request_on_launch(&mut self, number: u64) -> Vec<AppEffect> {
        let mut effects = Vec::new();
        self.switch_view(View::PullRequests, &mut effects);
        self.request_pull_request_lookup(number, false, false, &mut effects);
        effects
    }

    pub(crate) fn initial_effects(&mut self) -> Vec<AppEffect> {
        let mut effects = Vec::new();
        self.request_refresh(&mut effects);
        self.request_history(true, &mut effects);
        self.request_history_branches(&mut effects);
        effects.push(AppEffect::Git(Box::new(
            WorkerCommand::LoadLocalGitHubRepository,
        )));
        effects
    }
}