AI3IMKC3HRPMTWQCU5HGWKUHGKTJ22QF7V4AAEI6IEBIZ4WYWCKQC L6KSEFQIWICZJ6HJUFKLZQDEH6X2QMFM4Z7ZZUGMLDMFF7EHRXWAC BFN2VHZS7VCBUHQ4S3CQ3LFQV2V4M6VANNAF32XMRFQVWRGYSZ6AC KWTBNTO3QUUE2YADF6SYW6G6ZOKYEWRJQKIWDGZXR33S3YNDVIZQC 5MUEECMJHU44FL5RDUR3VFBIWK3H4X2L5MVJ73J37PYHZWLUKU2AC 3TLPJ57B2OD5OWJN5WMS7A4W7IGFUWJJHVIXRM34VT6KUN6R4YSAC WT3GA27PQ2AOAIGK65O3Q4DMX4AZDVNULBLRL6GF4QW6QCASUEAAC // TODO stairif let Some(repo) = repo.as_ref() {let (selection, task) = match state.selection.take() {Some(Selection::UntrackedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash =file::id_parts_hash(&path, file::Kind::Untracked);(Selection::UntrackedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_down(nav, delta)} else {Task::none()},)} else if repo.untracked_files.len().saturating_sub(1) == ix {if !repo.changed_files.is_empty() {let ix = 0;let selection = changed_file_selection(repo, ix, files);(selection, Task::none())} else if !repo.log.is_empty() {let ix = 0;(log_selection(repo, ix), Task::none())
let Some(repo) = repo.as_ref() else {return Task::none();};let (selection, task) = match state.selection.take() {Some(Selection::UntrackedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash = file::id_parts_hash(&path, file::Kind::Untracked);(Selection::UntrackedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_down(nav, delta)
let ix = 0;let selection =untracked_file_selection(repo, ix, files);(selection, Task::none())}
Task::none()},)} else if repo.untracked_files.len().saturating_sub(1) == ix {if !repo.changed_files.is_empty() {let ix = 0;let selection = changed_file_selection(repo, ix, files);(selection, Task::none())} else if !repo.log.is_empty() {let ix = 0;(log_selection(repo, ix), Task::none())
};(Some(selection), task)}Some(Selection::ChangedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash =file::id_parts_hash(&path, file::Kind::Changed);(Selection::ChangedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_down(nav, delta)} else {Task::none()},)} else if repo.changed_files.len().saturating_sub(1) == ix {if !repo.log.is_empty() {let ix = 0;(log_selection(repo, ix), Task::none())} else if !repo.untracked_files.is_empty() {let ix = 0;let selection =untracked_file_selection(repo, ix, files);(selection, Task::none())
}} else {let ix = ix + 1;let selection = untracked_file_selection(repo, ix, files);(selection, Task::none())};(Some(selection), task)}Some(Selection::ChangedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash = file::id_parts_hash(&path, file::Kind::Changed);(Selection::ChangedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_down(nav, delta)
let ix = 0;let selection = changed_file_selection(repo, ix, files);(selection, Task::none())}
Task::none()},)} else if repo.changed_files.len().saturating_sub(1) == ix {if !repo.log.is_empty() {let ix = 0;(log_selection(repo, ix), Task::none())} else if !repo.untracked_files.is_empty() {let ix = 0;let selection = untracked_file_selection(repo, ix, files);(selection, Task::none())
};(Some(selection), task)}Some(Selection::LogChange {ix: log_ix,hash,message,file,}) => {let (selection, task) = match file {Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}) => {if diff_selected {let id_hash = file::log_id_parts_hash(hash, &path);(Selection::LogChange {ix: log_ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),},if let Some(nav) = logs.diffs.get_mut(&id_hash).and_then(|diff| diff.state.nav.as_mut()){iced_nav_scrollable::scroll_down(nav, delta)} else {Task::none()},)} else {let log_entry = repo.log.get(log_ix).unwrap();
}} else {let ix = ix + 1;let selection = changed_file_selection(repo, ix, files);(selection, Task::none())};(Some(selection), task)}Some(Selection::LogChange {ix: log_ix,hash,message,file,}) => {let (selection, task) = match file {Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}) => {if diff_selected {let id_hash = file::log_id_parts_hash(hash, &path);(Selection::LogChange {ix: log_ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),},if let Some(nav) = logs.diffs.get_mut(&id_hash).and_then(|diff| diff.state.nav.as_mut()){iced_nav_scrollable::scroll_down(nav, delta)} else {Task::none()},)} else {let log_entry = repo.log.get(log_ix).unwrap();
let file_ix =if log_entry.file_paths.len().saturating_sub(1)== file_ix{0} else {file_ix + 1};
let file_ix =if log_entry.file_paths.len().saturating_sub(1)== file_ix{0} else {file_ix + 1};
None => {let selection =if repo.log.len().saturating_sub(1) == log_ix {if !repo.untracked_files.is_empty() {let ix = 0;untracked_file_selection(repo, ix, files)} else if !repo.changed_files.is_empty() {let ix = 0;changed_file_selection(repo, ix, files)} else {let ix = 0;log_selection(repo, ix)}
}None => {let selection =if repo.log.len().saturating_sub(1) == log_ix {if !repo.untracked_files.is_empty() {let ix = 0;untracked_file_selection(repo, ix, files)} else if !repo.changed_files.is_empty() {let ix = 0;changed_file_selection(repo, ix, files)
};(selection, Task::none())}};(Some(selection), task)}None => {let (selection, task) = if !repo.untracked_files.is_empty() {let ix = 0;let selection =Some(untracked_file_selection(repo, ix, files));
}} else {let ix = log_ix + 1;log_selection(repo, ix)};
} else if !repo.changed_files.is_empty() {let ix = 0;let selection =Some(changed_file_selection(repo, ix, files));(selection, Task::none())} else if !repo.log.is_empty() {let ix = repo.log.len() - 1;let selection = log_selection(repo, ix);(Some(selection), Task::none())} else {(None, Task::none())};(selection, task)}};state.selection = selection;task} else {Task::none()}
}};(Some(selection), task)}None => {let (selection, task) = if !repo.untracked_files.is_empty() {let ix = 0;let selection = Some(untracked_file_selection(repo, ix, files));(selection, Task::none())} else if !repo.changed_files.is_empty() {let ix = 0;let selection = Some(changed_file_selection(repo, ix, files));(selection, Task::none())} else if !repo.log.is_empty() {let ix = repo.log.len() - 1;let selection = log_selection(repo, ix);(Some(selection), Task::none())} else {(None, Task::none())};(selection, task)}};state.selection = selection;task
// TODO stairif let Some(repo) = repo.as_ref() {let (selection, task) = match state.selection.take() {Some(Selection::UntrackedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash =file::id_parts_hash(&path, file::Kind::Untracked);(Selection::UntrackedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_up(nav, delta)} else {Task::none()},)} else if 0 == ix {if !repo.log.is_empty() {let ix = repo.log.len() - 1;(log_selection(repo, ix), Task::none())} else if !repo.changed_files.is_empty() {let ix = repo.changed_files.len() - 1;let selection = changed_file_selection(repo, ix, files);(selection, Task::none())
let Some(repo) = repo.as_ref() else {return Task::none();};let (selection, task) = match state.selection.take() {Some(Selection::UntrackedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash = file::id_parts_hash(&path, file::Kind::Untracked);(Selection::UntrackedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_up(nav, delta)
let ix = repo.untracked_files.len() - 1;let selection =untracked_file_selection(repo, ix, files);(selection, Task::none())}
Task::none()},)} else if 0 == ix {if !repo.log.is_empty() {let ix = repo.log.len() - 1;(log_selection(repo, ix), Task::none())} else if !repo.changed_files.is_empty() {let ix = repo.changed_files.len() - 1;let selection = changed_file_selection(repo, ix, files);(selection, Task::none())
};(Some(selection), task)}Some(Selection::ChangedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash =file::id_parts_hash(&path, file::Kind::Changed);(Selection::ChangedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_up(nav, delta)} else {Task::none()},)} else if 0 == ix {let selection = if !repo.untracked_files.is_empty() {let ix = repo.untracked_files.len() - 1;untracked_file_selection(repo, ix, files)} else if !repo.log.is_empty() {let ix = repo.log.len() - 1;log_selection(repo, ix)
}} else {let ix = ix - 1;let selection = untracked_file_selection(repo, ix, files);(selection, Task::none())};(Some(selection), task)}Some(Selection::ChangedFile {ix,path,diff_selected,}) => {let (selection, task) = if diff_selected {let id_hash = file::id_parts_hash(&path, file::Kind::Changed);(Selection::ChangedFile {ix,path,diff_selected,},if let Some(nav) = files_diffs.get_mut(&id_hash).and_then(|state| state.nav.as_mut()){iced_nav_scrollable::scroll_up(nav, delta)
let ix = repo.changed_files.len() - 1;changed_file_selection(repo, ix, files)};(selection, Task::none())
Task::none()},)} else if 0 == ix {let selection = if !repo.untracked_files.is_empty() {let ix = repo.untracked_files.len() - 1;untracked_file_selection(repo, ix, files)} else if !repo.log.is_empty() {let ix = repo.log.len() - 1;log_selection(repo, ix)
(Some(selection), task)}Some(Selection::LogChange {ix: log_ix,hash,message,file,}) => {let (selection, task) = match file {Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}) => {if diff_selected {let id_hash = file::log_id_parts_hash(hash, &path);(Selection::LogChange {ix: log_ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),},if let Some(nav) = logs.diffs.get_mut(&id_hash).and_then(|diff| diff.state.nav.as_mut()){iced_nav_scrollable::scroll_up(nav, delta)} else {Task::none()},)} else {let log_entry = repo.log.get(log_ix).unwrap();let file_ix = if 0 == file_ix {log_entry.file_paths.len() - 1
(selection, Task::none())} else {let ix = ix - 1;let selection = changed_file_selection(repo, ix, files);(selection, Task::none())};(Some(selection), task)}Some(Selection::LogChange {ix: log_ix,hash,message,file,}) => {let (selection, task) = match file {Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}) => {if diff_selected {let id_hash = file::log_id_parts_hash(hash, &path);(Selection::LogChange {ix: log_ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),},if let Some(nav) = logs.diffs.get_mut(&id_hash).and_then(|diff| diff.state.nav.as_mut()){iced_nav_scrollable::scroll_up(nav, delta)
let file = log_file_selection(log_entry, file_ix);(Selection::LogChange {ix: log_ix,hash,message,file: Some(file),},Task::none(),)}}None => {let selection = if 0 == log_ix {if !repo.changed_files.is_empty() {let ix = repo.changed_files.len() - 1;changed_file_selection(repo, ix, files)} else if !repo.untracked_files.is_empty() {let ix = repo.untracked_files.len() - 1;untracked_file_selection(repo, ix, files)} else {let ix = repo.log.len() - 1;log_selection(repo, ix)}
let file_ix = if 0 == file_ix {log_entry.file_paths.len() - 1
};(Some(selection), task)}None => {let (selection, task) = if !repo.log.is_empty() {let ix = repo.log.len() - 1;let selection = log_selection(repo, ix);(Some(selection), Task::none())} else if !repo.changed_files.is_empty() {let ix = repo.changed_files.len() - 1;let selection = changed_file_selection(repo, ix, files);(Some(selection), Task::none())} else if !repo.untracked_files.is_empty() {let ix = repo.untracked_files.len() - 1;let selection = untracked_file_selection(repo, ix, files);(Some(selection), Task::none())} else {(None, Task::none())};(selection, task)}};
}None => {let selection = if 0 == log_ix {if !repo.changed_files.is_empty() {let ix = repo.changed_files.len() - 1;changed_file_selection(repo, ix, files)} else if !repo.untracked_files.is_empty() {let ix = repo.untracked_files.len() - 1;untracked_file_selection(repo, ix, files)} else {let ix = repo.log.len() - 1;log_selection(repo, ix)}} else {let ix = log_ix - 1;log_selection(repo, ix)};(selection, Task::none())}};(Some(selection), task)}None => {let (selection, task) = if !repo.log.is_empty() {let ix = repo.log.len() - 1;let selection = log_selection(repo, ix);(Some(selection), Task::none())} else if !repo.changed_files.is_empty() {let ix = repo.changed_files.len() - 1;let selection = changed_file_selection(repo, ix, files);(Some(selection), Task::none())} else if !repo.untracked_files.is_empty() {let ix = repo.untracked_files.len() - 1;let selection = untracked_file_selection(repo, ix, files);(Some(selection), Task::none())} else {(None, Task::none())};(selection, task)}};
if let Some(_repo) = repo.as_ref() {let selection: Option<Selection> = match state.selection.take() {Some(Selection::LogChange {ix,hash,message,file:Some(LogChangeFileSelection {
let Some(_repo) = repo.as_ref() else {return Task::none();};let selection: Option<Selection> = match state.selection.take() {Some(Selection::LogChange {ix,hash,message,file:Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),}) => {if diff_selected {Some(Selection::LogChange {ix,hash,message,file: Some(LogChangeFileSelection {
}) => {if diff_selected {Some(Selection::LogChange {ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: false,}),})} else {Some(Selection::LogChange {ix,hash,message,file: None,})}
})} else {Some(Selection::LogChange {ix,hash,message,file: None,})
Some(Selection::UntrackedFile {ix,path,diff_selected: true,}) => Some(Selection::UntrackedFile {ix,path,diff_selected: false,}),Some(Selection::ChangedFile {ix,path,diff_selected: true,}) => Some(Selection::ChangedFile {ix,path,diff_selected: false,}),selection @ (Some(Selection::UntrackedFile { .. })| Some(Selection::ChangedFile { .. })| Some(Selection::LogChange { file: None, .. })| None) => selection,};state.selection = selection;}
}Some(Selection::UntrackedFile {ix,path,diff_selected: true,}) => Some(Selection::UntrackedFile {ix,path,diff_selected: false,}),Some(Selection::ChangedFile {ix,path,diff_selected: true,}) => Some(Selection::ChangedFile {ix,path,diff_selected: false,}),selection @ (Some(Selection::UntrackedFile { .. })| Some(Selection::ChangedFile { .. })| Some(Selection::LogChange { file: None, .. })| None) => selection,};state.selection = selection;
if let Some(repo) = repo.as_ref() {let (selection, task): (Option<Selection>, Task<M>) = match state.selection.take(){
let Some(repo) = repo.as_ref() else {return Task::none();};let (selection, task): (Option<Selection>, Task<M>) =match state.selection.take() {