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,
}
}
}