entire log!
[?]
Jul 29, 2025, 8:24 PM
OJPGHVC3RFBQ7TTSCZH6URSSATII3TESD74EISDNOTNXXSX7PQMACDependencies
- [2]
SWWE2R6Mdisplay basic repo stuff - [3]
WT3GA27Padd cursor with selection - [4]
UB2ITZJSrefresh changed files on FS changes - [5]
YBJRDOTCmake all repo actions async - [6]
AMPZ2BXKshow changed files diffs (only Edit atm) - [7]
V55EAIWQadd src file LRU cache - [8]
Y5ATDI2Hconvert changed file diffs and load src only if any needs it - [9]
ZVI4AWERwoot contents_diff - [10]
OQ6HSAWHshow record log - [11]
ONRCENKTrm unnecessary state from repo's internal state - [12]
4ELJZGRJload and store all change diffs at once - [13]
FR52XEMWadd action for log change file diff - [14]
L6KSEFQImove cursor related stuff into its module - [15]
BFN2VHZSrefactor file stuff into sub-mod - [16]
23SFYK4Qbig view refactor into a new crate - [17]
MYGIBRRHwip custom theme - [18]
XSZZB47Urefactor stuff into lib - [19]
ACDXXAX2refactor main's updates into smaller fns - [20]
7SSBM4UQview: refactor repo view - [21]
FL2ULDJNtest record - [22]
S2T7RUKWadd nav back placeholder - [23]
I2AG42PAnew cols layout - [24]
SK3WVX7Aadd wee spacing for nav back - [25]
SASAN2XCuse nav-scrollable - [26]
YKHE3XMWrefactor diffs handling - [27]
KEPKF3WOunify diffs handling, simplify view - [28]
KWTBNTO3diffs selection and scrolling - [29]
5MUEECMJsmooth scrolling nav - [30]
3TLPJ57Balt scroll via context and couple fixes - [31]
BNHJU2DUclippy fixes - [32]
KQABQCCZupdate rust to 1.88 - [33]
AI3IMKC3refactor stairs - [34]
WXQBBQ2Aupdate nightly - [35]
65DXFP3Yfix status overflow - [36]
DST3HRZZfix emoji rendering - [37]
PTWZYQFRuse nav-scrollable for repo status - [38]
RDRBP7ALauto-scroll status selection - [39]
4G6DZDO6rename diff msg for nav-scrollable - [40]
UR4J677Rnav for log changes and refactors - [41]
K63JN6CRrefactor out non-view field from cursor - [42]
C5P3JIFCrefactor out the nav-scrollable children len arg - [43]
GYZWZ33Tfix unwraps on navs for view - [44]
A6Z4O6RCactions menu - [45]
7BLZN73Oadd a key to refresh repo - [46]
JZXYSIYDchannel selection! - [47]
5ZRDYL6Kfork channel, fix recording esc key - [48]
BAUK5BONpimp-up action buttons - [49]
NZD56PVBfix mouse selection - [50]
D7A7MSIHallow to defer or abandon record, add buttons - [51]
NRCUG4R2load changed files src when selected - [52]
ESMM3FELtest selection reindexing - [53]
4WO3ZJM2show untracked files' contents - [54]
I56UGW7Umake record test, fix log update - [55]
GOLHUD6Rnav-scrollable: set skip-able sections - [56]
UF5NJKAStest load repo - [57]
FVA36HBVrestart repo manager task if it crashes - [58]
3BK22XE5add a test for hover btn and more refactors - [59]
KM5PSZ4Awatch repo once loaded - [60]
EC3TVL4Xadd untracked files - [*]
6YZAVBWUInitial commit - [*]
MJDGPSHGWIP contents diff - [*]
WW36JYLRadd iced_nav_scrollable widget crate
Change contents
- edit in libflorescence/src/repo.rs at line 150
LoadEntireLog, - edit in libflorescence/src/repo.rs at line 169
LoadedEntireLog(Log), - edit in libflorescence/src/repo.rs at line 322
}MsgIn::LoadEntireLog => {let log: Log;(internal_state, log) = spawn_blocking(move || {let log = get_log(&internal_state.repo, None, None);(internal_state, log)}).await.unwrap();let _ = msg_out_tx.send(MsgOut::LoadedEntireLog(log)); - replacement in libflorescence/src/repo.rs at line 348
let log = log(repo, offset, limit);let log = get_log(repo, offset, limit); - replacement in libflorescence/src/repo.rs at line 883
pub(crate) fn log(pub(crate) fn get_log( - edit in inflorescence_view/src/selection.rs at line 29
pub entire_log: Option<LogChange>, - replacement in inflorescence_view/src/selection.rs at line 50[18.3561]→[18.3561:3596](∅→∅),[18.3596]→[40.952:984](∅→∅),[40.984]→[18.3623:3648](∅→∅),[18.3623]→[18.3623:3648](∅→∅),[18.3951]→[18.3951:4004](∅→∅)
LogChange {ix: usize,hash: repo::ChangeHash,message: String,file: Option<LogChangeFileSelection>,},LogChange(LogChange), - replacement in inflorescence_view/src/selection.rs at line 81
#[derive(Debug, Clone)]#[derive(Debug)] - edit in inflorescence_view/src/selection.rs at line 86[46.2917]
#[derive(Debug)]pub struct LogChange {pub ix: usize,pub hash: repo::ChangeHash,pub message: String,pub file: Option<LogChangeFileSelection>,} - edit in inflorescence_view/src/app.rs at line 34
pub entire_log_selection: Option<EntireLogSelection<'a>>, - replacement in inflorescence_view/src/app.rs at line 41
/// changed files and most recent log changes./// changed files and most recent log changes - replacement in inflorescence_view/src/app.rs at line 43
/// `true` when we're selecting a channel to switch to./// `true` when we're selecting a channel to switch to - replacement in inflorescence_view/src/app.rs at line 45
/// `Some` when we're selecting a channel to switch to./// `Some` when we're selecting a channel to switch to - edit in inflorescence_view/src/app.rs at line 47
/// `Some` when looking at the entire log of changespub entire_log: Option<EntireLog>, - edit in inflorescence_view/src/app.rs at line 88
#[derive(Debug)]pub enum EntireLog {Loading,LoadingButNotViewing,Got {log: repo::Log,nav: Box<NavScrollable>,},NotViewing {log: repo::Log,nav_stored_offset: Option<f32>,},}#[derive(Debug)]pub struct EntireLogSelection<'a> {pub ix: usize,pub hash: repo::ChangeHash,pub message: &'a str,pub file: Option<LogChangeFileSelection<'a>>,pub nav: Option<&'a NavScrollable>,} - replacement in inflorescence_view/src/app.rs at line 118
LogNav {hash: repo::ChangeHash,LogChangeNav {change: repo::ChangeHash, - edit in inflorescence_view/src/app.rs at line 144
EntireLog,EntireLogNav(iced_nav_scrollable::Msg),EntireLogChangeNav {change: repo::ChangeHash,msg: iced_nav_scrollable::Msg,}, - edit in inflorescence_view/src/app.rs at line 169
entire_log_selection, - edit in inflorescence_view/src/app.rs at line 179
entire_log_selection, - edit in inflorescence_view/src/app.rs at line 199
entire_log_selection: Option<EntireLogSelection<'a>>, - edit in inflorescence_view/src/app.rs at line 214
entire_log, - replacement in inflorescence_view/src/app.rs at line 219
let view_repo_info = el(row([el(text(dir_name)),el(text(", channel: ")),el(button(text(channel)).on_press_maybe(can_switch_channel.then_some(Msg::SwitchChannel))),]).align_y(alignment::Vertical::Center));let view_repo_info = || {el(row([el(text(dir_name)),el(text(", channel: ")),el(button(text(channel)).on_press_maybe(can_switch_channel.then_some(Msg::SwitchChannel),)),]).align_y(alignment::Vertical::Center))}; - replacement in inflorescence_view/src/app.rs at line 269
let view_log = || {let view_status_log = || { - replacement in inflorescence_view/src/app.rs at line 271[20.943]→[16.17447:17641](∅→∅),[37.1670]→[16.17447:17641](∅→∅),[40.3422]→[16.17447:17641](∅→∅),[16.17447]→[16.17447:17641](∅→∅)
|(ix, repo::LogEntry {hash,message,file_paths: _,})| {let short_hash = display_short_hash(hash);|(ix,entry,)| { - replacement in inflorescence_view/src/app.rs at line 278[16.17837]→[16.17837:17932](∅→∅),[16.17932]→[46.4986:5163](∅→∅),[46.5163]→[16.18100:18128](∅→∅),[16.18100]→[16.18100:18128](∅→∅),[16.18128]→[17.7899:7970](∅→∅),[17.7970]→[36.137:209](∅→∅),[36.209]→[16.18238:18292](∅→∅),[16.18238]→[16.18238:18292](∅→∅)
el(row([el(button(text(short_hash).font(Font::MONOSPACE)).on_press(Msg::Selection(selection::Msg::Select(selection::Select::LogChange { ix, hash: *hash, message: message.clone() },))).class(selectable_button_class(is_selected))),el(text(message).shaping(text::Shaping::Advanced)),]).spacing(SPACING))view_log_change(ix, entry, is_selected) - replacement in inflorescence_view/src/app.rs at line 283
let record_msg_editor =let record_msg_editor = || { - replacement in inflorescence_view/src/app.rs at line 297
};}}; - replacement in inflorescence_view/src/app.rs at line 300
let selection_details = match status_selection.as_ref() {let selection_details = || match status_selection.as_ref() { - edit in inflorescence_view/src/app.rs at line 356
let change_selected = match file.as_ref() {Some(LogChangeFileSelection { diff, .. }) => !diff.as_ref().map(|diff| diff.is_selected).unwrap_or_default(),_ => false,}; - replacement in inflorescence_view/src/app.rs at line 365[40.5236]→[40.5236:5372](∅→∅),[40.5372]→[16.21803:21869](∅→∅),[16.21803]→[16.21803:21869](∅→∅),[16.21869]→[46.5381:5505](∅→∅),[46.5505]→[17.7971:8039](∅→∅),[16.21984]→[17.7971:8039](∅→∅),[17.8039]→[16.22052:22072](∅→∅),[16.22052]→[16.22052:22072](∅→∅)
let is_selected = matches!(file, Some(LogChangeFileSelection{ path: selected_path, .. }) if selected_path == path);el(button(text(path)).on_press_with(move || {Msg::Selection(selection::Msg::Select(selection::Select::LogChangeFile { ix, path: path.clone() }))}).class(selectable_button_class(is_selected)))});let is_selected = matches!(file, Some(LogChangeFileSelection{ path: selected_path, .. }) if selected_path == path);el(button(text(path)).on_press_with(move || {Msg::Selection(selection::Msg::Select(selection::Select::LogChangeFile { ix, path: path.clone() }))}).class(selectable_button_class(is_selected)))}); - replacement in inflorescence_view/src/app.rs at line 372
Msg::LogNav { hash, msg }Msg::LogChangeNav { change: hash, msg }}).class(if change_selected {theme::Scrollable::Selected} else {theme::Scrollable::Normal - edit in inflorescence_view/src/app.rs at line 407
} else if let Some(EntireLogSelection { file, .. }) =entire_log_selection.as_ref(){if file.is_none() {1} else {2} - replacement in inflorescence_view/src/app.rs at line 434[23.1588]→[37.1735:1817](∅→∅),[37.1817]→[40.6140:6179](∅→∅),[40.6179]→[37.1851:1896](∅→∅),[37.1851]→[37.1851:1896](∅→∅),[37.1896]→[40.6180:6217](∅→∅),[40.6217]→[37.1928:1974](∅→∅),[37.1928]→[37.1928:1974](∅→∅),[37.1974]→[40.6218:6246](∅→∅)
let status_nav_children = [el(text("Untracked files:"))].into_iter().chain(view_untracked_files()).chain([el(text("Changed files:"))]).chain(view_changed_files()).chain([el(text("Recent changes:"))]).chain(view_log());let status_nav_children = || {[el(text("Untracked files:"))].into_iter().chain(view_untracked_files()).chain([el(text("Changed files:"))]).chain(view_changed_files()).chain([el(text("Recent changes:"))]).chain(view_status_log())}; - replacement in inflorescence_view/src/app.rs at line 444
let status_selected = match status_selection.as_ref() {let status_selected = || match status_selection.as_ref() { - edit in inflorescence_view/src/app.rs at line 456[37.2065]→[23.1588:1616](∅→∅),[40.6780]→[23.1588:1616](∅→∅),[23.1588]→[23.1588:1616](∅→∅),[23.1616]→[40.6781:6805](∅→∅),[40.6805]→[37.2066:2161](∅→∅),[23.1635]→[37.2066:2161](∅→∅),[37.2198]→[37.2198:2226](∅→∅),[37.2226]→[40.6806:6960](∅→∅),[35.281]→[23.1831:1891](∅→∅),[37.2238]→[23.1831:1891](∅→∅),[40.6960]→[23.1831:1891](∅→∅),[23.1831]→[23.1831:1891](∅→∅)
let col_0 = el(column([view_repo_info,el(iced_nav_scrollable::view(status_nav,status_nav_children,Msg::StatusNav,).class(if status_selected {theme::Scrollable::Selected} else {theme::Scrollable::Normal})),]).width(Length::Fill).height(Length::Fill)); - replacement in inflorescence_view/src/app.rs at line 457
let col_1 = el(column([el(column([record_msg_editor, selection_details])let status_col_0 = || {el(column([view_repo_info(),el(iced_nav_scrollable::view(status_nav,status_nav_children(),Msg::StatusNav,).class(if status_selected() {theme::Scrollable::Selected} else {theme::Scrollable::Normal}) - replacement in inflorescence_view/src/app.rs at line 472[23.2047]→[23.2047:2077](∅→∅),[23.2077]→[44.1558:1674](∅→∅),[44.1674]→[46.6055:6173](∅→∅),[29.526]→[23.2268:2352](∅→∅),[46.6173]→[23.2268:2352](∅→∅),[23.2268]→[23.2268:2352](∅→∅),[23.2352]→[24.28:78](∅→∅)
if hidden_cols == 1 {el(button(row([el(text("← Status").shaping(text::Shaping::Advanced))])).on_press(Msg::Selection(selection::Msg::PressDir(selection::Dir::Left,))))} else {el(row([]))},]).width(Length::Fill).height(Length::Fill).spacing(SPACING));]).width(Length::Fill).height(Length::Fill))}; - replacement in inflorescence_view/src/app.rs at line 477
let col_2 = match status_selection.as_ref() {let status_col_1 = || {el(column([el(column([record_msg_editor(), selection_details()]).width(Length::Fill).height(Length::Fill)),if hidden_cols == 1 {el(button(row([el(text("← Status").shaping(text::Shaping::Advanced))])).on_press(Msg::Selection(selection::Msg::PressDir(selection::Dir::Left),)))} else {el(row([]))},]).width(Length::Fill).height(Length::Fill).spacing(SPACING))};let status_col_2 = || match status_selection.as_ref() { - edit in inflorescence_view/src/app.rs at line 529
// .width(Length::Fill)// .height(Length::Fill) - replacement in inflorescence_view/src/app.rs at line 533
el(button(row([el(text("← ").font(Font::MONOSPACE)),el(text("Log")),]))el(button(row([el(text("← Files").shaping(text::Shaping::Advanced))])) - edit in inflorescence_view/src/app.rs at line 551
};let entire_log_selected = || match entire_log_selection.as_ref() {Some(EntireLogSelection { file, .. }) => file.is_none(),None => false,};let entire_log_change_selected = || match entire_log_selection.as_ref() {Some(EntireLogSelection {file: Some(LogChangeFileSelection { diff, .. }),..}) => !diff.as_ref().map(|diff| diff.is_selected).unwrap_or_default(),_ => false,};let entire_log_col_0 = || {let Some(EntireLog::Got { log, nav }) = entire_log.as_ref() else {unreachable!()};let entries = log.iter().enumerate().map(|(ix, entry)| {let is_selected = matches!(entire_log_selection.as_ref(),Some(EntireLogSelection { ix: selected_ix, .. }) if &ix == selected_ix);view_log_change(ix, entry, is_selected)});let len = log.len();let selected_ix = entire_log_selection.as_ref().map(|EntireLogSelection { ix, .. }| len - *ix);el(column([view_repo_info(),if let Some(selected_ix) = selected_ix {el(text(format!("Entire log ({selected_ix}/{len})")))} else {el(text(format!("Entire log ({len})")))},el(iced_nav_scrollable::view(nav, entries, Msg::EntireLogNav).class(if entire_log_selected() {theme::Scrollable::Selected} else {theme::Scrollable::Normal}).width(Length::Fill).height(Length::Fill)),]).width(Length::Fill).height(Length::Fill)) - edit in inflorescence_view/src/app.rs at line 603
let entire_log_col_1 = || {let files_view = match entire_log_selection.as_ref() {Some(EntireLogSelection {ix,hash,message,file,nav,}) => {let short_hash = display_short_hash(hash);let view = match (nav.as_ref(), entire_log.as_ref()) {(Some(nav), Some(EntireLog::Got { log, nav: _ })) => {let entry = log.get(*ix).unwrap();let files = entry.file_paths.iter().enumerate().map(|(ix, path)| {let is_selected = matches!(file, Some(LogChangeFileSelection{ path: selected_path, .. }) if selected_path == path);el(button(text(path)).on_press_with(move || {Msg::Selection(selection::Msg::Select(selection::Select::LogChangeFile { ix, path: path.clone() }))}).class(selectable_button_class(is_selected)))});let hash = *hash;el(iced_nav_scrollable::view(nav, files, move |msg| {Msg::LogChangeNav { change: hash, msg }}).class(if entire_log_change_selected() {theme::Scrollable::Selected} else {theme::Scrollable::Normal}).width(Length::Fill).height(Length::Fill))}_ => el(text("Loading...")),}; - edit in inflorescence_view/src/app.rs at line 639
el(column([view_diff_header(format!("{short_hash} message:")),el(text(*message).shaping(text::Shaping::Advanced)),view_diff_header("Changed files:".to_string()),view,]).width(Length::Fill).height(Length::Fill).spacing(SPACING))}None => el(row([])),};el(column([files_view,if hidden_cols == 1 {el(button(row([el(text("← Log").shaping(text::Shaping::Advanced))])).on_press(Msg::Selection(selection::Msg::PressDir(selection::Dir::Left),)))} else {el(row([]))},]).width(Length::Fill).height(Length::Fill).spacing(SPACING))};let entire_log_col_2 = || match entire_log_selection.as_ref() {Some(EntireLogSelection {ix: _,hash,message: _,file: Some(LogChangeFileSelection { ix: _, path, diff }),nav: _,}) => Some(el(column([el(column([view_diff_header(format!("{path} changes in {}:",display_short_hash(hash))),match diff {Some(Diff {is_selected,file,state,nav,}) => {let id_hash = file::log_id_parts_hash(*hash, path);diff::view(state, nav, file, *is_selected).map(move |action| Msg::LogChangeFileDiff {id_hash,msg: action,},)}None => el(text("Loading diff..")),},]).spacing(SPACING)),// NOTE: This is currently never true - there are only up to 3// colsif hidden_cols == 2 {el(button(row([el(text("← Files").shaping(text::Shaping::Advanced))])).on_press(Msg::Selection(selection::Msg::PressDir(selection::Dir::Left),)))} else {el(row([]))},]).width(Length::Fill).height(Length::Fill).spacing(SPACING))),Some(EntireLogSelection { .. }) | None => None,}; - replacement in inflorescence_view/src/app.rs at line 746[46.7272]→[46.7272:7312](∅→∅),[44.1719]→[23.3887:3959](∅→∅),[46.7312]→[23.3887:3959](∅→∅),[23.3887]→[23.3887:3959](∅→∅)
} else if let Some(col_2) = col_2 {let cols = [col_0, col_1, col_2].into_iter().skip(hidden_cols);} else if let Some(EntireLog::Loading) = entire_log.as_ref() {el(column([view_repo_info(),el(text("Entire log")),el(text("Loading...")),]).width(Length::Fill).height(Length::Fill))} else if let Some(EntireLog::Got { .. }) = entire_log.as_ref() {if let Some(entire_log_col_2) = entire_log_col_2() {let cols =[entire_log_col_0(), entire_log_col_1(), entire_log_col_2].into_iter().skip(hidden_cols);el(row(cols).spacing(SPACING).width(Length::Fill).height(Length::Fill))} else {let cols = [entire_log_col_0(), entire_log_col_1()];el(row(cols).spacing(SPACING).width(Length::Fill).height(Length::Fill))}} else if let Some(status_col_2) = status_col_2() {let cols = [status_col_0(), status_col_1(), status_col_2].into_iter().skip(hidden_cols); - replacement in inflorescence_view/src/app.rs at line 780
let cols = [col_0, col_1];let cols = [status_col_0(), status_col_1()]; - edit in inflorescence_view/src/app.rs at line 800
entire_log_selection, - edit in inflorescence_view/src/app.rs at line 887
#[allow(clippy::let_and_return)] - replacement in inflorescence_view/src/app.rs at line 911
add_if(!can_record, switch_channel, row)let row = add_if(!can_record, switch_channel, row);row - replacement in inflorescence_view/src/app.rs at line 921
add_if(!can_record, switch_channel, row)let row = add_if(!can_record, switch_channel, row);row - replacement in inflorescence_view/src/app.rs at line 927
add_if(!can_record, switch_channel, row)let row = add_if(!can_record, switch_channel, row);row - replacement in inflorescence_view/src/app.rs at line 946
row.push(cancel())let row = row.push(cancel());row}ActionState::EntireLog { can_select_right } => {let row = row([down(), up()]);let row = add_if(can_select_right, right, row);row}ActionState::EntireLogChange { can_select_right } => {let row = row([left(), down(), up()]);let row = add_if(can_select_right, right, row);row}ActionState::EntireLogChangeDiff => {let row = row([left(), down(), up(), down_no_skip(), up_no_skip()]);row - replacement in inflorescence_view/src/app.rs at line 998
/// Untracked, changed of log change's diff/// Untracked, changed or status log change's diff - edit in inflorescence_view/src/app.rs at line 1008
},/// Viewing entire logEntireLog {can_select_right: bool, - edit in inflorescence_view/src/app.rs at line 1013
/// Viewing entire log with some change selectedEntireLogChange {can_select_right: bool,},/// Viewing entire log with some diff of a change selectedEntireLogChangeDiff, - edit in inflorescence_view/src/app.rs at line 1039
entire_log_selection: Option<EntireLogSelection<'a>>, - edit in inflorescence_view/src/app.rs at line 1064
if let Some(EntireLogSelection { file, nav, .. }) = entire_log_selection {return match file {Some(LogChangeFileSelection {ix: _,path: _,diff,}) => {if let Some(diff) = diff {if diff.is_selected {ActionState::EntireLogChangeDiff} else {ActionState::EntireLogChange {can_select_right: matches!(diff.nav.ready,Some(iced_nav_scrollable::NeedsScrolling::Yes)),}}} else {ActionState::EntireLogChange {can_select_right: false,}}}None => ActionState::EntireLog {can_select_right: nav.and_then(|nav| nav.ready).is_some(),},};} - edit in inflorescence_view/src/app.rs at line 1242
}fn view_log_change(ix: usize,repo::LogEntry {hash,message,file_paths: _,}: &repo::LogEntry,is_selected: bool,) -> Element<'_, Msg, Theme> {let short_hash = display_short_hash(hash);el(row([el(button(text(short_hash).font(Font::MONOSPACE)).on_press(Msg::Selection(selection::Msg::Select(selection::Select::LogChange {ix,hash: *hash,message: message.clone(),},))).class(selectable_button_class(is_selected))),el(text(message).shaping(text::Shaping::Advanced)),]).spacing(SPACING)) - replacement in inflorescence/src/selection.rs at line 5
Channel, Dir, HeldKey, LogChangeFileSelection, Msg, Select,Channel, Dir, HeldKey, LogChange, LogChangeFileSelection, Msg, Select, - replacement in inflorescence/src/selection.rs at line 30
logs: &mut diff::LogFilesAndState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState, - replacement in inflorescence/src/selection.rs at line 44
// Iced is delayed 500// ms and that creates too much of a jump// Iced is delayed 500 ms and that creates too much// of a jump - replacement in inflorescence/src/selection.rs at line 60[29.5148]→[40.20822:20949](∅→∅),[40.20949]→[29.5380:5409](∅→∅),[29.5380]→[29.5380:5409](∅→∅),[29.5409]→[40.20950:21026](∅→∅),[40.21026]→[29.5490:5508](∅→∅),[29.5490]→[29.5490:5508](∅→∅)
Dir::Down => {select_down(state, files, files_diffs, logs, repo, delta)}Dir::Up => {select_up(state, files, files_diffs, logs, repo, delta)}Dir::Down => select_down(state,files,files_diffs,status_logs,entire_logs,repo,delta,),Dir::Up => select_up(state,files,files_diffs,status_logs,entire_logs,repo,delta,), - replacement in inflorescence/src/selection.rs at line 79[38.209]→[38.209:241](∅→∅),[38.241]→[40.21027:21103](∅→∅),[40.21103]→[38.322:340](∅→∅),[38.322]→[38.322:340](∅→∅)
Dir::Right => {select_right(state, files_diffs, logs, repo.as_deref())}Dir::Right => select_right(state,files_diffs,status_logs,entire_logs,repo.as_deref(),), - replacement in inflorescence/src/selection.rs at line 88
Msg::ReleaseDir(dir) => release(dir, state, files_diffs, logs),Msg::ReleaseDir(dir) => release(dir, state, files_diffs, status_logs), - replacement in inflorescence/src/selection.rs at line 114
Dir::Down => alt_select_down(state, files_diffs, logs, delta),Dir::Up => alt_select_up(state, files_diffs, logs, delta),Dir::Down => {alt_select_down(state, files_diffs, status_logs, delta)}Dir::Up => {alt_select_up(state, files_diffs, status_logs, delta)} - replacement in inflorescence/src/selection.rs at line 132
logs,status_logs,entire_logs, - replacement in inflorescence/src/selection.rs at line 142
logs: &mut diff::LogFilesAndState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState, - edit in inflorescence/src/selection.rs at line 152
entire_log, - edit in inflorescence/src/selection.rs at line 172
}if let Some(app::EntireLog::Got { log, nav }) = entire_log.as_ref() {let (selection, task) = if let Some(LogChange {ix: log_ix,hash,message,file,}) = state.view.entire_log.take(){match file {Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}) => {if diff_selected {let id_hash = file::log_id_parts_hash(hash, &path);let selection = LogChange {ix: log_ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),};let task = if let Some(nav) = entire_logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)}) {iced_nav_scrollable::scroll_down(nav, delta)} else {Task::none()};(selection, task)} else {let log_entry = 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, selection_task) = entire_log_file_selection(entire_logs,log_entry,hash,file_ix,);let scroll_task = if let Some((nav_changes_hash, nav)) =entire_logs.changes_nav.as_ref()&& *nav_changes_hash == hash{iced_nav_scrollable::scroll_down_to_section(file_ix, nav,)} else {Task::none()};let selection = LogChange {ix: log_ix,hash,message,file: Some(file),};(selection, Task::batch([selection_task, scroll_task]))}}None => {if log.len().saturating_sub(1) == log_ix {let ix = 0;entire_log_selection(nav,entire_logs,log,ix,VertDir::Up,)} else {let ix = log_ix + 1;entire_log_selection(nav,entire_logs,log,ix,VertDir::Down,)}}}} else {let ix = 0;entire_log_selection(nav, entire_logs, log, ix, VertDir::Down)};state.view.entire_log = Some(selection);return task; - replacement in inflorescence/src/selection.rs at line 318
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 320
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 376
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 378
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 417
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 422
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 431
let selection = Status::LogChange {let selection = Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 440
};let task = if let Some(nav) = logs});let task = if let Some(nav) = status_logs - replacement in inflorescence/src/selection.rs at line 464
let (file, selection_task) =log_file_selection(logs, log_entry, hash, file_ix);let (file, selection_task) = log_file_selection(status_logs,log_entry,hash,file_ix,); - replacement in inflorescence/src/selection.rs at line 472
logs.changes_nav.as_ref()status_logs.changes_nav.as_ref() - replacement in inflorescence/src/selection.rs at line 482
let selection = Status::LogChange {let selection = Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 487
};}); - replacement in inflorescence/src/selection.rs at line 516
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 518
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 526
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 528
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 563
let (selection, task) = log_selection(let (selection, task) = status_log_selection( - replacement in inflorescence/src/selection.rs at line 565
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 584
logs: &mut diff::LogFilesAndState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState, - edit in inflorescence/src/selection.rs at line 594
entire_log, - edit in inflorescence/src/selection.rs at line 615
if let Some(app::EntireLog::Got { log, nav }) = entire_log.as_ref() {let (selection, task) = if let Some(LogChange {ix: log_ix,hash,message,file,}) = state.view.entire_log.take(){match file {Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}) => {if diff_selected {let id_hash = file::log_id_parts_hash(hash, &path);let selection = LogChange {ix: log_ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),};let task = if let Some(nav) = entire_logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)}) {iced_nav_scrollable::scroll_up(nav, delta)} else {Task::none()};(selection, task)} else {let log_entry = log.get(log_ix).unwrap();let file_ix = if 0 == file_ix {log_entry.file_paths.len().saturating_sub(1)} else {file_ix - 1};let (file, selection_task) = entire_log_file_selection(entire_logs,log_entry,hash,file_ix,);let scroll_task = if let Some((nav_changes_hash, nav)) =entire_logs.changes_nav.as_ref()&& *nav_changes_hash == hash{iced_nav_scrollable::scroll_up_to_section(file_ix, nav,)} else {Task::none()}; - edit in inflorescence/src/selection.rs at line 680
let selection = LogChange {ix: log_ix,hash,message,file: Some(file),};(selection, Task::batch([selection_task, scroll_task]))}}None => {if 0 == log_ix {let ix = log.len().saturating_sub(1);entire_log_selection(nav,entire_logs,log,ix,VertDir::Down,)} else {let ix = log_ix - 1;entire_log_selection(nav,entire_logs,log,ix,VertDir::Up,)}}}} else {let ix = 0;entire_log_selection(nav, entire_logs, log, ix, VertDir::Down)};state.view.entire_log = Some(selection);return task;} - replacement in inflorescence/src/selection.rs at line 747
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 749
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 825
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 827
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 856
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 861
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 870
let selection = Status::LogChange {let selection = Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 879
};let task = if let Some(nav) = logs});let task = if let Some(nav) = status_logs - replacement in inflorescence/src/selection.rs at line 900
let (file, selection_task) =log_file_selection(logs, log_entry, hash, file_ix);let (file, selection_task) = log_file_selection(status_logs,log_entry,hash,file_ix,); - replacement in inflorescence/src/selection.rs at line 908
logs.changes_nav.as_ref()status_logs.changes_nav.as_ref() - replacement in inflorescence/src/selection.rs at line 918
let selection = Status::LogChange {let selection = Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 923
};}); - replacement in inflorescence/src/selection.rs at line 952
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 954
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 962
log_selection(status_log_selection( - replacement in inflorescence/src/selection.rs at line 964
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 977
let (selection, task) = log_selection(let (selection, task) = status_log_selection( - replacement in inflorescence/src/selection.rs at line 979
logs,status_logs, - replacement in inflorescence/src/selection.rs at line 1062
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1072
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 1086
| Some(Status::LogChange { .. })| Some(Status::LogChange(LogChange { .. })) - replacement in inflorescence/src/selection.rs at line 1136
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1146
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 1160
| Some(Status::LogChange { .. })| Some(Status::LogChange(LogChange { .. })) - edit in inflorescence/src/selection.rs at line 1174
entire_log, - replacement in inflorescence/src/selection.rs at line 1179
let (selection, task): (Option<Status>, Task<crate::Msg>) =match state.view.status.take() {Some(Status::LogChange {if let Some(app::EntireLog::Got { log: _, nav }) = entire_log.as_ref() {let (selection, task) = match state.view.entire_log.take() {Some(LogChange { - replacement in inflorescence/src/selection.rs at line 1195
Some(Status::LogChange {Some(LogChange { - replacement in inflorescence/src/selection.rs at line 1208
let selection = Status::LogChange {let selection = LogChange { - edit in inflorescence/src/selection.rs at line 1214
let task =iced_nav_scrollable::scroll_to_stored_offset(nav);(Some(selection), task)}}selection @ (Some(LogChange { file: None, .. }) | None) => {(selection, Task::none())}};state.view.entire_log = selection;return task;}let (selection, task): (Option<Status>, Task<crate::Msg>) =match state.view.status.take() {Some(Status::LogChange(LogChange {ix,hash,message,file:Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),})) => {if diff_selected {(Some(Status::LogChange(LogChange {ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: false,}),})),Task::none(),)} else {let selection = Status::LogChange(LogChange {ix,hash,message,file: None,}); - replacement in inflorescence/src/selection.rs at line 1293
| Some(Status::LogChange { file: None, .. })| Some(Status::LogChange(LogChange {file: None,..})) - replacement in inflorescence/src/selection.rs at line 1306
logs: &mut diff::LogFilesAndState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState, - edit in inflorescence/src/selection.rs at line 1315
entire_log, - edit in inflorescence/src/selection.rs at line 1320
if let Some(app::EntireLog::Got { log, nav: _ }) = entire_log.as_ref()&& let Some(entire_log) = state.view.entire_log.take(){let (selection, task) = match entire_log {LogChange {ix,hash,message,file: None,} => {let log_entry = log.get(ix).unwrap();let (file, task) = if let Some(path) =log_entry.file_paths.first(){let id_hash = file::log_id_parts_hash(log_entry.hash, path);let task = if let Some(log) =entire_logs.diffs.get(&id_hash){// Init log diffs navlet contents_count = diff::contents_count(&log.file);let unchanged_sections =diff::unchanged_sections(&log.file);let (nav, tasks) = iced_nav_scrollable::init(contents_count,unchanged_sections,);entire_logs.diffs_nav = Some((id_hash, nav));tasks.map(move |msg| {crate::Msg::View(app::Msg::LogChangeFileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})})} else {// If the log is not loaded yet, the nav will be// initialized once it's loaded// (`repo::MsgOut::GotChangeDifs`)Task::none()};(Some(LogChangeFileSelection {ix: 0,path: path.clone(),diff_selected: false,}),task,)} else {(None, Task::none())};(Some(LogChange {ix,hash,message,file,}),task,)}LogChange {ix,hash,message,file:Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: false,}),} => {let id_hash = file::log_id_parts_hash(hash, &path);let is_diff_scrollable =diff::log_diff_needs_scrolling(entire_logs, id_hash);// If the selected file's diff is already loaded (it has an// attached state), scroll back to its last offsetlet task = if is_diff_scrollable&& let Some(nav) = entire_logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {iced_nav_scrollable::scroll_to_stored_offset(nav)} else {Task::none()};(Some(LogChange {ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: is_diff_scrollable,}),}),task,)}selection @ LogChange { .. } => (Some(selection), Task::none()),};state.view.entire_log = selection;return task;} - replacement in inflorescence/src/selection.rs at line 1491
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1496
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 1501
let task = if let Some(log) = logs.diffs.get(&id_hash) {let task = if let Some(log) = status_logs.diffs.get(&id_hash) { - replacement in inflorescence/src/selection.rs at line 1510
logs.diffs_nav = Some((id_hash, nav));tasks.map(move |msg| crate::Msg::LogDiffNav {id_hash,msg: diff::Msg::DiffNav(msg),status_logs.diffs_nav = Some((id_hash, nav));tasks.map(move |msg| {crate::Msg::View(app::Msg::LogChangeFileDiff {id_hash,msg: diff::Msg::DiffNav(msg),}) - replacement in inflorescence/src/selection.rs at line 1535
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1540
}),})), - replacement in inflorescence/src/selection.rs at line 1544
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1554
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 1556
let diff_selected = diff::log_diff_needs_scrolling(logs, id_hash);let is_diff_scrollable =diff::log_diff_needs_scrolling(status_logs, id_hash); - replacement in inflorescence/src/selection.rs at line 1560
let task = if diff_selected&& let Some(nav) =logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| {let task = if is_diff_scrollable&& let Some(nav) = status_logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| { - replacement in inflorescence/src/selection.rs at line 1564
}) {},) { - replacement in inflorescence/src/selection.rs at line 1571
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1578
diff_selected,diff_selected: is_diff_scrollable, - replacement in inflorescence/src/selection.rs at line 1580
}),})), - replacement in inflorescence/src/selection.rs at line 1631
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1641
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 1653
| Some(Status::LogChange { .. })| Some(Status::LogChange(LogChange { .. })) - replacement in inflorescence/src/selection.rs at line 1667
logs: &mut diff::LogFilesAndState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState, - edit in inflorescence/src/selection.rs at line 1675
entire_log, - edit in inflorescence/src/selection.rs at line 1680
if let Some(app::EntireLog::Got { log, nav }) = entire_log.as_ref() {let (selection, task) = match select {Select::LogChange {ix,hash: _,message: _,} => {let (selection, task) = entire_log_selection(nav,entire_logs,log,ix,VertDir::Down,);(Some(selection), task)}Select::LogChangeFile { ix: file_ix, path } => {match state.view.entire_log.take() {Some(LogChange {ix: log_ix,hash,message,file: _,}) => {let log_entry = log.get(log_ix).unwrap();let id_hash = file::log_id_parts_hash(hash, &path);let diff_selected = diff::log_diff_needs_scrolling(entire_logs,id_hash,);// If the selected file's diff is already loaded (it has// an attached state), scroll// back to its last offsetlet scroll_task = if diff_selected&& let Some(nav) = entire_logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)}) {iced_nav_scrollable::scroll_to_stored_offset(nav)} else {Task::none()};let (file, selection_task) = log_file_selection(entire_logs,log_entry,hash,file_ix,);let selection = Some(LogChange {ix: log_ix,hash,message,file: Some(file),});(selection, Task::batch([selection_task, scroll_task]))}selection => (selection, Task::none()),}}_ => {unreachable!()}};state.view.entire_log = selection;return task;} - replacement in inflorescence/src/selection.rs at line 1826
let (selection, task) =log_selection(status_nav, logs, repo_state, ix, VertDir::Down);let (selection, task) = status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,); - replacement in inflorescence/src/selection.rs at line 1837
Some(Status::LogChange {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1842
}) => {})) => { - replacement in inflorescence/src/selection.rs at line 1847
diff::log_diff_needs_scrolling(logs, id_hash);diff::log_diff_needs_scrolling(status_logs, id_hash); - replacement in inflorescence/src/selection.rs at line 1851
&& let Some(nav) = logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| {&& let Some(nav) = status_logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| { - replacement in inflorescence/src/selection.rs at line 1856
},) {}) { - replacement in inflorescence/src/selection.rs at line 1862
let (file, selection_task) =log_file_selection(logs, log_entry, hash, file_ix);let (file, selection_task) = log_file_selection(status_logs,log_entry,hash,file_ix,); - replacement in inflorescence/src/selection.rs at line 1869
let selection = Some(Status::LogChange {let selection = Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1874
});})); - replacement in inflorescence/src/selection.rs at line 2030
fn log_selection(fn status_log_selection( - replacement in inflorescence/src/selection.rs at line 2047
crate::Msg::View(app::Msg::LogNav { hash, msg })crate::Msg::View(app::Msg::LogChangeNav { change: hash, msg }) - edit in inflorescence/src/selection.rs at line 2069
let selection = Status::LogChange(LogChange {ix,hash,message: entry.message.clone(),file: None,});(selection, Task::batch([nav_task, scroll_task]))}fn entire_log_selection(nav: &NavScrollable,logs: &mut diff::LogFilesAndState,log: &repo::Log,ix: usize,dir: VertDir,) -> (LogChange, Task<crate::Msg>) {let entry = log.get(ix).unwrap();let hash = entry.hash; - replacement in inflorescence/src/selection.rs at line 2090
let selection = Status::LogChange {let nav_task = match logs.change_file_counts.get(&hash) {Some(contents_count) => {// Init log changes navlet (nav, tasks) =iced_nav_scrollable::init(*contents_count, HashSet::new());logs.changes_nav = Some((hash, nav));tasks.map(move |msg| {crate::Msg::View(app::Msg::EntireLogChangeNav {change: hash,msg,})})}None => {// If the log is not loaded yet, the nav will be initialized once// it's loaded (`repo::MsgOut::GotChangeDifs`)Task::done(crate::Msg::View(app::Msg::ToRepo(repo::MsgIn::GetChangeDiffs { hash },)))}};let scroll_task = match dir {VertDir::Up => iced_nav_scrollable::scroll_up_to_section(ix, nav),VertDir::Down => iced_nav_scrollable::scroll_down_to_section(ix, nav),};let selection = LogChange { - edit in inflorescence/src/selection.rs at line 2177
fn entire_log_file_selection(logs: &mut diff::LogFilesAndState,log_entry: &repo::LogEntry,hash: repo::ChangeHash,file_ix: usize,) -> (LogChangeFileSelection, Task<crate::Msg>) {let path = log_entry.file_paths.get(file_ix).unwrap().clone();let id_hash = file::log_id_parts_hash(hash, &path);let nav_task = match logs.diffs.get(&id_hash) {Some(diff) => {let needs_new_nav = logs.diffs_nav.is_none()|| logs.diffs_nav.as_ref().map(|(nav_id_hash, _nav)| *nav_id_hash != id_hash).unwrap_or_default();if needs_new_nav {let contents_count = diff::contents_count(&diff.file);// Init log change diff navlet (nav, tasks) =iced_nav_scrollable::init(contents_count, HashSet::new());logs.diffs_nav = Some((id_hash, nav));tasks.map(move |msg| {crate::Msg::View(app::Msg::LogChangeFileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})})} else {Task::none()}}None => {// If the log is not loaded yet, the nav will be initialized once// it's loaded (`repo::MsgOut::GotChangeDifs`)Task::none()}};(LogChangeFileSelection {ix: file_ix,path,diff_selected: false,},nav_task,)} - replacement in inflorescence/src/main.rs at line 103
logs: diff::LogFilesAndState::default(),status_logs: diff::LogFilesAndState::default(),entire_logs: diff::LogFilesAndState::default(), - replacement in inflorescence/src/main.rs at line 122
/// Diffs for untracked and changed files/// Diffs for untracked and changed files shown in status view - replacement in inflorescence/src/main.rs at line 124
/// The diffs are loaded async and not present while loading.logs: diff::LogFilesAndState,/// Logs shown in the status view. The diffs are loaded async and not/// present while loading.status_logs: diff::LogFilesAndState,/// Logs for the entire logentire_logs: diff::LogFilesAndState, - edit in inflorescence/src/main.rs at line 140
LogDiffNav {id_hash: file::LogIdHash,msg: diff::Msg,}, - edit in inflorescence/src/main.rs at line 192[25.3747]→[40.8406:8609](∅→∅),[40.8609]→[25.4073:4087](∅→∅),[28.9532]→[25.4073:4087](∅→∅),[25.4073]→[25.4073:4087](∅→∅),[25.4087]→[40.8610:8967](∅→∅),[31.292]→[25.4531:4545](∅→∅),[40.8967]→[25.4531:4545](∅→∅),[28.9733]→[25.4531:4545](∅→∅),[25.4531]→[25.4531:4545](∅→∅),[25.4545]→[16.26257:26292](∅→∅),[16.26257]→[16.26257:26292](∅→∅)
Msg::LogDiffNav { id_hash, msg } => {if let Some(diff::FileAndState {file: _,state: diff_state,}) = state.logs.diffs.get_mut(&id_hash){let nav = state.logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},);let task = diff::update(diff_state, nav, msg);return task.map(move |msg| Msg::LogDiffNav { id_hash, msg });}Task::none()} - edit in inflorescence/src/main.rs at line 272
} else if matches!(repo.entire_log.as_ref(),Some(app::EntireLog::Got { .. }),) {// Repeated match to take ownership of the logif let Some(app::EntireLog::Got { log, nav }) =repo.entire_log.take(){// Cache for later viewingrepo.entire_log = Some(app::EntireLog::NotViewing {log,nav_stored_offset: nav.stored_offset,});} else {debug_assert!(false, "The outter match should have the same condition as the inner match)")} - replacement in inflorescence/src/main.rs at line 297
&mut state.logs,&mut state.status_logs,&mut state.entire_logs, - replacement in inflorescence/src/main.rs at line 315
app::Msg::LogNav { hash, msg } => {if let Some((selected_hash, nav)) = state.logs.changes_nav.as_mut()app::Msg::LogChangeNav { change: hash, msg } => {if let Some((selected_hash, nav)) =state.status_logs.changes_nav.as_mut() - replacement in inflorescence/src/main.rs at line 320
iced_nav_scrollable::update(nav, msg).map(move |msg| Msg::View(app::Msg::LogNav { hash, msg }))iced_nav_scrollable::update(nav, msg).map(move |msg| {Msg::View(app::Msg::LogChangeNav { change: hash, msg })}) - edit in inflorescence/src/main.rs at line 368
app::Msg::EntireLog => {if let Some(repo) = state.repo.as_mut() {match repo.entire_log.as_ref() {None => {state.repo_tx_in.send(repo::MsgIn::LoadEntireLog).unwrap();repo.entire_log = Some(app::EntireLog::Loading);}Some(app::EntireLog::LoadingButNotViewing) => {repo.entire_log = Some(app::EntireLog::Loading);}Some(app::EntireLog::NotViewing { .. }) => {// Repeated match to take ownership of the logif let Some(app::EntireLog::NotViewing {log,nav_stored_offset,}) = repo.entire_log.take(){let (mut nav, nav_task) = iced_nav_scrollable::init(log.len(),HashSet::new(),);// Scroll to last selection if anynav.stored_offset = nav_stored_offset;let scroll_task =iced_nav_scrollable::scroll_to_stored_offset(&nav,);repo.entire_log = Some(app::EntireLog::Got {log,nav: Box::new(nav),});return Task::batch([nav_task.map(|msg| {Msg::View(app::Msg::EntireLogNav(msg))}),scroll_task,]);} else {debug_assert!(false, "The outter match should have the same condition as the inner match)")}}Some(app::EntireLog::Loading | app::EntireLog::Got { .. },) => {}}}Task::none()}app::Msg::EntireLogNav(msg) => {if let Some(app::Repo {entire_log: Some(app::EntireLog::Got { log: _, nav }),..}) = state.repo.as_mut(){return iced_nav_scrollable::update(nav, msg).map(|msg| Msg::View(app::Msg::EntireLogNav(msg)));}Task::none()}app::Msg::EntireLogChangeNav { change, msg } => {if let Some((selected_change, nav)) =state.entire_logs.changes_nav.as_mut()&& change == *selected_change{iced_nav_scrollable::update(nav, msg).map(move |msg| {Msg::View(app::Msg::EntireLogChangeNav { change, msg })})} else {Task::none()}} - edit in inflorescence/src/main.rs at line 456
repo::MsgOut::LoadedEntireLog(log) => got_entire_log(state, log), - edit in inflorescence/src/main.rs at line 466
entire_log: _, - edit in inflorescence/src/main.rs at line 530
entire_log: _, - replacement in inflorescence/src/main.rs at line 650
state.logs.changes_nav = None;state.logs.diffs_nav = None;state.status_logs.changes_nav = None;state.status_logs.diffs_nav = None; - edit in inflorescence/src/main.rs at line 658
entire_log: _, - replacement in inflorescence/src/main.rs at line 718
if let Some(selection::Status::LogChange {if let Some(selection::LogChange { - replacement in inflorescence/src/main.rs at line 728
}) = state.selection.view.status.as_mut()}) = state.selection.view.entire_log.as_mut() - replacement in inflorescence/src/main.rs at line 736
}) = state.logs.diffs.get_mut(&id_hash)}) = state.entire_logs.diffs.get_mut(&id_hash) - replacement in inflorescence/src/main.rs at line 738
let nav =state.logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)});return diff::update(diff_state, nav, action).map(move |msg| Msg::LogDiffNav { id_hash, msg });let nav = state.entire_logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav),);return diff::update(diff_state, nav, action).map(move |msg| {Msg::View(app::Msg::LogChangeFileDiff { id_hash, msg })});}} else if let Some(selection::Status::LogChange(selection::LogChange {ix: _,hash: selected_hash,message: _,file:Some(selection::LogChangeFileSelection {ix: _,path: selected_path,diff_selected: _,}),})) = state.selection.view.status.as_mut(){let selected_id_hash =file::log_id_parts_hash(*selected_hash, selected_path);if selected_id_hash == id_hash&& let Some(diff::FileAndState {file: _,state: diff_state,}) = state.status_logs.diffs.get_mut(&id_hash){let nav = state.status_logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav),);return diff::update(diff_state, nav, action).map(move |msg| {Msg::View(app::Msg::LogChangeFileDiff { id_hash, msg })}); - edit in inflorescence/src/main.rs at line 786
entire_log: None, - edit in inflorescence/src/main.rs at line 874
entire_log: None, - replacement in inflorescence/src/main.rs at line 952
selection::Status::LogChange {selection::Status::LogChange(selection::LogChange { - replacement in inflorescence/src/main.rs at line 957
} => {}) => { - replacement in inflorescence/src/main.rs at line 983
selection::Status::LogChange {selection::Status::LogChange(selection::LogChange { - replacement in inflorescence/src/main.rs at line 988
}}) - replacement in inflorescence/src/main.rs at line 1019[40.12318]→[46.22440:22498](∅→∅),[40.12376]→[19.12937:13001](∅→∅),[46.22498]→[19.12937:13001](∅→∅),[19.12937]→[19.12937:13001](∅→∅),[19.13001]→[40.12377:12391](∅→∅),[40.12391]→[46.22499:22545](∅→∅),[41.561]→[34.2861:2895](∅→∅),[46.22545]→[34.2861:2895](∅→∅),[19.13098]→[34.2861:2895](∅→∅)
let task = if let Some(selection::Status::LogChange {ix: _,hash: selected_hash,message: _,file,}) = state.selection.view.status.as_mut()&& *selected_hash == hashif let Some(app::EntireLog::Got { .. }) = state.repo.as_ref().and_then(|repo| repo.entire_log.as_ref()) - replacement in inflorescence/src/main.rs at line 1024
if let Some(file) = file.as_ref() {let Some(selection::LogChange {ix: _,hash: selected_hash,message: _,file,}) = state.selection.view.entire_log.as_mut()else {return Task::none();};if *selected_hash != hash {return Task::none();}let task = if let Some(file) = file.as_ref() { - replacement in inflorescence/src/main.rs at line 1046
state.logs.diffs_nav = Some((id_hash, diffs_nav));state.entire_logs.diffs_nav = Some((id_hash, diffs_nav)); - replacement in inflorescence/src/main.rs at line 1059
state.logs.changes_nav = Some((hash, changes_nav));state.entire_logs.changes_nav = Some((hash, changes_nav));nav_task.map(move |msg| {Msg::View(app::Msg::EntireLogChangeNav { change: hash, msg })})};// Store the changesstate.entire_logs.change_file_counts.insert(hash, changed_files_count);diffs.into_iter().for_each(|(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 id_hash = file::log_id_parts_hash(hash, &path);let log_file_diff = diff::FileAndState {file,// The nav is initialized only once a file is selected,// because its tasks need it to be visible to completestate: diff::State::default(),};state.entire_logs.diffs.insert(id_hash, log_file_diff);});task} else if let Some(selection::Status::LogChange(selection::LogChange {ix: _,hash: selected_hash,message: _,file,})) = state.selection.view.status.as_mut(){let task = if *selected_hash == hash {if let Some(file) = file.as_ref() {// If a file is selected, init the nav for its difflet diff = diffs.get(&file.path).unwrap();let diff_contents_count = diff.len();let (diffs_nav, nav_task) = iced_nav_scrollable::init(diff_contents_count,HashSet::new(),);let id_hash = file::log_id_parts_hash(hash, &file.path); - replacement in inflorescence/src/main.rs at line 1107
nav_task.map(move |msg| Msg::View(app::Msg::LogNav { hash, msg }))}} else {Task::none()};state.status_logs.diffs_nav = Some((id_hash, diffs_nav)); - replacement in inflorescence/src/main.rs at line 1109
// Store the changesstate.logs.change_file_counts.insert(hash, changed_files_count);diffs.into_iter().for_each(|(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 id_hash = file::log_id_parts_hash(hash, &path);let log_file_diff = diff::FileAndState {file,// The nav is initialized only once a file is selected,// because its tasks need it to be visible to completestate: diff::State::default(),nav_task.map(move |msg| {Msg::View(app::Msg::LogChangeFileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})})} else {// Init scrollable nav for log changeslet (changes_nav, nav_task) = iced_nav_scrollable::init(changed_files_count,HashSet::new(),);state.status_logs.changes_nav = Some((hash, changes_nav));nav_task.map(move |msg| {Msg::View(app::Msg::LogChangeNav { change: hash, msg })})}} else {Task::none() - edit in inflorescence/src/main.rs at line 1131
// Store the changesstate.status_logs.change_file_counts.insert(hash, changed_files_count);diffs.into_iter().for_each(|(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 id_hash = file::log_id_parts_hash(hash, &path);let log_file_diff = diff::FileAndState {file,// The nav is initialized only once a file is selected,// because its tasks need it to be visible to completestate: diff::State::default(),}; - replacement in inflorescence/src/main.rs at line 1151
state.logs.diffs.insert(id_hash, log_file_diff);});state.status_logs.diffs.insert(id_hash, log_file_diff);});task} else {Task::none()}} - replacement in inflorescence/src/main.rs at line 1159
taskfn got_entire_log(state: &mut State, log: repo::Log) -> Task<Msg> {if let Some(repo) = state.repo.as_mut() {match repo.entire_log.as_ref() {None| Some(app::EntireLog::Loading | app::EntireLog::Got { .. }) => {let (nav, task) =iced_nav_scrollable::init(log.len(), HashSet::new());repo.entire_log = Some(app::EntireLog::Got {log,nav: Box::new(nav),});return task.map(|msg| Msg::View(app::Msg::EntireLogNav(msg)));}Some(app::EntireLog::LoadingButNotViewing| app::EntireLog::NotViewing { .. },) => {repo.entire_log = Some(app::EntireLog::NotViewing {log,nav_stored_offset: None,});}}}Task::none() - replacement in inflorescence/src/main.rs at line 1193
"a" => Some(Msg::View(app::Msg::AddUntrackedFile)),"c" => Some(Msg::View(app::Msg::SwitchChannel)),"f" => Some(Msg::View(app::Msg::ForkChannel)),// _________________________________________________________// Directions - edit in inflorescence/src/main.rs at line 1207
// _________________________________________________________// Other keys (sort alphabetically)"a" => Some(Msg::View(app::Msg::AddUntrackedFile)),"c" => Some(Msg::View(app::Msg::SwitchChannel)),"e" => Some(Msg::View(app::Msg::EntireLog)),"f" => Some(Msg::View(app::Msg::ForkChannel)), - replacement in inflorescence/src/main.rs at line 1360
let status_nav_sub = if state.repo.is_some() {let status_nav_sub = if let Some(selection::LogChange { .. }) =state.selection.view.entire_log{iced_nav_scrollable::subs().map(|msg| Msg::View(app::Msg::EntireLogNav(msg)))} else if state.repo.is_some() { - replacement in inflorescence/src/main.rs at line 1372
let log_nav_sub =if let Some((hash, _nav)) = state.logs.changes_nav.as_ref() {let hash = *hash;iced_nav_scrollable::subs().with(hash).map(|(hash, msg)| Msg::View(app::Msg::LogNav { hash, msg }))} else {Subscription::none()};let log_nav_sub = if let Some((hash, _nav)) =state.entire_logs.changes_nav.as_ref(){let change = *hash;iced_nav_scrollable::subs().with(change).map(|(change, msg)| {Msg::View(app::Msg::EntireLogChangeNav { change, msg })})} else if let Some((hash, _nav)) = state.status_logs.changes_nav.as_ref() {let hash = *hash;iced_nav_scrollable::subs().with(hash).map(|(hash, msg)| {Msg::View(app::Msg::LogChangeNav { change: hash, msg })})} else {Subscription::none()}; - replacement in inflorescence/src/main.rs at line 1390[37.8111]→[46.26727:26844](∅→∅),[46.26844]→[28.15853:16086](∅→∅),[28.15853]→[28.15853:16086](∅→∅),[28.16086]→[40.14543:14744](∅→∅),[39.525]→[28.16224:16243](∅→∅),[40.14744]→[28.16224:16243](∅→∅),[28.16224]→[28.16224:16243](∅→∅)
let diff_nav_subs = match state.selection.view.status.as_ref() {Some(selection::Status::UntrackedFile {ix: _,path,diff_selected: true,}) => {let id_hash = file::id_parts_hash(path, file::Kind::Untracked);iced_nav_scrollable::subs().with(id_hash).map(|(id_hash, msg)| {Msg::View(app::Msg::FileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})})let diff_nav_subs = if let Some(selection) =state.selection.view.entire_log.as_ref(){match selection {selection::LogChange {ix: _,hash,message: _,file:Some(selection::LogChangeFileSelection {ix: _,path,diff_selected: true,}),} => {let id_hash = file::log_id_parts_hash(*hash, path);iced_nav_scrollable::subs().with(id_hash).map(|(id_hash, msg)| {Msg::View(app::Msg::LogChangeFileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})},)}_ => Subscription::none(), - replacement in inflorescence/src/main.rs at line 1417[28.16253]→[46.26845:26891](∅→∅),[46.26891]→[28.16299:16530](∅→∅),[28.16299]→[28.16299:16530](∅→∅),[28.16530]→[40.14745:14946](∅→∅),[39.576]→[28.16668:16697](∅→∅),[40.14946]→[28.16668:16697](∅→∅),[28.16668]→[28.16668:16697](∅→∅),[28.16697]→[46.26892:26936](∅→∅),[46.26936]→[28.16741:16820](∅→∅),[28.16741]→[28.16741:16820](∅→∅),[28.16820]→[46.26937:26994](∅→∅),[46.26994]→[28.16874:17224](∅→∅),[28.16874]→[28.16874:17224](∅→∅),[28.17224]→[39.577:627](∅→∅),[39.627]→[28.17280:17299](∅→∅),[28.17280]→[28.17280:17299](∅→∅)
Some(selection::Status::ChangedFile {ix: _,path,diff_selected: true,}) => {let id_hash = file::id_parts_hash(path, file::Kind::Changed);iced_nav_scrollable::subs().with(id_hash).map(|(id_hash, msg)| {Msg::View(app::Msg::FileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})})}Some(selection::Status::LogChange {ix: _,hash,message: _,file:Some(selection::LogChangeFileSelection {ix: _,path,diff_selected: true,}),}) => {let id_hash = file::log_id_parts_hash(*hash, path);iced_nav_scrollable::subs().with(id_hash).map(|(id_hash, msg)| Msg::LogDiffNav {id_hash,msg: diff::Msg::DiffNav(msg),})} else {match state.selection.view.status.as_ref() {Some(selection::Status::UntrackedFile {ix: _,path,diff_selected: true,}) => {let id_hash = file::id_parts_hash(path, file::Kind::Untracked);iced_nav_scrollable::subs().with(id_hash).map(|(id_hash, msg)| {Msg::View(app::Msg::FileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})},)}Some(selection::Status::ChangedFile {ix: _,path,diff_selected: true,}) => {let id_hash = file::id_parts_hash(path, file::Kind::Changed);iced_nav_scrollable::subs().with(id_hash).map(|(id_hash, msg)| {Msg::View(app::Msg::FileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})},)}Some(selection::Status::LogChange(selection::LogChange {ix: _,hash,message: _,file:Some(selection::LogChangeFileSelection {ix: _,path,diff_selected: true,}),})) => {let id_hash = file::log_id_parts_hash(*hash, path);iced_nav_scrollable::subs().with(id_hash).map(|(id_hash, msg)| {Msg::View(app::Msg::LogChangeFileDiff {id_hash,msg: diff::Msg::DiffNav(msg),})},)}Some(selection::Status::UntrackedFile { .. })| Some(selection::Status::ChangedFile { .. })| Some(selection::Status::LogChange { .. })| None => Subscription::none(), - edit in inflorescence/src/main.rs at line 1475
Some(selection::Status::UntrackedFile { .. })| Some(selection::Status::ChangedFile { .. })| Some(selection::Status::LogChange { .. })| None => Subscription::none(), - replacement in inflorescence/src/main.rs at line 1499
logs,status_logs,entire_logs, - replacement in inflorescence/src/main.rs at line 1576
Some(selection::Status::LogChange {Some(selection::Status::LogChange(selection::LogChange {ix: log_ix,hash,message,file,})) => {let file = file.as_ref().map(|selection::LogChangeFileSelection {ix: change_ix,path,diff_selected,}| {let id_hash = file::log_id_parts_hash(*hash, path);let nav = status_logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},);let diff = status_logs.diffs.get(&id_hash).zip(nav).map(|(diff::FileAndState { file, state }, nav)| app::Diff {is_selected: *diff_selected,file,state,nav,},);app::LogChangeFileSelection {ix: *change_ix,path,diff,}},);let nav = status_logs.changes_nav.as_ref().and_then(|(nav_hash, nav)| (nav_hash == hash).then_some(nav));Some(app::StatusSelection::Log {ix: *log_ix,hash: *hash,message,file,nav,})}None => None,};let entire_log_selection = match selection.view.entire_log.as_ref() {Some(selection::LogChange { - replacement in inflorescence/src/main.rs at line 1638
let nav = logs.diffs_nav.as_ref().and_then(let nav = entire_logs.diffs_nav.as_ref().and_then( - replacement in inflorescence/src/main.rs at line 1643
let diff = logs.diffs.get(&id_hash).zip(nav).map(let diff = entire_logs.diffs.get(&id_hash).zip(nav).map( - replacement in inflorescence/src/main.rs at line 1658
let nav = logslet nav = entire_logs - replacement in inflorescence/src/main.rs at line 1662
Some(app::StatusSelection::Log {Some(app::EntireLogSelection { - edit in inflorescence/src/main.rs at line 1680
entire_log_selection, - replacement in inflorescence/src/diff.rs at line 39
/// `change_hashes`/// `change_file_counts`'s keys - replacement in iced_nav_scrollable/src/lib.rs at line 282
debug_assert_eq!(unmatched_sections, 0,"The `NavScrollable` was most likely initialized with a count different from the number of actual children given to the the view function. Actual number is {}, but got only {} children", nav.section_heights.len(), nav.section_heights.len() - unmatched_sections);debug_assert_eq!(unmatched_sections, 0,"The `NavScrollable` was most likely initialized with a count different from the number of actual children given to the the view function. Initialized with {}, but viewing only {} children", nav.section_heights.len(), nav.section_heights.len() - unmatched_sections);