Skip to main content

gitkraft_tui/features/diff/
events.rs

1use crossterm::event::{KeyCode, KeyEvent};
2
3use crate::app::App;
4
5/// Handle keys when the Diff pane is the active pane.
6pub fn handle_key(app: &mut App, key: KeyEvent) {
7    match key.code {
8        // Scroll down
9        KeyCode::Char('j') => {
10            app.tab_mut().diff_scroll = app.tab().diff_scroll.saturating_add(1);
11        }
12        // Scroll up
13        KeyCode::Char('k') => {
14            app.tab_mut().diff_scroll = app.tab().diff_scroll.saturating_sub(1);
15        }
16        // Scroll to top
17        KeyCode::Char('g') => {
18            app.tab_mut().diff_scroll = 0;
19        }
20        // Scroll to bottom (Shift+G)
21        KeyCode::Char('G') => {
22            // Compute total line count from the selected diff
23            let total_lines = app
24                .tab()
25                .selected_diff
26                .as_ref()
27                .map(|d| d.hunks.iter().map(|h| h.lines.len() as u16).sum::<u16>())
28                .unwrap_or(0);
29            app.tab_mut().diff_scroll = total_lines.saturating_sub(1);
30        }
31        // Page down
32        KeyCode::PageDown | KeyCode::Char('d') => {
33            app.tab_mut().diff_scroll = app.tab().diff_scroll.saturating_add(20);
34        }
35        // Page up
36        KeyCode::PageUp | KeyCode::Char('u') => {
37            app.tab_mut().diff_scroll = app.tab().diff_scroll.saturating_sub(20);
38        }
39        // Previous file in commit diff
40        KeyCode::Char('h') => {
41            app.prev_diff_file();
42        }
43        // Next file in commit diff
44        KeyCode::Char('l') => {
45            app.next_diff_file();
46        }
47        _ => {}
48    }
49}