eazygit 0.5.1

A fast TUI for Git with staging, conflicts, rebase, and palette-first UX
Documentation
use super::structs::AppState;
use super::types::*;
use crate::git::StatusSummary;
use crate::config::ThemeConfig;
use std::collections::HashMap;

impl AppState {
    pub fn new() -> Self {
        Self {
            running: true,
            theme: ThemeConfig::default(),
            last_status: String::new(),
            status_summary: StatusSummary::default(),
            status_lines: Vec::new(),
            status_entries: Vec::new(),
            status_selected: 0,
            status_selected_path: String::new(),
            last_diff_path: String::new(),
            last_diff: String::new(),
            last_diff_truncated: false,
            last_diff_total: 0,
            last_diff_fetched_at: None,
            diff_mode: DiffMode::Working,
            diff_parsed: crate::git::DiffParseResult::default(),
            show_help: false,
            repo_path: ".".to_string(),
            last_status_error: None,
            error_guidance: None,
            focus: FocusPane::Status,
            key_help: vec![
                KeyHelp { key: "q / Ctrl+C", desc: "quit" },
                KeyHelp { key: ":", desc: "command palette" },
                KeyHelp { key: "h", desc: "toggle help" },
                KeyHelp { key: "r", desc: "refresh status" },
                KeyHelp { key: "j / k / ↑ / ↓", desc: "move selection" },
                KeyHelp { key: "Tab / Shift+Tab", desc: "cycle focus" },
                KeyHelp { key: "d", desc: "toggle diff mode (working/staged)" },
                KeyHelp { key: "[ / ]", desc: "scroll diff up/down" },
                KeyHelp { key: "< / >", desc: "scroll diff left/right" },
                KeyHelp { key: "+ / -", desc: "more/less context lines" },
                KeyHelp { key: "v", desc: "toggle side-by-side diff" },
                KeyHelp { key: "T", desc: "toggle tree/flat view" },
                KeyHelp { key: "W", desc: "toggle whitespace ignore" },
                KeyHelp { key: "D", desc: "toggle delta syntax highlight" },
                KeyHelp { key: "s", desc: "stage selected file(s)" },
                KeyHelp { key: "u", desc: "unstage selected file(s)" },
                KeyHelp { key: "S", desc: "stage all unstaged/untracked" },
                KeyHelp { key: "U", desc: "unstage all staged" },
                KeyHelp { key: "c", desc: "commit staged (palette)" },
                KeyHelp { key: "A", desc: "amend last commit (palette)" },
                KeyHelp { key: "P", desc: "push (palette)" },
                KeyHelp { key: "cp", desc: "cherry-pick commit (palette)" },
                KeyHelp { key: "rv", desc: "revert commit (palette)" },
                KeyHelp { key: "rc", desc: "rebase continue (palette)" },
                KeyHelp { key: "ra", desc: "rebase abort (palette)" },
                KeyHelp { key: "rs", desc: "reset soft HEAD~1 (palette)" },
                KeyHelp { key: "rm", desc: "reset mixed HEAD~1 (palette)" },
                KeyHelp { key: "rh", desc: "reset hard HEAD~1 (palette)" },
                KeyHelp { key: "Space", desc: "toggle multi-select" },
                KeyHelp { key: "n / N", desc: "jump next/prev staged file" },
                KeyHelp { key: "/", desc: "filter files" },
                KeyHelp { key: "Alt-[ / Alt-]", desc: "prev/next hunk" },
                KeyHelp { key: "H", desc: "stage selected hunk" },
                KeyHelp { key: "Ctrl+L", desc: "toggle line select mode" },
                KeyHelp { key: "Space (line mode)", desc: "toggle line selection" },
                KeyHelp { key: "Ctrl+S (line mode)", desc: "stage selected lines" },
                KeyHelp { key: "w", desc: "toggle word diff" },
                KeyHelp { key: "c", desc: "commit staged changes" },
                KeyHelp { key: "A", desc: "amend last commit" },
                KeyHelp { key: "x", desc: "discard file (with confirm)" },
                KeyHelp { key: "X", desc: "discard all (with confirm)" },
                KeyHelp { key: "Z", desc: "undo last commit (soft reset)" },
                KeyHelp { key: "b", desc: "show branches pane" },
                KeyHelp { key: "B", desc: "create new branch" },
                KeyHelp { key: "g", desc: "show tags pane" },
                KeyHelp { key: "l", desc: "show commit log pane" },
                KeyHelp { key: "L", desc: "file history for selected" },
                KeyHelp { key: "Ctrl+L", desc: "show reflog" },
                KeyHelp { key: "g (log)", desc: "toggle graph view" },
                KeyHelp { key: "Enter (log)", desc: "show commit detail" },
                KeyHelp { key: "C (log)", desc: "cherry-pick commit" },
                KeyHelp { key: "R (log)", desc: "revert commit" },
                KeyHelp { key: "z", desc: "show stash pane" },
                KeyHelp { key: "S", desc: "stash changes" },
                KeyHelp { key: "P", desc: "push to remote" },
                KeyHelp { key: "F", desc: "force push (with confirm)" },
                KeyHelp { key: "p", desc: "pull from remote" },
                KeyHelp { key: "Ctrl+P", desc: "pull with rebase" },
                KeyHelp { key: "f", desc: "fetch (with prune)" },
                KeyHelp { key: "Ctrl+F", desc: "fetch all remotes" },
                KeyHelp { key: "m (branches)", desc: "merge into current" },
                KeyHelp { key: "e (branches)", desc: "rebase onto branch" },
                KeyHelp { key: "o", desc: "open file in $EDITOR" },
                KeyHelp { key: "Esc", desc: "cancel / close modal" },
            ],
            last_refreshed: None,
            refreshing: false,
            last_refresh_time: None,
            help_selected: 0,
            detail_scroll: 0,
             detail_scroll_x: 0,
            current_branch: String::new(),
            selected_files: std::collections::HashSet::new(),
            branches: Vec::new(),
            branch_selected: 0,
            commits: Vec::new(),
            commit_selected: 0,
            commit_input: String::new(),
            commit_mode: false,
            amend_mode: false,
            amend_author_name: String::new(),
            amend_author_email: String::new(),
            last_commit_info: None,
            amend_editing_field: None,
            commit_template: None,
            feedback_message: None,
            status_filter: String::new(),
            filter_mode: false,
            file_scrolls: HashMap::new(),
            stashes: Vec::new(),
            stash_selected: 0,
            branch_create_mode: false,
            branch_name_input: String::new(),
            stash_create_mode: false,
            stash_message_input: String::new(),
            hunks: Vec::new(),
            hunk_selected: 0,
            word_diff: false,
            selected_lines: std::collections::HashSet::new(),
            line_select_mode: false,
            tags: Vec::new(),
            tag_selected: 0,
            has_delta: false,
            use_delta: false,
            diff_context: 3,
            ignore_whitespace: false,
            side_by_side: false,
            tree_view: false,
            reflog_entries: Vec::new(),
            reflog_selected: 0,
            commit_detail: None,
            file_history_path: None,
            log_filter: String::new(),
            log_filter_mode: false,
            log_graph: false,
            log_graph_text: String::new(),
            log_action_menu: false,
            log_action_selected: 0,
            log_action_commit_hash: None,
            confirm_action: None,
            confirm_message: None,
            remotes: Vec::new(),
            remote_selected: 0,
            command_palette: false,
            palette_input: String::new(),
            palette_selected: 0,
            log_selected_hashes: std::collections::HashSet::new(),
            rebase_base: None,
            rebase_use_root: false,
            async_tasks: Vec::new(),
            available_themes: Vec::new(),
            font_family: None,
            font_size: None,
            theme_picker: false,
            theme_picker_selected: 0,
            theme_preview_prior: None,
            load_full_diff: false,
            diff_focus: false,
            reset_pending: None,
            op_status: None,
            op_log: std::collections::VecDeque::new(),
            show_op_log: false,
            merge_base_branch: "development".to_string(),
            merge_notifier_enabled: false,
            merge_notifier_ahead: None,
            merge_notifier_interval_secs: 120,
            merge_notifier_last_check: None,
            merge_base_picker: false,
            merge_base_selected: 0,
            push_ff_only_enforce: true,
            merge_base_candidates: Vec::new(),
            merge_notifier_log: std::collections::VecDeque::new(),
            show_merge_log: false,
            prune_merged_pending: false,
            remote_prune_pending: false,
            pull_ff_only: true,
            pull_autostash: false,
            pull_timeout_secs: 30,
            rebase_timeout_secs: 30,
            auto_fetch_enabled: false,
            auto_fetch_interval_secs: 300,
            auto_fetch_last_check: None,
            auto_fetch_remote: "origin".to_string(),
            pr_helper: false,
            pr_list: Vec::new(),
            pr_selected: 0,
            conflicts_only: false,
            conflicts_popup: false,
            conflicts_popup_selected: 0,
            conflicts_guided: false,
            conflicts_guided_selected: 0,
            rebase_session: crate::app::rebase::RebaseSession::default(),
            rebase_editor_open: false,
            rebase_recovery_open: false,
            rebase_dirty: false,
            rebase_todo: Vec::new(),
            rebase_todo_selected: 0,
            show_rebase_todo: false,
            rebase_todo_dirty: false,
            rebase_todo_original: Vec::new(),
            rebase_todo_path: None,
            rebase_todo_editing: false,
            rebase_todo_edit_buffer: String::new(),
            reword_focus_field: RewordField::Message,
            reword_author_name: None,
            reword_author_email: None,
            edit_focus_field: RewordField::Message,
            edit_author_name: None,
            edit_author_email: None,
            workflow_context: None,
            custom_commands: std::collections::HashMap::new(),
            background_image_path: None,
            background_opacity: 0.3,
        }
    }
}