use crossterm::event::{KeyCode, KeyEvent};
use crate::app::{App, InputMode, InputPurpose, StagingFocus};
pub fn handle_key(app: &mut App, key: KeyEvent) {
match key.code {
KeyCode::Char('j') => {
navigate_down(app);
}
KeyCode::Char('k') => {
navigate_up(app);
}
KeyCode::Tab => {
let tab = app.tab_mut();
tab.staging_focus = match tab.staging_focus {
StagingFocus::Unstaged => StagingFocus::Staged,
StagingFocus::Staged => StagingFocus::Unstaged,
};
}
KeyCode::Char('s') => {
app.stage_selected();
}
KeyCode::Char('u') => {
app.unstage_selected();
}
KeyCode::Char('S') => {
app.stage_all();
}
KeyCode::Char('U') => {
app.unstage_all();
}
KeyCode::Char('d') => {
if app.tab().confirm_discard {
app.discard_selected();
} else {
app.tab_mut().confirm_discard = true;
app.tab_mut().status_message =
Some("Press 'd' again to confirm discard, or any other key to cancel".into());
}
}
KeyCode::Char('c') => {
app.tab_mut().confirm_discard = false;
app.input_buffer.clear();
app.input_mode = InputMode::Input;
app.input_purpose = InputPurpose::CommitMessage;
app.tab_mut().status_message = Some("Enter commit message:".into());
}
KeyCode::Enter => {
app.tab_mut().confirm_discard = false;
app.load_staging_diff();
}
KeyCode::Char('z') => {
app.tab_mut().confirm_discard = false;
app.tab_mut().stash_message_buffer.clear();
app.input_mode = InputMode::Input;
app.input_purpose = InputPurpose::StashMessage;
app.tab_mut().status_message = Some("Enter stash message (or leave empty):".into());
}
KeyCode::Char('Z') => {
app.tab_mut().confirm_discard = false;
app.stash_pop_selected();
}
_ => {
if app.tab().confirm_discard {
app.tab_mut().confirm_discard = false;
app.tab_mut().status_message = Some("Discard cancelled".into());
}
}
}
}
pub fn navigate_down(app: &mut App) {
app.tab_mut().confirm_discard = false;
let tab = app.tab_mut();
match tab.staging_focus {
StagingFocus::Unstaged => {
if tab.unstaged_changes.is_empty() {
return;
}
let i = match tab.unstaged_list_state.selected() {
Some(i) => {
if i >= tab.unstaged_changes.len() - 1 {
0
} else {
i + 1
}
}
None => 0,
};
tab.unstaged_list_state.select(Some(i));
}
StagingFocus::Staged => {
if tab.staged_changes.is_empty() {
return;
}
let i = match tab.staged_list_state.selected() {
Some(i) => {
if i >= tab.staged_changes.len() - 1 {
0
} else {
i + 1
}
}
None => 0,
};
tab.staged_list_state.select(Some(i));
}
}
}
pub fn navigate_up(app: &mut App) {
app.tab_mut().confirm_discard = false;
let tab = app.tab_mut();
match tab.staging_focus {
StagingFocus::Unstaged => {
if tab.unstaged_changes.is_empty() {
return;
}
let i = match tab.unstaged_list_state.selected() {
Some(i) => {
if i == 0 {
tab.unstaged_changes.len() - 1
} else {
i - 1
}
}
None => 0,
};
tab.unstaged_list_state.select(Some(i));
}
StagingFocus::Staged => {
if tab.staged_changes.is_empty() {
return;
}
let i = match tab.staged_list_state.selected() {
Some(i) => {
if i == 0 {
tab.staged_changes.len() - 1
} else {
i - 1
}
}
None => 0,
};
tab.staged_list_state.select(Some(i));
}
}
}