YKHE3XMWOWPGOWYSISF73MIAKN7WB3AHCV2OA4ECAFPF47YHUXEAC WT3GA27PQ2AOAIGK65O3Q4DMX4AZDVNULBLRL6GF4QW6QCASUEAAC UB2ITZJSDADVINSQEZ3HA6PVGA7OA6JYFG5GMSO7Y7LOXJC4FI7AC D7A7MSIHJS3IAOLEPK52M4CZLDPLO7JB3Y62XACT2AM6UUCPQ6BAC AMPZ2BXK4IGUZO3OPBRSJ6Z4GI5K4PRFMLUGTR6AP4FKKRWQG7LQC V55EAIWQXWER2HWKZHPJBV7DDJMSPSPWSO3FSSAYODJHVDBHUN6QC ZVI4AWERNOTDJ3765HJXRBZT57XPNKVONQ6TGOGNPOL2VN42KMJQC HC7ROIBC66IBYFED4ZZM7RXGSNC2CCBWBI36RKM2G5FD5DKVEYMQC FR52XEMWD22VH3GKSARXJUJXOGO7ZSQEHWPXFRWHLGRAJU3WRKCAC L6KSEFQIWICZJ6HJUFKLZQDEH6X2QMFM4Z7ZZUGMLDMFF7EHRXWAC BFN2VHZS7VCBUHQ4S3CQ3LFQV2V4M6VANNAF32XMRFQVWRGYSZ6AC 23SFYK4Q5NKBPJG53PQNPWQH6UOUU2YKJEL7RLXYBRLJOJYV7AWQC OPXFZKEBDHZZLXEJ2JRDYBOJH6YIN7UZNZYHVHMWMQVDTE2ZD53QC 3QVNMRNMI63L2VOFVTMPCVPXH3J4JXLXVTIIPNOMACQCPCAPWILQC MYGIBRRHHXPKVRAMQQRJTZH74L2XOK3SF7J57JPCRKSVRLZ2D6NQC XSZZB47UXR6KGYFZZQFQR63X2LDKOH6TPNNBRRGHUCI5JJ4JIWVAC 3BK22XE5LPOH2EK5AMRXFXHNQNCJ54HEPYRINHJT4DA7INT32I7AC ACDXXAX26ZJJFKJDGRC2GOSJY5JHQWCSTP55SYI6D6LH5UIRYUBAC ESMM3FELOBYIX7FUNOU37FYKRJHFU2IMX6LY6EGJTVPTBDU3SEEQC TSFQFCB2NXDOBLBRUSAT63VJIXLPPTJGSTIDNOTLGHVVWSHITRNQC 7SSBM4UQMYVRL6L3ICYZQPSMYLZZQNMDWH6JKA3KOOSXZDJHESHQC S2T7RUKWXAHMOW5HHITQKTKCBKTUKGMRXK7EQI6RNEBBHRJ5W2RQC I2AG42PAVOII4V4TWDJV5ZVNDIHKBRDT254BFQLFUIY723TW6CCQC 4PNWU55OLKQGTREOE7P27SGX4HPQO3NMHBABN27WQMCQADBGJJWQC SASAN2XCWDQ2VEHZ7TAQEN2R3Y7AG7JUGEFVRL4DZAGHXDFEZFRQC XZ6D3UUEHORAFR6E6NTIJAYEMNUREWPFHCR2FU7FRTHGGLUHZNVQC VCNKFNUF7OWVSWC6I5D25KUZ3XZZICZ3LHWVPF2N5ZSP7LQ2JOUQC 6YZAVBWU6E5FYOI5JGEIPXGZLIKAW6LS2AOFIQWEE5DMOPPCD5PQC el(column([el(text("NAV")),el(iced_nav_scrollable::view(nav,sections_view,children_len,Msg::NavScrollable,)),]))
el(iced_nav_scrollable::view(nav,sections_view,children_len,Msg::NavScrollable,))
el(column([el(text("NAV")),el(iced_nav_scrollable::view(nav,diffs,diffs_len,Msg::NavScrollable,)),]))
el(iced_nav_scrollable::view(nav,diffs,diffs_len,Msg::NavScrollable,))
/// All the diffs in this change keyed by file path. Loaded async/// and set to None only while loading. The/// `diff::State` is also in here so that is it/// preserved while navigating between files.diffs: Option<HashMap<String, (diff::File, diff::State)>>,
pub diffs_state: &'a HashMap<file::Id, diff::State>,
/// State of selected untracked of changed file, if anypub selected_diff: Option<&'a diff::State>,/// Diff and state of selected log's file, if anypub selected_log_diff: Option<(&'a diff::File, &'a diff::State)>,
let col_2 = match state.cursor.selection.as_ref() {Some(cursor::Selection::LogChange {ix: _,hash,message: _,diffs,file: Some(cursor::LogChangeFileSelection { ix: _, path }),}) => Some(el(column([el(column([view_diff_header(format!("{path} changes in {}:",display_short_hash(hash))),match diffs {Some(diffs) => {let (file, state) = diffs.get(path).unwrap();diff::view(Some(state), file).map(|action| {Msg::LogChangeFileDiffAction {
let col_2 =match state.cursor.selection.as_ref() {Some(cursor::Selection::LogChange {ix: _,hash,message: _,file: Some(cursor::LogChangeFileSelection { ix: _, path }),}) => Some(el(column([el(column([view_diff_header(format!("{path} changes in {}:",display_short_hash(hash))),match state.selected_log_diff {Some((file, state)) => diff::view(Some(state), file).map(|action| Msg::LogChangeFileDiffAction {
}})}None => el(text("Loading diff..")),
}),None => el(text("Loading diff..")),},]).width(Length::Fill).height(Length::Fill).spacing(SPACING)),// NOTE: This is currently never true - there are only up to 3// colsif hidden_cols == 2 {el(button(row([el(text("← ").font(Font::MONOSPACE)),el(text("Log")),])).on_press(Msg::Cursor(cursor::Msg::Left)))} else {el(row([]))
.spacing(SPACING)),// NOTE: This is currently never true - there are only up to 3 colsif hidden_cols == 2 {el(button(row([el(text("← ").font(Font::MONOSPACE)),el(text("Log")),])).on_press(Msg::Cursor(cursor::Msg::Left)))} else {el(row([]))},]).width(Length::Fill).height(Length::Fill).spacing(SPACING))),
.spacing(SPACING))),
Some(cursor::Selection::UntrackedFile { .. })| Some(cursor::Selection::ChangedFile { .. })| Some(cursor::Selection::LogChange { .. })| None => None,};
Some(cursor::Selection::UntrackedFile { .. })| Some(cursor::Selection::ChangedFile { .. })| Some(cursor::Selection::LogChange { .. })| None => None,};
// Diffs for untracked and changed filesdiffs_state: HashMap<file::Id, diff::State>,
/// Diffs for untracked and changed filesfiles_diffs: HashMap<file::Id, diff::State>,/// The diffs are loaded async and not present while loading.log_diffs: HashMap<LogFileId, LogFileDiff>,
if let Some((_file, diff_state)) = diffs.get_mut(&file) {let task = diff::update(diff_state, msg);
let id = LogFileId {hash,path: path.clone(),};if let Some(LogFileDiff { diff: _, state }) =state.log_diffs.get_mut(&id){let task = diff::update(state, msg);
app::Msg::Cursor(msg) => {let log_file_selection_before =if let Some(cursor::Selection::LogChange {file: Some(file),..}) = state.cursor.selection.as_ref(){Some(file.ix)} else {None};let cursor_task = cursor::update(&mut state.cursor,&mut state.files,state.repo.as_ref(),msg,).map(|msg| Msg::View(app::Msg::ToRepo(msg)));// If the log file selection has changed, initialize a nav for itif let Some(cursor::Selection::LogChange {hash,diffs: Some(diffs),file: Some(cursor::LogChangeFileSelection { ix, path }),..}) = state.cursor.selection.as_mut(){if Some(*ix) != log_file_selection_before {let (_file,diff::State {contents_count,nav,..},) = diffs.get_mut(path).unwrap();let (new_nav, nav_tasks) =iced_nav_scrollable::init(contents_count.unwrap());*nav = Some(new_nav);let hash = *hash;let path_clone = path.clone();return Task::batch([cursor_task,nav_tasks.map(move |msg| Msg::LogChangeDiff {hash,file: path_clone.clone(),msg: diff::Msg::NavScrollable(msg),}),]);}}cursor_task}
app::Msg::Cursor(msg) => cursor::update(&mut state.cursor,&mut state.files,state.repo.as_ref(),msg,).map(|msg| Msg::View(app::Msg::ToRepo(msg))),
let (_file, state) = diffs.get_mut(&file).unwrap();return diff::update(state, action).map(move |msg| {Msg::LogChangeDiff {hash,file: file.clone(),msg,}});
let id = LogFileId {hash,path: file.clone(),};if let Some(LogFileDiff { diff: _, state }) =state.log_diffs.get_mut(&id){return diff::update(state, action).map(move |msg| {Msg::LogChangeDiff {hash,file: file.clone(),msg,}});}
let diffs: HashMap<String, (diff::File, diff::State)> = diffs.into_iter().map(|(path, diffs)| {// NOTE: using unknown encoding as we don't yet have// the file for past changeslet file = diff::init_file(diff::FileContent::UnknownEncoding,Some(&diffs),);let contents_count = diff::contents_count(&file);let state = diff::State {contents_count: Some(contents_count),..default()};(path.clone(), (file, state))}).collect();*selection_diffs = Some(diffs);
let mut tasks = Vec::with_capacity(diffs.len());diffs.into_iter().for_each(|(path, diffs)| {// NOTE: using unknown encoding as we don't yet have the file// for past changeslet diff = diff::init_file(diff::FileContent::UnknownEncoding,Some(&diffs),);let contents_count = diff::contents_count(&diff);let (nav, nav_tasks) =iced_nav_scrollable::init(contents_count);let diff_state = diff::State {nav: Some(nav),state: libflorescence::diff::State::default(),};let path_clone = path.clone();let id = LogFileId { hash, path };let log_file_diff = LogFileDiff {diff,state: diff_state,};state.log_diffs.insert(id, log_file_diff);tasks.push(nav_tasks.map(move |msg| Msg::LogChangeDiff {hash,file: path_clone.clone(),msg: diff::Msg::NavScrollable(msg),}))});return Task::batch(tasks);
let selected_diff = match state.cursor.selection.as_ref() {Some(cursor::Selection::UntrackedFile { ix: _, path }) => {let id = file::Id {path: path.clone(),file_kind: file::Kind::Untracked,};diffs_state.get(&id)}Some(cursor::Selection::ChangedFile { path, ix: _ }) => {let id = file::Id {path: path.clone(),file_kind: file::Kind::Changed,};diffs_state.get(&id)}Some(cursor::Selection::LogChange { .. }) | None => None,};let selected_log_diff = match state.cursor.selection.as_ref() {Some(cursor::Selection::LogChange {ix: _,hash,message: _,file: Some(cursor::LogChangeFileSelection { ix: _, path }),}) => {let id = LogFileId {hash: *hash,path: path.clone(),};log_diffs.get(&id).map(|LogFileDiff { diff, state }| (diff, state))}_ => None,};