Skip to main content

gitkraft_gui/features/diff/
update.rs

1//! Update logic for diff-related messages.
2
3use iced::Task;
4
5use crate::message::Message;
6use crate::state::GitKraft;
7
8/// Handle diff-related messages, returning a [`Task`] for any follow-up
9/// async work.
10pub fn update(state: &mut GitKraft, message: Message) -> Task<Message> {
11    match message {
12        Message::SelectDiffByIndex(index) => {
13            // Load the diff for the selected file on demand.
14            let tab = state.active_tab();
15            let file_entry = tab.commit_files.get(index);
16            let repo_path = tab.repo_path.clone();
17            let oid = tab.selected_commit_oid.clone();
18
19            if let (Some(entry), Some(path), Some(oid)) = (file_entry, repo_path, oid) {
20                let file_path = entry.display_path().to_string();
21                let tab = state.active_tab_mut();
22                tab.selected_file_index = Some(index);
23                // Keep the previous selected_diff visible while the new one
24                // loads — avoids a blink where the file list disappears.
25                tab.is_loading_file_diff = true;
26                tab.diff_scroll_offset = 0.0;
27                crate::features::commits::commands::load_single_file_diff(path, oid, file_path)
28            } else {
29                Task::none()
30            }
31        }
32
33        Message::SelectDiff(diff_info) => {
34            let tab = state.active_tab_mut();
35            tab.selected_diff = Some(diff_info);
36            tab.diff_scroll_offset = 0.0;
37            Task::none()
38        }
39
40        _ => Task::none(),
41    }
42}