very nice refactor, wip adding channels logs
[?]
Aug 7, 2025, 5:30 PM
WAOGSCOJ5A372BZKHEYD2BCDBCENNVLFYW3INKUOOAZMDADDIFIQCDependencies
- [2]
6YZAVBWUInitial commit - [3]
IQDCHWCPload a pijul repo - [4]
SWWE2R6Mdisplay basic repo stuff - [5]
WT3GA27Padd cursor with selection - [6]
UB2ITZJSrefresh changed files on FS changes - [7]
KT5UYXGKfix selection after adding file, add changed file diffs - [8]
S2NVIFXRallow to enter record msg - [9]
YBJRDOTCmake all repo actions async - [10]
KM5PSZ4Awatch repo once loaded - [11]
2VUX5BTDload identity - [12]
A5YBC77Vrecord! - [13]
D7A7MSIHallow to defer or abandon record, add buttons - [14]
W4LFX7IHgroup diffs by file name - [15]
AMPZ2BXKshow changed files diffs (only Edit atm) - [16]
V55EAIWQadd src file LRU cache - [17]
HOJZI52Yrename flowers_ui to inflorescence - [18]
B4RMW5AEadd syntax highlighter to untracked files contents - [19]
MJDGPSHGWIP contents diff - [20]
ZVI4AWERwoot contents_diff - [21]
QMAUTRB6refactor diff - [22]
OQ6HSAWHshow record log - [23]
DCSUCH6Radd undecoded diff view, improve decoded view style - [24]
JE44NYHMdisplay log files diffs - [25]
ONRCENKTrm unnecessary state from repo's internal state - [26]
4ELJZGRJload and store all change diffs at once - [27]
CALXOZXAflatten crates dir - [28]
L6KSEFQImove cursor related stuff into its module - [29]
BFN2VHZSrefactor file stuff into sub-mod - [30]
GWZGYNIBadd view crate - [31]
3SYSJKYLadd app icon - [32]
23SFYK4Qbig view refactor into a new crate - [33]
OPXFZKEBview tests setup - [34]
MYGIBRRHwip custom theme - [35]
XSZZB47Urefactor stuff into lib - [36]
3BK22XE5add a test for hover btn and more refactors - [37]
WGID4LS4absolutely slayed testing with iced task - [38]
VCNKFNUFapp init test - [39]
ACDXXAX2refactor main's updates into smaller fns - [40]
FVA36HBVrestart repo manager task if it crashes - [41]
I56UGW7Umake record test, fix log update - [42]
ESMM3FELtest selection reindexing - [43]
7SSBM4UQview: refactor repo view - [44]
FL2ULDJNtest record - [45]
F542TMBEtest log - [46]
ZD56BUSUadd back +/- bg colors - [47]
S2T7RUKWadd nav back placeholder - [48]
I2AG42PAnew cols layout - [49]
4PNWU55Oreplace the circular hor navigation - [50]
SASAN2XCuse nav-scrollable - [51]
YKHE3XMWrefactor diffs handling - [52]
KEPKF3WOunify diffs handling, simplify view - [53]
GOLHUD6Rnav-scrollable: set skip-able sections - [54]
KWTBNTO3diffs selection and scrolling - [55]
5MUEECMJsmooth scrolling nav - [56]
3TLPJ57Balt scroll via context and couple fixes - [57]
BNHJU2DUclippy fixes - [58]
KQABQCCZupdate rust to 1.88 - [59]
AI3IMKC3refactor stairs - [60]
WXQBBQ2Aupdate nightly - [61]
DST3HRZZfix emoji rendering - [62]
PTWZYQFRuse nav-scrollable for repo status - [63]
RDRBP7ALauto-scroll status selection - [64]
UR4J677Rnav for log changes and refactors - [65]
K63JN6CRrefactor out non-view field from cursor - [66]
GYZWZ33Tfix unwraps on navs for view - [67]
A6Z4O6RCactions menu - [68]
7BLZN73Oadd a key to refresh repo - [69]
JZXYSIYDchannel selection! - [70]
5ZRDYL6Kfork channel, fix recording esc key - [71]
BAUK5BONpimp-up action buttons - [72]
NZD56PVBfix mouse selection - [73]
OJPGHVC3entire log! - [74]
ZIUHKVJKupdate tests - [75]
3XRG4BB6rewritten nav-scrollable! - [76]
S4WH75Y3allow to select channels if there are any other. Conditional switch - [77]
NOB64XMRfmt and clippy - [78]
NWJD6VM6mv libflowers libflorescence - [79]
ELG3UDT6allow to rm added files - [80]
BJXUYQ2Yshow untracked file contents in read-only text editor - [81]
RPCIGCNSadd replacement diff details - [82]
4G6DZDO6rename diff msg for nav-scrollable - [83]
DXAYDIMQupdate to latest pijul - [84]
C5P3JIFCrefactor out the nav-scrollable children len arg - [85]
4WO3ZJM2show untracked files' contents - [86]
WI2BVQ6Jrm client lib crate - [87]
HC7ROIBCmove main diffs state out of cursor - [88]
VJNWIGSXclippy - [89]
PKJCFSBMtheme improvements - [90]
AHWWRC73navigate log entries - [91]
EC3TVL4Xadd untracked files - [92]
NRCUG4R2load changed files src when selected - [93]
3QVNMRNMtest non-empty repo app view - [94]
UF5NJKAStest load repo - [95]
SWDPAGF6test channel name
Change contents
- replacement in libflorescence/src/testing.rs at line 87
let log = repo::get_log(&internal.repo, None, None);let log = repo::get_log(&internal.repo, None, None, None); - replacement in libflorescence/src/repo.rs at line 46
pub log: Log,pub short_log: Log,}#[derive(Clone, Derivative, strum::Display)]#[derivative(Debug)]pub enum MsgIn {RefreshChangedAndUntrackedFiles,AddUntrackedFile {path: String,},RmAddedFile {path: String,},Record {msg: String,#[derivative(Debug = "ignore")]sk: Arc<SKey>,},GetChangeDiffs {hash: ChangeHash,},SwitchToChannel(String),ForkChannel(String),LoadEntireLog,LoadOtherChannelLog(String),}#[derive(Debug, Clone, strum::Display)]pub enum MsgOut {Init(State),Refreshed {state: State,invalidate_logs: bool,},AddedUntrackedFile {path: String,},RmedAddedFile {path: String,},GotChangeDiffs {hash: ChangeHash,diffs: ChangedFiles,},LoadedEntireLog(Log),LoadedOtherChannelLog {channel: String,log: Log,}, - edit in libflorescence/src/repo.rs at line 176[15.490]→[9.312:315](∅→∅),[7.575]→[9.312:315](∅→∅),[9.315]→[12.283:349](∅→∅),[12.349]→[9.355:409](∅→∅),[9.355]→[9.355:409](∅→∅),[9.409]→[12.350:546](∅→∅),[12.546]→[24.7:14](∅→∅),[24.14]→[26.7:28](∅→∅),[26.28]→[54.165:191](∅→∅),[26.55]→[12.546:553](∅→∅),[24.58]→[12.546:553](∅→∅),[54.191]→[12.546:553](∅→∅),[12.546]→[12.546:553](∅→∅),[12.553]→[69.116:145](∅→∅),[69.145]→[70.6:31](∅→∅),[70.31]→[73.6:25](∅→∅),[73.25]→[4.466:468](∅→∅),[70.31]→[4.466:468](∅→∅),[69.145]→[4.466:468](∅→∅),[9.510]→[4.466:468](∅→∅),[12.553]→[4.466:468](∅→∅),[7.575]→[4.466:468](∅→∅),[4.466]→[4.466:468](∅→∅),[4.468]→[9.511:587](∅→∅),[9.587]→[39.6:28](∅→∅),[39.28]→[41.6:181](∅→∅),[39.28]→[26.56:77](∅→∅),[41.181]→[26.56:77](∅→∅),[25.34]→[26.56:77](∅→∅),[26.77]→[54.192:218](∅→∅),[54.218]→[26.104:140](∅→∅),[26.104]→[26.104:140](∅→∅),[26.140]→[73.26:52](∅→∅)
}#[derive(Clone, Derivative, strum::Display)]#[derivative(Debug)]pub enum MsgIn {RefreshChangedAndUntrackedFiles,AddUntrackedFile {path: String,},RmAddedFile {path: String,},Record {msg: String,#[derivative(Debug = "ignore")]sk: Arc<SKey>,},GetChangeDiffs {hash: ChangeHash,},SwitchToChannel(String),ForkChannel(String),LoadEntireLog,}#[derive(Debug, Clone, strum::Display)]pub enum MsgOut {Init(State),Refreshed(State),AddedUntrackedFile {path: String,},RmedAddedFile {path: String,},/// The State is updated after making a recordRecorded(State),GotChangeDiffs {hash: ChangeHash,diffs: ChangedFiles,},LoadedEntireLog(Log), - replacement in libflorescence/src/repo.rs at line 253
let _ = msg_out_tx.send(MsgOut::Refreshed(state));let _ = msg_out_tx.send(MsgOut::Refreshed {state,// To be safe - this msg might be triggered from any change// reported by file watchinvalidate_logs: true,}); - replacement in libflorescence/src/repo.rs at line 290
let _ = msg_out_tx.send(MsgOut::Recorded(state));let _ = msg_out_tx.send(MsgOut::Refreshed {state,invalidate_logs: true,}); - replacement in libflorescence/src/repo.rs at line 318
let _ = msg_out_tx.send(MsgOut::Refreshed(state));let _ = msg_out_tx.send(MsgOut::Refreshed {state,invalidate_logs: true,}); - replacement in libflorescence/src/repo.rs at line 332
let _ = msg_out_tx.send(MsgOut::Refreshed(state));let _ = msg_out_tx.send(MsgOut::Refreshed {state,invalidate_logs: false,}); - replacement in libflorescence/src/repo.rs at line 340
let log = get_log(&internal_state.repo, None, None);let log = get_log(&internal_state.repo, None, None, None); - edit in libflorescence/src/repo.rs at line 347
MsgIn::LoadOtherChannelLog(channel) => {let channel_returned: String;let log: Log;(internal_state, channel_returned, log) =spawn_blocking(move || {let log = get_log(&internal_state.repo,Some(&channel),None,None,);(internal_state, channel, log)}).await.unwrap();let _ = msg_out_tx.send(MsgOut::LoadedOtherChannelLog {channel: channel_returned,log,});} - replacement in libflorescence/src/repo.rs at line 382
let log = get_log(repo, offset, limit);let log = get_log(repo, Some(&channel), offset, limit); - replacement in libflorescence/src/repo.rs at line 389
log,short_log: log, - edit in libflorescence/src/repo.rs at line 919
channel: Option<&str>, - replacement in libflorescence/src/repo.rs at line 928
let cur_channel = txn.current_channel().unwrap_or(pijul::DEFAULT_CHANNEL)let cur_channel = channel.unwrap_or_else(|| {txn.current_channel().unwrap_or(pijul::DEFAULT_CHANNEL)}) - replacement in libflorescence/src/repo/test.rs at line 99
let log = repo::get_log(&internal.repo, None, None);let log = repo::get_log(&internal.repo, None, None, None); - replacement in libflorescence/src/repo/test.rs at line 110
let log = repo::get_log(&internal.repo, None, None);let log = repo::get_log(&internal.repo, None, None, None); - replacement in libflorescence/src/repo/test.rs at line 196
let mut log = repo::get_log(&internal.repo, None, None);let mut log = repo::get_log(&internal.repo, None, None, None); - replacement in libflorescence/src/repo/test.rs at line 203
let mut log = repo::get_log(&internal.repo, None, Some(limit));let mut log = repo::get_log(&internal.repo, None, None, Some(limit)); - replacement in libflorescence/src/repo/test.rs at line 208
let mut log = repo::get_log(&internal.repo, Some(offset), None);let mut log = repo::get_log(&internal.repo, None, Some(offset), None); - replacement in libflorescence/src/diff.rs at line 1
#[derive(Debug, Default)]pub struct State {pub selected_sections: Vec<usize>,pub expanded_unchanged_sections: Vec<usize>,pub collapsed_changed_sections: Vec<usize>,use std::borrow::Cow;#[derive(Debug)]pub enum FileContent<'a> {Decoded(Cow<'a, str>),UnknownEncoding, - edit in inflorescence_view/src/lib.rs at line 3
pub mod selection; - edit in inflorescence_view/src/diff.rs at line 1
use iced_expl_widget::nav_scrollable; - replacement in inflorescence_view/src/diff.rs at line 2
pub use libflorescence::diff::{pub use inflorescence_model::diff::{ - replacement in inflorescence_view/src/diff.rs at line 4[36.832]→[64.26:101](∅→∅),[64.101]→[36.907:928](∅→∅),[50.234]→[36.907:928](∅→∅),[36.907]→[36.907:928](∅→∅)
DiffWithoutContents, File, Lines, Section, State, UndecodableContents,UndecodableFile,DiffWithoutContents, File, FileAndState, Lines, Section, State,UndecodableContents, UndecodableFile, - replacement in inflorescence_view/src/diff.rs at line 8
use std::cmp;use crate::{el, theme, Theme};use iced_expl_widget::nav_scrollable; - replacement in inflorescence_view/src/diff.rs at line 14
use crate::{el, theme, Theme};use std::cmp; - replacement in inflorescence_view/src/app.rs at line 6
use crate::{diff, el, selection, theme, Theme};use crate::{diff, el, theme, Theme}; - edit in inflorescence_view/src/app.rs at line 8
use inflorescence_model::{get_entire_log_diffs_nav, get_entire_log_files_nav, get_files_diffs_nav,get_status_log_diffs_nav, get_status_log_files_nav, selection, Log,ReadyState, RecordMsg, SubState,}; - replacement in inflorescence_view/src/app.rs at line 14
use libflorescence::repo;use libflorescence::{file, repo}; - edit in inflorescence_view/src/app.rs at line 28[48.494]→[48.494:495](∅→∅),[48.495]→[32.12753:12793](∅→∅),[32.12753]→[32.12753:12793](∅→∅),[32.12793]→[48.496:529](∅→∅),[48.529]→[32.12793:12822](∅→∅),[32.12793]→[32.12793:12822](∅→∅),[32.12822]→[62.997:1029](∅→∅),[32.12896]→[32.12896:12939](∅→∅),[32.12939]→[52.318:415](∅→∅),[52.415]→[69.3061:3175](∅→∅),[69.3175]→[73.758:820](∅→∅),[52.481]→[32.12996:12999](∅→∅),[51.553]→[32.12996:12999](∅→∅),[73.820]→[32.12996:12999](∅→∅),[64.1133]→[32.12996:12999](∅→∅),[69.3175]→[32.12996:12999](∅→∅),[32.12996]→[32.12996:12999](∅→∅),[32.12999]→[62.1030:1166](∅→∅),[62.1166]→[73.821:871](∅→∅),[73.871]→[75.2492:2573](∅→∅),[75.2573]→[73.872:931](∅→∅),[62.1252]→[73.872:931](∅→∅),[73.931]→[69.3236:3269](∅→∅),[70.2877]→[69.3236:3269](∅→∅),[69.3236]→[69.3236:3269](∅→∅),[69.3269]→[73.932:991](∅→∅),[73.991]→[70.2938:2979](∅→∅),[70.2938]→[70.2938:2979](∅→∅),[70.2979]→[73.992:1088](∅→∅),[73.1088]→[64.1134:1154](∅→∅),[70.2979]→[64.1134:1154](∅→∅),[69.3269]→[64.1134:1154](∅→∅),[62.1252]→[64.1134:1154](∅→∅),[64.1154]→[69.3270:3301](∅→∅),[69.3301]→[64.1179:1372](∅→∅),[64.1179]→[64.1179:1372](∅→∅),[64.1372]→[67.313:352](∅→∅),[67.352]→[64.1372:1516](∅→∅),[64.1372]→[64.1372:1516](∅→∅),[64.1516]→[75.2574:2622](∅→∅),[75.2622]→[64.1556:1563](∅→∅),[64.1556]→[64.1556:1563](∅→∅),[64.1563]→[62.1252:1255](∅→∅),[62.1252]→[62.1252:1255](∅→∅),[62.1255]→[64.1564:1826](∅→∅),[64.1826]→[75.2623:2663](∅→∅),[75.2663]→[64.1858:1861](∅→∅),[64.1858]→[64.1858:1861](∅→∅),[64.1861]→[73.1089:1200](∅→∅),[73.1200]→[75.2664:2705](∅→∅),[75.2705]→[73.1233:1281](∅→∅),[73.1233]→[73.1233:1281](∅→∅),[73.1281]→[75.2706:2747](∅→∅),[75.2747]→[73.1321:1511](∅→∅),[73.1321]→[73.1321:1511](∅→∅),[73.1511]→[75.2748:2796](∅→∅),[75.2796]→[73.1551:1554](∅→∅),[73.1551]→[73.1551:1554](∅→∅),[62.1255]→[32.12999:13038](∅→∅),[73.1554]→[32.12999:13038](∅→∅),[64.1861]→[32.12999:13038](∅→∅),[32.12999]→[32.12999:13038](∅→∅),[32.13038]→[69.3302:3358](∅→∅),[69.3358]→[32.13063:13088](∅→∅),[32.13063]→[32.13063:13088](∅→∅),[62.1297]→[32.13088:13128](∅→∅),[64.1953]→[32.13088:13128](∅→∅),[32.13088]→[32.13088:13128](∅→∅),[32.13128]→[67.353:373](∅→∅),[67.373]→[32.13145:13161](∅→∅),[32.13145]→[32.13145:13161](∅→∅),[32.13161]→[67.374:393](∅→∅),[32.13379]→[67.394:450](∅→∅),[67.450]→[69.3359:3404](∅→∅),[69.3404]→[76.28:47](∅→∅),[76.47]→[70.2980:3026](∅→∅),[69.3423]→[70.2980:3026](∅→∅),[70.3026]→[68.28:45](∅→∅),[69.3423]→[68.28:45](∅→∅),[67.450]→[68.28:45](∅→∅),[68.45]→[75.2797:2816](∅→∅),[68.45]→[32.15355:15357](∅→∅),[67.450]→[32.15355:15357](∅→∅),[73.1773]→[32.15355:15357](∅→∅),[75.2816]→[32.15355:15357](∅→∅),[32.15355]→[32.15355:15357](∅→∅)
#[derive(Debug)]pub struct State<'a> {pub window_size: iced::Size,pub repo_path: &'a Path,pub repo: Option<&'a Repo>,pub record_msg: Option<&'a RecordMsg>,/// Diff and state of selected log's file (untracked, changed or from a/// log), if anypub status_selection: Option<StatusSelection<'a>>,pub channel_selection: Option<&'a selection::Channel>,pub entire_log_selection: Option<EntireLogSelection<'a>>,}#[derive(Debug)]pub struct Repo {pub state: repo::State,/// Scrollable status view contains the overview of untracked files,/// changed files and most recent log changes// pub status_nav: NavScrollable,pub status_nav: nav_scrollable::State,/// `true` when we're selecting a channel to switch topub switching_channel: bool,/// `Some` when we're selecting a channel to switch topub forking_channel: Option<String>,/// `Some` when looking at the entire log of changespub entire_log: Option<EntireLog>,}#[derive(Debug)]pub enum StatusSelection<'a> {UntrackedFile {ix: usize,path: &'a str,diff: Option<Diff<'a>>,},ChangedFile {ix: usize,path: &'a str,diff: Option<Diff<'a>>,is_added_from_untracked: bool,},Log {ix: usize,hash: repo::ChangeHash,message: &'a str,file: Option<LogChangeFileSelection<'a>>,nav: Option<&'a nav_scrollable::State>,},}#[derive(Debug)]pub struct LogChangeFileSelection<'a> {pub ix: usize,pub path: &'a str,pub diff: Option<Diff<'a>>,}#[derive(Debug)]pub struct Diff<'a> {pub is_selected: bool,pub file: &'a diff::File,pub state: &'a diff::State,pub nav: &'a nav_scrollable::State,}#[derive(Debug)]pub enum EntireLog {Loading,LoadingButNotViewing,Got {log: repo::Log,nav: Box<nav_scrollable::State>,},NotViewing {log: repo::Log,nav: Box<nav_scrollable::State>,},}#[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 nav_scrollable::State>,}#[derive(Debug, Clone)]pub enum Msg {Confirm,Cancel,Selection(selection::Msg),ToRepo(repo::MsgIn),EditRecordMsg(text_editor::Action),PostponeRecord,SaveRecord,DiscardRecord,AddUntrackedFile,RmAddedFile,StartRecord,/// Show a list of channels to switch toSelectChannel,ForkChannel,ForkChannelName(String),RefreshRepo,ShowEntireLog,} - replacement in inflorescence_view/src/app.rs at line 29[32.15358]→[32.15358:15467](∅→∅),[32.15467]→[52.482:499](∅→∅),[52.499]→[32.15487:15509](∅→∅),[32.15487]→[32.15487:15509](∅→∅)
#[derive(Debug)]pub enum RecordMsg {Typing(text_editor::Content),Canceled { old_msg: String },}pub fn view<'a>(state: State<'a>,pub fn view<'a, F>(state: &'a inflorescence_model::State,get_diff: F, - replacement in inflorescence_view/src/app.rs at line 33
) -> Element<'a, Msg, Theme> {let State {) -> Element<'a, Msg, Theme>whereF: Fn(file::IdHash) -> Option<&'a diff::File>,{let inflorescence_model::State { - replacement in inflorescence_view/src/app.rs at line 40[64.2231]→[64.2231:2245](∅→∅),[64.2261]→[64.2261:2281](∅→∅),[64.2281]→[69.3424:3477](∅→∅),[69.3477]→[73.1774:1804](∅→∅)
repo,record_msg,status_selection,channel_selection,entire_log_selection,sub, - replacement in inflorescence_view/src/app.rs at line 42[64.2315]→[64.2315:2358](∅→∅),[64.2358]→[69.3478:3648](∅→∅),[69.3648]→[73.1805:1839](∅→∅),[73.1839]→[69.3648:3658](∅→∅),[69.3648]→[69.3648:3658](∅→∅),[67.522]→[43.75:124](∅→∅),[52.564]→[43.75:124](∅→∅),[64.2437]→[43.75:124](∅→∅),[69.3658]→[43.75:124](∅→∅),[43.75]→[43.75:124](∅→∅)
let inner = if let Some(repo) = repo {view_repo(window_size,repo_path,repo,record_msg,status_selection,channel_selection,entire_log_selection,)} else {el(text("Loading repo..."))let inner = match sub {SubState::Loading { .. } => el(text("Loading...")),SubState::SelectingId {user_ids: _,user_selection_ix: _,user_selection_nav: _,repo: _,} => todo!(),SubState::Ready(state) => {view_ready(*window_size, repo_path, state, get_diff)} - edit in inflorescence_view/src/app.rs at line 55
- replacement in inflorescence_view/src/app.rs at line 63
fn view_repo<'a>(fn view_ready<'a, F>( - edit in inflorescence_view/src/app.rs at line 65
// TODO show path - replacement in inflorescence_view/src/app.rs at line 66[64.2533]→[64.2533:2553](∅→∅),[64.2584]→[64.2584:2623](∅→∅),[64.2623]→[69.3731:3837](∅→∅),[69.3837]→[73.1840:1898](∅→∅),[73.1898]→[64.2661:2692](∅→∅),[69.3837]→[64.2661:2692](∅→∅),[64.2661]→[64.2661:2692](∅→∅),[64.2692]→[62.1429:1444](∅→∅),[62.1429]→[62.1429:1444](∅→∅),[62.1444]→[64.2693:2708](∅→∅)
repo: &'a Repo,record_msg: Option<&'a RecordMsg>,status_selection: Option<StatusSelection<'a>>,channel_selection: Option<&'a selection::Channel>,entire_log_selection: Option<EntireLogSelection<'a>>,) -> Element<'a, Msg, Theme> {let Repo {state:state: &'a ReadyState,get_diff: F,) -> Element<'a, Msg, Theme>whereF: Fn(file::IdHash) -> Option<&'a diff::File>,{let ReadyState {user_id: _,repo: - replacement in inflorescence_view/src/app.rs at line 81
log,short_log, - replacement in inflorescence_view/src/app.rs at line 83[64.2885]→[62.1465:1485](∅→∅),[62.1465]→[62.1465:1485](∅→∅),[62.1485]→[69.3871:3898](∅→∅),[69.3898]→[70.3027:3052](∅→∅),[70.3052]→[73.1899:1919](∅→∅),[73.1919]→[62.1485:1499](∅→∅),[70.3052]→[62.1485:1499](∅→∅),[69.3898]→[62.1485:1499](∅→∅),[62.1485]→[62.1485:1499](∅→∅)
status_nav,switching_channel,forking_channel,entire_log,} = repo;selection,navigation,record_msg,forking_channel_name,logs,} = state;let selection = selection::unify(selection); - replacement in inflorescence_view/src/app.rs at line 107
let is_selected = matches!(status_selection.as_ref() ,Some(StatusSelection::UntrackedFile{ ix: selected_ix, .. }) if &ix == selected_ixlet is_selected = matches!(selection,selection::Unified::Status(Some(selection::Status::UntrackedFile{ ix: selected_ix, .. })) if &ix == selected_ix - replacement in inflorescence_view/src/app.rs at line 126
let is_selected = matches!(status_selection.as_ref(),Some(StatusSelection::ChangedFile{ ix: selected_ix, .. }) if &ix == selected_ixlet is_selected = matches!(selection,selection::Unified::Status(Some(selection::Status::ChangedFile{ ix: selected_ix, .. })) if &ix == selected_ix - replacement in inflorescence_view/src/app.rs at line 144
log.iter().enumerate().map(short_log.iter().enumerate().map( - replacement in inflorescence_view/src/app.rs at line 149
let is_selected = matches!(status_selection.as_ref(),Some(StatusSelection::Log { ix: selected_ix, .. }) if &ix == selected_ixlet is_selected = matches!(selection,selection::Unified::Status(Some(selection::Status::LogChange(selection::LogChange{ ix: selected_ix, .. }))) if &ix == selected_ix - replacement in inflorescence_view/src/app.rs at line 174[32.18331]→[73.2452:2517](∅→∅),[73.2517]→[69.5226:5298](∅→∅),[69.5226]→[69.5226:5298](∅→∅),[54.6393]→[64.4239:4415](∅→∅),[64.4415]→[75.2817:2883](∅→∅),[75.2883]→[52.771:824](∅→∅),[64.4549]→[52.771:824](∅→∅),[54.6634]→[52.771:824](∅→∅),[43.2253]→[52.771:824](∅→∅),[52.824]→[43.2334:2349](∅→∅),[43.2334]→[43.2334:2349](∅→∅)
let selection_details = || match status_selection.as_ref() {Some(StatusSelection::UntrackedFile { ix: _, path, diff }) => {let diffs = match diff {Some(Diff {is_selected,file,state,nav,}) => diff::view(state, nav, file, *is_selected),None => el(text("Loading diff...")),};let selection_details = || {if let selection::Unified::Status(selection) = selection {match selection {Some(selection::Status::UntrackedFile {ix: _,path,diff_selected,}) => {let id_hash =file::id_parts_hash(path, file::Kind::Untracked);let diff = get_diff(id_hash);let state = navigation.files_diffs.diffs.get(&id_hash);let nav = get_files_diffs_nav(navigation, id_hash);let diffs = match diff.zip(state).zip(nav) {Some(((file, state), nav)) => {diff::view(state, nav, file, *diff_selected)}None => el(text("Loading diff...")),}; - replacement in inflorescence_view/src/app.rs at line 194[50.1827]→[43.2349:2451](∅→∅),[43.2349]→[43.2349:2451](∅→∅),[43.2451]→[50.1828:1851](∅→∅),[50.1851]→[43.2490:2546](∅→∅),[43.2490]→[43.2490:2546](∅→∅),[43.2546]→[69.5299:5343](∅→∅),[69.5343]→[67.1190:1301](∅→∅),[67.1190]→[67.1190:1301](∅→∅),[54.6835]→[64.4615:4713](∅→∅)
el(column([view_diff_header(format!("Untracked file {path} contents:")),diffs,]).spacing(SPACING))}Some(StatusSelection::ChangedFile {path,ix: _,diff,is_added_from_untracked: _,}) => {let diffs = match diff {Some(Diff {is_selected,el(column([view_diff_header(format!("Untracked file {path} contents:")),diffs,]).spacing(SPACING))}Some(selection::Status::ChangedFile {path,ix: _,diff_selected,}) => {let id_hash =file::id_parts_hash(path, file::Kind::Changed);let diff = get_diff(id_hash);let state = navigation.files_diffs.diffs.get(&id_hash);let nav = get_files_diffs_nav(navigation, id_hash);let diffs = match diff.zip(state).zip(nav) {Some(((file, state), nav)) => {diff::view(state, nav, file, *diff_selected)}None => el(text("Loading diff...")),};el(column([view_diff_header(format!("Changed file {path} diff:")),diffs,]).spacing(SPACING))}Some(selection::Status::LogChange(selection::LogChange {ix,hash,message, - replacement in inflorescence_view/src/app.rs at line 230[64.4739]→[64.4739:4791](∅→∅),[64.4791]→[75.2884:2950](∅→∅),[75.2950]→[52.980:1033](∅→∅),[64.4925]→[52.980:1033](∅→∅),[54.7076]→[52.980:1033](∅→∅),[43.3194]→[52.980:1033](∅→∅),[52.1033]→[43.3275:3290](∅→∅),[43.3275]→[43.3275:3290](∅→∅),[43.3290]→[32.18457:18481](∅→∅),[32.18457]→[32.18457:18481](∅→∅),[32.18481]→[43.3291:3363](∅→∅),[43.3363]→[50.1852:1875](∅→∅),[50.1875]→[43.3402:3458](∅→∅),[43.3402]→[43.3402:3458](∅→∅),[43.3458]→[69.5344:5380](∅→∅),[64.4956]→[43.3502:3557](∅→∅),[69.5380]→[43.3502:3557](∅→∅),[43.3502]→[43.3502:3557](∅→∅),[43.3557]→[64.4957:4974](∅→∅),[64.4974]→[43.3579:3613](∅→∅),[43.3579]→[43.3579:3613](∅→∅),[43.3613]→[64.4975:5022](∅→∅)
state,nav,}) => diff::view(state, nav, file, *is_selected),None => el(text("Loading diff...")),};el(column([view_diff_header(format!("Changed file {path} diff:")),diffs,]).spacing(SPACING))}Some(StatusSelection::Log {ix,hash,message,nav,file,}) => {let entry = log.get(*ix).unwrap();})) => {let entry = short_log.get(*ix).unwrap(); - replacement in inflorescence_view/src/app.rs at line 233
let short_hash = display_short_hash(hash);let short_hash = display_short_hash(hash); - replacement in inflorescence_view/src/app.rs at line 235
let view = match nav {Some(nav) => {let change_selected = match file.as_ref() {Some(LogChangeFileSelection { diff, .. }) => !diff.as_ref().map(|diff| diff.is_selected).unwrap_or_default(),_ => false,let nav = get_status_log_files_nav(navigation, *hash);let view = match nav {Some(nav) => {let change_selected = match file.as_ref() {Some(selection::LogChangeFileSelection {ix: _,path: _,diff_selected,}) => *diff_selected,_ => false,};let files = entry.file_paths.iter().enumerate().map(|(ix, path)| {let is_selected = matches!(file, Some(selection::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)))});el(nav_scrollable(nav, files).class(if change_selected {theme::Scrollable::Selected} else {theme::Scrollable::Normal}).width(Length::Fill).height(Length::Fill))}None => el(text("Loading...")), - replacement in inflorescence_view/src/app.rs at line 265[73.2863]→[64.5149:5236](∅→∅),[64.5149]→[64.5149:5236](∅→∅),[64.5236]→[73.2864:3298](∅→∅),[73.3298]→[75.2951:3315](∅→∅)
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)))});el(nav_scrollable(nav, files).class(if change_selected {theme::Scrollable::Selected} else {theme::Scrollable::Normal}).width(Length::Fill).height(Length::Fill))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)) - replacement in inflorescence_view/src/app.rs at line 275[64.5742]→[64.5742:5806](∅→∅),[64.5806]→[43.3826:3918](∅→∅),[32.22072]→[43.3826:3918](∅→∅),[43.3918]→[64.5807:5876](∅→∅),[61.278]→[43.3953:4017](∅→∅),[64.5876]→[43.3953:4017](∅→∅),[43.3953]→[43.3953:4017](∅→∅),[43.4017]→[64.5877:5899](∅→∅),[48.597]→[32.23465:23480](∅→∅),[43.4064]→[32.23465:23480](∅→∅),[64.5899]→[32.23465:23480](∅→∅),[32.23465]→[32.23465:23480](∅→∅),[32.23480]→[48.598:665](∅→∅),[48.665]→[43.4065:4096](∅→∅),[32.23480]→[43.4065:4096](∅→∅)
None => el(text("Loading...")),};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([])),}} else {el(row([])) - edit in inflorescence_view/src/app.rs at line 280
None => el(row([])), - replacement in inflorescence_view/src/app.rs at line 291
} else if let Some(EntireLogSelection { file, .. }) =entire_log_selection.as_ref()} else if let selection::Unified::EntireLog(Some(selection::LogChange {file,..})) = selection - replacement in inflorescence_view/src/app.rs at line 301
} else if let Some(selection) = status_selection.as_ref() {} else if let selection::Unified::Status(Some(selection)) = selection { - replacement in inflorescence_view/src/app.rs at line 303
StatusSelection::UntrackedFile { .. }| StatusSelection::ChangedFile { .. }| StatusSelection::Log { file: None, .. } => 1,StatusSelection::Log { file: Some(_), .. } => 2,selection::Status::UntrackedFile { .. }| selection::Status::ChangedFile { .. }| selection::Status::LogChange(selection::LogChange {file: None,..}) => 1,selection::Status::LogChange(selection::LogChange {file: Some(_),..}) => 2, - replacement in inflorescence_view/src/app.rs at line 336[62.2065]→[73.4080:4143](∅→∅),[73.4143]→[69.5853:5920](∅→∅),[69.5853]→[69.5853:5920](∅→∅),[69.5920]→[64.6435:6533](∅→∅),[64.6435]→[64.6435:6533](∅→∅),[64.6533]→[69.5921:5986](∅→∅),[69.5986]→[64.6592:6690](∅→∅),[64.6592]→[64.6592:6690](∅→∅),[64.6690]→[69.5987:6054](∅→∅),[69.6054]→[64.6751:6780](∅→∅),[64.6751]→[64.6751:6780](∅→∅)
let status_selected = || match status_selection.as_ref() {Some(StatusSelection::UntrackedFile { diff, .. }) => !diff.as_ref().map(|diff| diff.is_selected).unwrap_or_default(),Some(StatusSelection::ChangedFile { diff, .. }) => !diff.as_ref().map(|diff| diff.is_selected).unwrap_or_default(),Some(StatusSelection::Log { file, .. }) => file.is_none(),None => true,};let status_selected =|| match selection {selection::Unified::Status(Some(selection::Status::UntrackedFile { diff_selected, .. },)) => !diff_selected,selection::Unified::Status(Some(selection::Status::ChangedFile { diff_selected, .. },)) => !diff_selected,selection::Unified::Status(Some(selection::Status::LogChange(selection::LogChange { file, .. },))) => file.is_none(),selection::Unified::Status(None) => true,selection::Unified::Channel(_)| selection::Unified::EntireLog(_) => false,}; - replacement in inflorescence_view/src/app.rs at line 355
el(nav_scrollable(status_nav, status_nav_children()).class(if status_selected() {theme::Scrollable::Selected} else {theme::Scrollable::Normal}).width(Length::Fill).height(Length::Fill)),el(nav_scrollable(&navigation.status_nav, status_nav_children()).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 391[73.5273]→[73.5273:5333](∅→∅),[73.5333]→[69.6224:6260](∅→∅),[69.6224]→[69.6224:6260](∅→∅),[69.6260]→[52.1134:1195](∅→∅),[64.7034]→[52.1134:1195](∅→∅),[52.1134]→[52.1134:1195](∅→∅),[52.1195]→[64.7035:7125](∅→∅),[64.7125]→[52.1267:1474](∅→∅),[54.7257]→[52.1267:1474](∅→∅),[52.1267]→[52.1267:1474](∅→∅),[52.1474]→[64.7126:7314](∅→∅),[64.7314]→[75.3643:3713](∅→∅),[75.3713]→[52.1765:1821](∅→∅),[52.1765]→[52.1765:1821](∅→∅)
let status_col_2 = || match status_selection.as_ref() {Some(StatusSelection::Log {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,}) => diff::view(state, nav, file, *is_selected),None => el(text("Loading diff..")),let status_col_2 = || match selection {selection::Unified::Status(Some(selection::Status::LogChange(selection::LogChange {ix: _,hash,message: _,file:Some(selection::LogChangeFileSelection {ix: _,path,diff_selected,}),},))) => {let id_hash = file::log_id_parts_hash(*hash, path);let state = navigation.log_diffs.diffs.get(&id_hash);let nav = get_status_log_diffs_nav(navigation, id_hash);Some(el(column([el(column([view_diff_header(format!("{path} changes in {}:",display_short_hash(hash))),match state.zip(nav) {Some((diff::FileAndState { file, state }, nav)) => {diff::view(state, nav, file, *diff_selected)}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([])) - replacement in inflorescence_view/src/app.rs at line 435[54.7411]→[52.1822:1983](∅→∅),[48.3213]→[52.1822:1983](∅→∅),[52.1983]→[73.5334:5461](∅→∅),[73.5461]→[69.6261:6371](∅→∅),[52.2132]→[69.6261:6371](∅→∅),[69.6371]→[55.628:648](∅→∅),[55.628]→[55.628:648](∅→∅),[55.648]→[52.2191:2354](∅→∅),[52.2191]→[52.2191:2354](∅→∅),[51.2106]→[32.24109:24110](∅→∅),[52.2354]→[32.24109:24110](∅→∅),[48.3661]→[32.24109:24110](∅→∅),[43.5649]→[32.24109:24110](∅→∅),[32.24109]→[32.24109:24110](∅→∅),[32.24110]→[69.6372:6520](∅→∅),[69.6520]→[52.2515:2539](∅→∅),[64.7831]→[52.2515:2539](∅→∅),[52.2515]→[52.2515:2539](∅→∅)
.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(StatusSelection::UntrackedFile { .. })| Some(StatusSelection::ChangedFile { .. })| Some(StatusSelection::Log { .. })| None => None,.width(Length::Fill).height(Length::Fill).spacing(SPACING)))}_ => None, - replacement in inflorescence_view/src/app.rs at line 442
let entire_log_selected = || match entire_log_selection.as_ref() {Some(EntireLogSelection { file, .. }) => file.is_none(),None => false,let entire_log_selected = || match selection {selection::Unified::EntireLog(log_change) => match log_change {Some(selection::LogChange { file, .. }) => file.is_none(),None => true,},_ => false, - replacement in inflorescence_view/src/app.rs at line 449
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(),let entire_log_change_selected = || match selection {selection::Unified::EntireLog(log_change) => match log_change {Some(selection::LogChange {file:Some(selection::LogChangeFileSelection {diff_selected, ..}),..}) => !*diff_selected,_ => false,}, - edit in inflorescence_view/src/app.rs at line 462
let other_channels_selected = || match selection {selection::Unified::Channel(channel) => match channel {Some(selection::Channel { log, .. }) => log.is_none(),None => true,},_ => false,}; - replacement in inflorescence_view/src/app.rs at line 471
let Some(EntireLog::Got { log, nav }) = entire_log.as_ref() else {let Some(Log::Loaded { log }) = logs.entire_log.as_ref() else { - replacement in inflorescence_view/src/app.rs at line 475
let is_selected = matches!(entire_log_selection.as_ref(),Some(EntireLogSelection { ix: selected_ix, .. }) if &ix == selected_ixlet is_selected = matches!(selection,selection::Unified::EntireLog(Some(selection::LogChange{ ix: selected_ix, .. })) if &ix == selected_ix - replacement in inflorescence_view/src/app.rs at line 482
let selected_ix = entire_log_selection.as_ref().map(|EntireLogSelection { ix, .. }| len - *ix);let selected_ix = match selection {selection::Unified::EntireLog(Some(selection::LogChange {ix,..})) => Some(len - *ix),_ => None,}; - replacement in inflorescence_view/src/app.rs at line 497
el(nav_scrollable(nav, entries)el(nav_scrollable(&navigation.entire_log_nav, entries) - replacement in inflorescence_view/src/app.rs at line 511
let files_view = match entire_log_selection.as_ref() {Some(EntireLogSelection {let files_view = match selection {selection::Unified::EntireLog(Some(selection::LogChange { - replacement in inflorescence_view/src/app.rs at line 517
nav,}) => {})) => { - replacement in inflorescence_view/src/app.rs at line 519
let view = match (nav.as_ref(), entire_log.as_ref()) {(Some(nav), Some(EntireLog::Got { log, nav: _ })) => {let nav = get_entire_log_files_nav(navigation, *hash);let view = match nav.as_ref().zip(logs.entire_log.as_ref()) {Some((nav, Log::Loaded { log })) => { - replacement in inflorescence_view/src/app.rs at line 524
let is_selected = matches!(file, Some(LogChangeFileSelection{ path: selected_path, .. }) if selected_path == path);let is_selected = matches!(file, Some(selection::LogChangeFileSelection{ path: selected_path, .. }) if selected_path == path); - replacement in inflorescence_view/src/app.rs at line 543
el(text(*message).shaping(text::Shaping::Advanced)),el(text(message).shaping(text::Shaping::Advanced)), - replacement in inflorescence_view/src/app.rs at line 551
None => el(row([])),_ => el(row([])), - replacement in inflorescence_view/src/app.rs at line 573
let entire_log_col_2 = || match entire_log_selection.as_ref() {Some(EntireLogSelection {let entire_log_col_2 = || match selection {selection::Unified::EntireLog(Some(selection::LogChange { - replacement in inflorescence_view/src/app.rs at line 578[73.10080]→[73.10080:10565](∅→∅),[73.10565]→[75.4213:4283](∅→∅),[75.4283]→[73.10973:11029](∅→∅),[73.10973]→[73.10973:11029](∅→∅)
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,}) => diff::view(state, nav, file, *is_selected),None => el(text("Loading diff..")),file:Some(selection::LogChangeFileSelection {ix: _,path,diff_selected,}),})) => {let id_hash = file::log_id_parts_hash(*hash, path);let state = navigation.log_diffs.diffs.get(&id_hash);let nav = get_entire_log_diffs_nav(navigation, id_hash);Some(el(column([el(column([view_diff_header(format!("{path} changes in {}:",display_short_hash(hash))),match state.zip(nav) {Some((diff::FileAndState { file, state }, nav)) => {diff::view(state, nav, file, *diff_selected)}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([])) - replacement in inflorescence_view/src/app.rs at line 615
.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,.width(Length::Fill).height(Length::Fill).spacing(SPACING)))}_ => None, - replacement in inflorescence_view/src/app.rs at line 624
let is_selected = matches!(channel_selection,Some(selection::Channel{ ix: selected_ix, .. }) if &ix == selected_ixlet is_selected = matches!(selection,selection::Unified::Channel(Some(selection::Channel{ ix: selected_ix, .. })) if &ix == selected_ix - replacement in inflorescence_view/src/app.rs at line 633[69.6931]→[69.6931:7009](∅→∅),[69.7009]→[70.3053:3202](∅→∅),[70.3202]→[69.7083:7246](∅→∅),[69.7083]→[69.7083:7246](∅→∅),[69.7246]→[70.3203:3286](∅→∅),[70.3286]→[69.7262:7272](∅→∅),[69.7262]→[69.7262:7272](∅→∅),[69.7272]→[73.11710:12199](∅→∅)
let main = if *switching_channel {if other_channels.is_empty() {el(column([el(text(format!("Current channel: {channel}")))]).width(Length::Fill).height(Length::Fill))} else {el(column([el(text(format!("Current channel: {channel}. Switch to:"))),el(column(view_channels())),]).width(Length::Fill).height(Length::Fill))}} 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]let main = match selection {selection::Unified::Status(_) => {if let Some(status_col_2) = status_col_2() {let cols = [status_col_0(), status_col_1(), status_col_2] - replacement in inflorescence_view/src/app.rs at line 639
el(row(cols).spacing(SPACING)el(row(cols).spacing(SPACING).width(Length::Fill).height(Length::Fill))} else {let cols = [status_col_0(), status_col_1()];el(row(cols).spacing(SPACING).width(Length::Fill).height(Length::Fill))}}selection::Unified::Channel(_) => {if other_channels.is_empty() {el(column([el(text(format!("Current channel: {channel}")))]).width(Length::Fill).height(Length::Fill))} else {let nav = nav_scrollable(&navigation.other_channels_nav,view_channels(),).class(if other_channels_selected() {theme::Scrollable::Selected} else {theme::Scrollable::Normal}) - replacement in inflorescence_view/src/app.rs at line 667
.height(Length::Fill))} else {let cols = [entire_log_col_0(), entire_log_col_1()];el(row(cols).spacing(SPACING).height(Length::Fill);el(column([el(text(format!("Current channel: {channel}"))),el(nav),]) - edit in inflorescence_view/src/app.rs at line 674
} - replacement in inflorescence_view/src/app.rs at line 676
} 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);el(row(cols).spacing(SPACING)selection::Unified::EntireLog(_) => match logs.entire_log.as_ref() {None | Some(Log::Loading) => el(column([view_repo_info(),el(text("Entire log")),el(text("Loading...")),]) - replacement in inflorescence_view/src/app.rs at line 683[67.1804]→[67.1804:1839](∅→∅),[67.1839]→[48.3998:4011](∅→∅),[48.3998]→[48.3998:4011](∅→∅),[48.4011]→[73.12814:12867](∅→∅),[73.12867]→[67.1840:1959](∅→∅),[48.4046]→[67.1840:1959](∅→∅)
.height(Length::Fill))} else {let cols = [status_col_0(), status_col_1()];el(row(cols).spacing(SPACING).width(Length::Fill).height(Length::Fill)).height(Length::Fill)),Some(Log::Loaded { .. }) => {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))}}}, - replacement in inflorescence_view/src/app.rs at line 709
let actions_inner = if let Some(forking_channel) = forking_channel {let actions_inner = if let Some(forking_channel) = forking_channel_name { - replacement in inflorescence_view/src/app.rs at line 716[70.3621]→[70.3621:3691](∅→∅),[70.3691]→[69.7364:7451](∅→∅),[69.7364]→[69.7364:7451](∅→∅),[69.7451]→[73.12868:12898](∅→∅),[73.12898]→[70.3692:3701](∅→∅),[69.7451]→[70.3692:3701](∅→∅)
let actions_inner = actions_inner.push(view_actions(action_state(repo,record_msg,status_selection,channel_selection,entire_log_selection,)));let actions_inner = actions_inner.push(view_actions(action_state(state))); - edit in inflorescence_view/src/app.rs at line 724
}#[derive(Debug, Clone)]pub enum Msg {Confirm,Cancel,Selection(selection::Msg),ToRepo(repo::MsgIn),EditRecordMsg(text_editor::Action),PostponeRecord,SaveRecord,DiscardRecord,AddUntrackedFile,RmAddedFile,StartRecord,/// Show a list of channels to switch toSelectChannel,ForkChannel,ForkChannelName(String),RefreshRepo,ShowEntireLog, - replacement in inflorescence_view/src/app.rs at line 818
let cant_confirm_already_exists =|| el(action_button_inner("Enter", "already exists"));let cant_confirm =|label: &'static str| el(action_button_inner("Enter", label)); - replacement in inflorescence_view/src/app.rs at line 875
ActionState::SwitchingChannel(state) => match state {ActionState::SelectingChannel(state) => match state { - edit in inflorescence_view/src/app.rs at line 882
let row = add_if(!can_switch,|| cant_confirm("cannot switch with unrecorded changes"),row,); - replacement in inflorescence_view/src/app.rs at line 894
let row = add_if(!unique, cant_confirm_already_exists, row);let row =add_if(!unique, || cant_confirm("channel already exists"), row); - replacement in inflorescence_view/src/app.rs at line 957
SwitchingChannel(SwitchingChannelState),SelectingChannel(SwitchingChannelState), - replacement in inflorescence_view/src/app.rs at line 987[67.6142]→[67.6142:6222](∅→∅),[67.6222]→[69.9241:9347](∅→∅),[69.9347]→[73.14120:14178](∅→∅),[69.9347]→[67.6260:6279](∅→∅),[73.14178]→[67.6260:6279](∅→∅),[67.6260]→[67.6260:6279](∅→∅)
fn action_state<'a>(repo: &'a Repo,record_msg: Option<&'a RecordMsg>,status_selection: Option<StatusSelection<'a>>,channel_selection: Option<&'a selection::Channel>,entire_log_selection: Option<EntireLogSelection<'a>>,) -> ActionState {fn action_state<'a>(state: &'a ReadyState) -> ActionState {let ReadyState {user_id: _,repo:repo::State {dir_name: _,channel,other_channels,untracked_files: _,changed_files,short_log: _,},selection,navigation,record_msg,forking_channel_name,logs: _,} = state;let selection::State {primary,status: status_selection,channel: channel_selection,entire_log: entire_log_selection,held_key: _,} = selection; - replacement in inflorescence_view/src/app.rs at line 1018[69.9355]→[69.9355:9552](∅→∅),[69.9552]→[76.1208:1342](∅→∅),[76.1342]→[69.9605:9741](∅→∅),[69.9605]→[69.9605:9741](∅→∅),[69.9741]→[67.6425:6431](∅→∅),[67.6425]→[67.6425:6431](∅→∅),[67.6431]→[32.24508:24509](∅→∅),[32.24508]→[32.24508:24509](∅→∅),[32.24509]→[70.5471:5527](∅→∅)
if repo.switching_channel {let sub_state = if repo.state.other_channels.is_empty() {SwitchingChannelState::NoOtherChannels} else if channel_selection.is_some() {let can_switch = repo.state.changed_files.is_empty();SwitchingChannelState::SomethingSelected { can_switch }} else {SwitchingChannelState::NothingSelected};return ActionState::SwitchingChannel(sub_state);}if let Some(name) = repo.forking_channel.as_ref() {if let Some(name) = forking_channel_name.as_ref() { - replacement in inflorescence_view/src/app.rs at line 1021
let unique = !repo.state.other_channels.iter().any(|n| n == name);let unique =channel != name && !other_channels.iter().any(|n| n == name); - replacement in inflorescence_view/src/app.rs at line 1026
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::EntireLogChangeDiffmatch primary {selection::Primary::Status => {let can_record = !changed_files.is_empty();let has_other_channels = !other_channels.is_empty();match status_selection {Some(selection::Status::UntrackedFile {ix: _,path,diff_selected,}) => {let id_hash =file::id_parts_hash(path, file::Kind::Untracked);let nav = get_files_diffs_nav(navigation, id_hash);if let Some(nav) = nav {if *diff_selected {ActionState::Diff {can_record,has_other_channels,}} else {ActionState::Main {selection: MainSelection::Untracked,can_select_right:nav_scrollable::needs_scrolling(nav),can_record,has_other_channels,}} - replacement in inflorescence_view/src/app.rs at line 1056[73.14589]→[73.14589:14644](∅→∅),[73.14644]→[75.4284:4405](∅→∅),[75.4405]→[73.14827:14858](∅→∅),[73.14827]→[73.14827:14858](∅→∅)
ActionState::EntireLogChange {can_select_right: nav_scrollable::needs_scrolling(diff.nav,),ActionState::Main {selection: MainSelection::Untracked,can_select_right: false,can_record,has_other_channels, - edit in inflorescence_view/src/app.rs at line 1063
} else {ActionState::EntireLogChange {can_select_right: false,} - replacement in inflorescence_view/src/app.rs at line 1064[73.15071]→[73.15071:15130](∅→∅),[73.15130]→[75.4406:4544](∅→∅),[75.4544]→[73.15205:15238](∅→∅),[73.15205]→[73.15205:15238](∅→∅),[70.5740]→[67.6432:6491](∅→∅),[73.15238]→[67.6432:6491](∅→∅),[32.24509]→[67.6432:6491](∅→∅),[67.6491]→[76.1343:1411](∅→∅),[76.1411]→[67.6491:6492](∅→∅),[67.6491]→[67.6491:6492](∅→∅),[67.6492]→[69.9742:9817](∅→∅),[69.9817]→[67.6554:6705](∅→∅),[67.6554]→[67.6554:6705](∅→∅),[67.6705]→[76.1412:1532](∅→∅)
}None => ActionState::EntireLog {can_select_right: nav.map(nav_scrollable::needs_scrolling).unwrap_or_default(),},};}let can_record = !repo.state.changed_files.is_empty();let has_other_channels = !repo.state.other_channels.is_empty();match status_selection {Some(StatusSelection::UntrackedFile {ix: _,path: _,diff,}) => {if let Some(diff) = diff {if diff.is_selected {ActionState::Diff {can_record,has_other_channels,Some(selection::Status::ChangedFile {ix: _,path,diff_selected,}) => {let is_added_from_untracked = changed_files.get(path).map(|diffs| {diffs.iter().any(|diff| {matches!(diff, repo::ChangedFileDiff::Add)})}).unwrap_or_default();let main_selection = || {if is_added_from_untracked {MainSelection::AddedFromUntracked} else {MainSelection::Other}};let id_hash =file::id_parts_hash(path, file::Kind::Changed);let nav = get_files_diffs_nav(navigation, id_hash);if let Some(nav) = nav {if *diff_selected {ActionState::Diff {can_record,has_other_channels,}} else {ActionState::Main {selection: main_selection(),can_select_right:nav_scrollable::needs_scrolling(nav),can_record,has_other_channels,}}} else {ActionState::Main {selection: main_selection(),can_select_right: false,can_record,has_other_channels,} - replacement in inflorescence_view/src/app.rs at line 1110[76.1554]→[67.6758:6884](∅→∅),[67.6758]→[67.6758:6884](∅→∅),[67.6884]→[75.4545:4658](∅→∅),[75.4658]→[67.7055:7118](∅→∅),[67.7055]→[67.7055:7118](∅→∅),[67.7118]→[76.1555:1599](∅→∅)
} else {ActionState::Main {selection: MainSelection::Untracked,can_select_right: nav_scrollable::needs_scrolling(diff.nav,),can_record,has_other_channels,}Some(selection::Status::LogChange(selection::LogChange {ix: _,hash,message: _,file,})) => {let nav = get_status_log_files_nav(navigation, *hash);match file {Some(selection::LogChangeFileSelection {ix: _,path: _,diff_selected,}) => {if let Some(nav) = nav {if *diff_selected {ActionState::Diff {can_record,has_other_channels,}} else {ActionState::LogChange {can_select_right:nav_scrollable::needs_scrolling(nav),can_record,has_other_channels,}}} else {ActionState::LogChange {can_select_right: false,can_record,has_other_channels,}}}None => ActionState::Main {selection: MainSelection::Other,can_select_right: nav.map(nav_scrollable::needs_scrolling).unwrap_or_default(),can_record,has_other_channels,}, - replacement in inflorescence_view/src/app.rs at line 1156
} else {ActionState::Main {selection: MainSelection::Untracked,None => ActionState::Main {selection: MainSelection::Other, - replacement in inflorescence_view/src/app.rs at line 1161
}}, - replacement in inflorescence_view/src/app.rs at line 1164
Some(StatusSelection::ChangedFile {ix: _,path: _,diff,is_added_from_untracked,}) => {let main_selection = || {if is_added_from_untracked {MainSelection::AddedFromUntracked} else {MainSelection::Other}selection::Primary::Channel => {let sub_state = if other_channels.is_empty() {SwitchingChannelState::NoOtherChannels} else if channel_selection.is_some() {let can_switch = changed_files.is_empty();SwitchingChannelState::SomethingSelected { can_switch }} else {SwitchingChannelState::NothingSelected - replacement in inflorescence_view/src/app.rs at line 1173[67.7776]→[67.7776:7853](∅→∅),[67.7853]→[76.1641:1783](∅→∅),[76.1783]→[67.7906:8024](∅→∅),[67.7906]→[67.7906:8024](∅→∅),[67.8024]→[75.4659:4772](∅→∅),[75.4772]→[67.8195:8258](∅→∅),[67.8195]→[67.8195:8258](∅→∅),[67.8258]→[76.1784:1828](∅→∅)
if let Some(diff) = diff {if diff.is_selected {ActionState::Diff {can_record,has_other_channels,}} else {ActionState::Main {selection: main_selection(),can_select_right: nav_scrollable::needs_scrolling(diff.nav,),can_record,has_other_channels,return ActionState::SelectingChannel(sub_state);}selection::Primary::EntireLog => {if let Some(selection::LogChange { hash, file, .. }) =entire_log_selection{let nav = get_entire_log_files_nav(navigation, *hash);return match file {Some(selection::LogChangeFileSelection {ix: _,path: _,diff_selected,}) => {if let Some(nav) = nav {if *diff_selected {ActionState::EntireLogChangeDiff} else {ActionState::EntireLogChange {can_select_right:nav_scrollable::needs_scrolling(nav),}}} else {ActionState::EntireLogChange {can_select_right: false,}} - replacement in inflorescence_view/src/app.rs at line 1201
}None => ActionState::EntireLog {can_select_right: nav.map(nav_scrollable::needs_scrolling).unwrap_or_default(),},}; - replacement in inflorescence_view/src/app.rs at line 1208
ActionState::Main {selection: main_selection(),ActionState::EntireLog { - edit in inflorescence_view/src/app.rs at line 1210
can_record,has_other_channels, - edit in inflorescence_view/src/app.rs at line 1213[67.8523]→[69.9863:9899](∅→∅),[69.9899]→[67.8553:8896](∅→∅),[67.8553]→[67.8553:8896](∅→∅),[67.8896]→[76.1870:2028](∅→∅),[76.2028]→[67.8953:9031](∅→∅),[67.8953]→[67.8953:9031](∅→∅),[67.9031]→[75.4773:4894](∅→∅),[75.4894]→[67.9214:9285](∅→∅),[67.9214]→[67.9214:9285](∅→∅),[67.9285]→[76.2029:2077](∅→∅),[76.2077]→[67.9285:9488](∅→∅),[67.9285]→[67.9285:9488](∅→∅),[67.9488]→[76.2078:2122](∅→∅),[76.2122]→[67.9488:9631](∅→∅),[67.9488]→[67.9488:9631](∅→∅),[67.9631]→[75.4895:5033](∅→∅),[75.5033]→[67.9706:9734](∅→∅),[67.9706]→[67.9706:9734](∅→∅),[67.9734]→[76.2123:2159](∅→∅),[76.2159]→[67.9734:9902](∅→∅),[67.9734]→[67.9734:9902](∅→∅),[67.9902]→[76.2160:2192](∅→∅),[76.2192]→[67.9902:9913](∅→∅),[67.9902]→[67.9902:9913](∅→∅)
Some(StatusSelection::Log {ix: _,hash: _,message: _,file,nav,}) => match file {Some(LogChangeFileSelection {ix: _,path: _,diff,}) => {if let Some(diff) = diff {if diff.is_selected {ActionState::Diff {can_record,has_other_channels,}} else {ActionState::LogChange {can_select_right: nav_scrollable::needs_scrolling(diff.nav,),can_record,has_other_channels,}}} else {ActionState::LogChange {can_select_right: false,can_record,has_other_channels,}}}None => ActionState::Main {selection: MainSelection::Other,can_select_right: nav.map(nav_scrollable::needs_scrolling).unwrap_or_default(),can_record,has_other_channels,},},None => ActionState::Main {selection: MainSelection::Other,can_select_right: false,can_record,has_other_channels,}, - replacement in inflorescence_view/src/app/test.rs at line 62
forking_channel: None,forking_channel_name: None, - replacement in inflorescence_view/src/app/test.rs at line 106
forking_channel: None,forking_channel_name: None, - edit in inflorescence_view/Cargo.toml at line 19
[dependencies.inflorescence-model]workspace = true - file addition: inflorescence_model[2.2]
- file addition: src[0.29594]
- file move: selection.rs → selection.rs
- edit in inflorescence_model/src/selection.rs at line 27
/// Primary selection state. This is distinct from `status`, `channel`,/// `entire_log` sub-states fields to which each case corresponds, because/// they are preserved in different primary selection states.pub primary: Primary,/// Sub-selection in [`Primary::Status`] state - edit in inflorescence_model/src/selection.rs at line 33
/// Sub-selection in [`Primary::Channel`] state - edit in inflorescence_model/src/selection.rs at line 35
/// Sub-selection in [`Primary::EntireLog`] state - edit in inflorescence_model/src/selection.rs at line 37
/// Last directional key down that's not yet been releasedpub held_key: Option<HeldKey>,}#[derive(Debug)]pub enum Unified<'a> {Status(Option<&'a Status>),Channel(Option<&'a Channel>),EntireLog(Option<&'a LogChange>),}#[derive(Debug, Default, Clone, Copy)]pub enum Primary {#[default]Status,Channel,EntireLog, - edit in inflorescence_model/src/selection.rs at line 109
pub log: Option<LogChange>, - edit in inflorescence_model/src/selection.rs at line 118
}pub fn unify(state: &State) -> Unified<'_> {let State {primary,status,channel,entire_log,held_key: _,} = state;match primary {Primary::Status => Unified::Status(status.as_ref()),Primary::Channel => Unified::Channel(channel.as_ref()),Primary::EntireLog => Unified::EntireLog(entire_log.as_ref()),} - file addition: log.rs[0.29627]
use crate::diff;use iced_expl_widget::nav_scrollable;use libflorescence::{file, repo};use std::collections::HashSet;#[derive(Debug, Default)]pub struct FilesAndState {/// All the hashes in this set have `diffs` loaded.pub changes_with_loaded_diffs: HashSet<repo::ChangeHash>,/// All the diffs in this map have the change hash present in/// `change_with_loaded_diffs`pub diffs: file::LogIdMap<diff::FileAndState>,}#[derive(Debug, Default)]pub struct Navs {/// Log change's files scrollable nav. Only the currently selected nav is/// kept.pub files_nav: Option<(repo::ChangeHash, nav_scrollable::State)>,/// Log file's diffs scrollable nav. Only the currently selected nav is/// kept.pub diffs_nav: Option<(file::LogIdHash, nav_scrollable::State)>,} - file addition: lib.rs[0.29627]
pub mod diff;pub mod log;pub mod selection;use iced_expl_widget::nav_scrollable;use libflorescence::identity::Id;use libflorescence::{file, repo};use iced::widget::text_editor;use std::collections::HashMap;use std::path::PathBuf;pub fn ready(state: &State) -> Option<&ReadyState> {if let SubState::Ready(state) = &state.sub {return Some(state);}None}pub fn ready_mut(state: &mut State) -> Option<&mut ReadyState> {if let SubState::Ready(state) = &mut state.sub {return Some(state);}None}#[derive(Debug)]pub struct State {pub window_size: iced::Size,pub repo_path: PathBuf,pub sub: SubState,}#[derive(Debug)]pub enum SubState {Loading {user_ids: Vec<Id>,repo: Option<repo::State>,},SelectingId {user_ids: Vec<Id>,user_selection_ix: usize,user_selection_nav: nav_scrollable::State,repo: Option<repo::State>,},Ready(ReadyState),}#[derive(Debug)]pub struct ReadyState {pub user_id: Id,pub repo: repo::State,pub selection: selection::State,pub navigation: Navigation,pub record_msg: Option<RecordMsg>,/// `Some` when we're writing a name of the new channel forked from currentpub forking_channel_name: Option<String>,pub logs: Logs,}#[derive(Debug)]pub enum RecordMsg {Typing(text_editor::Content),Canceled { old_msg: String },}#[derive(Debug, Default)]pub struct Navigation {/// Scrollable status view contains the overview of untracked files,/// changed files and most recent log changespub status_nav: nav_scrollable::State,/// Logs shown in the status view.pub status_logs_navs: log::Navs,/// Other channels selection's navpub other_channels_nav: nav_scrollable::State,/// Navs for a log of selected channel other than the currentpub other_channel_log_navs: Option<(String, log::Navs)>,/// Entire log's change selection navpub entire_log_nav: nav_scrollable::State,/// Logs for the entire logpub entire_logs_navs: log::Navs,/// Diffs for untracked and changed files shown in status viewpub files_diffs: diff::FilesState,/// Diffs of status log changes, entire log changes and other channels'/// logspub log_diffs: log::FilesAndState,}#[derive(Debug, Default)]pub struct Logs {/// Populated when requested to look at the entire log of changespub entire_log: Option<Log>,/// Keys are channel namespub other_channels_logs: HashMap<String, Log>,}#[derive(Debug)]pub enum Log {Loading,Loaded { log: repo::Log },}/// Get untracked or changes files diff's nav if it matches given file IDpub fn get_files_diffs_nav(navigation: &Navigation,id_hash: file::IdHash,) -> Option<&nav_scrollable::State> {navigation.files_diffs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav))}/// Get untracked or changes files diff's nav if it matches given file IDpub fn get_files_diffs_nav_mut(navigation: &mut Navigation,id_hash: file::IdHash,) -> Option<&mut nav_scrollable::State> {navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav))}/// Get status log files nav if it matches given change hashpub fn get_status_log_files_nav(navigation: &Navigation,hash: repo::ChangeHash,) -> Option<&nav_scrollable::State> {navigation.status_logs_navs.files_nav.as_ref().and_then(|(nav_hash, nav)| (*nav_hash == hash).then_some(nav))}/// Get status log files nav if it matches given change hashpub fn get_status_log_files_nav_mut(navigation: &mut Navigation,hash: repo::ChangeHash,) -> Option<&mut nav_scrollable::State> {navigation.status_logs_navs.files_nav.as_mut().and_then(|(nav_hash, nav)| (*nav_hash == hash).then_some(nav))}/// Get status log diffs nav if it matches given log file IDpub fn get_status_log_diffs_nav(navigation: &Navigation,id_hash: file::LogIdHash,) -> Option<&nav_scrollable::State> {navigation.status_logs_navs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav))}/// Get status log diffs nav if it matches given log file IDpub fn get_status_log_diffs_nav_mut(navigation: &mut Navigation,id_hash: file::LogIdHash,) -> Option<&mut nav_scrollable::State> {navigation.status_logs_navs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav))}/// Get entire log files nav if it matches given change hashpub fn get_entire_log_files_nav(navigation: &Navigation,hash: repo::ChangeHash,) -> Option<&nav_scrollable::State> {navigation.entire_logs_navs.files_nav.as_ref().and_then(|(nav_hash, nav)| (*nav_hash == hash).then_some(nav))}/// Get entire log files nav if it matches given change hashpub fn get_entire_log_files_nav_mut(navigation: &mut Navigation,hash: repo::ChangeHash,) -> Option<&mut nav_scrollable::State> {navigation.entire_logs_navs.files_nav.as_mut().and_then(|(nav_hash, nav)| (*nav_hash == hash).then_some(nav))}/// Get entire log diffs nav if it matches given log file IDpub fn get_entire_log_diffs_nav(navigation: &Navigation,id_hash: file::LogIdHash,) -> Option<&nav_scrollable::State> {navigation.entire_logs_navs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav))}/// Get entire log diffs nav if it matches given log file IDpub fn get_entire_log_diffs_nav_mut(navigation: &mut Navigation,id_hash: file::LogIdHash,) -> Option<&mut nav_scrollable::State> {navigation.entire_logs_navs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav))} - file addition: diff.rs[0.29627]
#[doc(inline)]pub use libflorescence::diff::{contents_to_lines, Combined, DecodedFile, DiffWithContents,DiffWithoutContents, File, FileContent, Lines, Section,UndecodableContents, UndecodableFile,};use iced_expl_widget::nav_scrollable;use libflorescence::file;#[derive(Debug, Default)]pub struct State {pub selected_sections: Vec<usize>,pub expanded_unchanged_sections: Vec<usize>,pub collapsed_changed_sections: Vec<usize>,}#[derive(Debug, Default)]pub struct FilesState {pub diffs: file::IdMap<State>,/// Diffs scrollable nav.////// Only the current nav is kept because the sizes of contents have to be/// queried everytime the selection changes due to possible container size/// changes.pub diffs_nav: Option<(file::IdHash, nav_scrollable::State)>,}#[derive(Debug)]pub struct FileAndState {pub file: File,pub state: State,} - file addition: Cargo.toml[0.29594]
[package]name = "inflorescence-model"version.workspace = trueedition.workspace = truelicense.workspace = trueauthors.workspace = true[dependencies]# Internal dependencies[dependencies.libflorescence]workspace = true[dependencies.iced-expl-widget]workspace = true# External dependencies[dependencies.iced]workspace = true - edit in inflorescence/src/selection.rs at line 1[5.26]→[75.5302:5340](∅→∅),[75.5340]→[63.78:107](∅→∅),[64.20708]→[63.78:107](∅→∅),[5.26]→[63.78:107](∅→∅)
use iced_expl_widget::nav_scrollable;use inflorescence_view::app; - replacement in inflorescence/src/selection.rs at line 2[36.1961]→[69.13083:13124](∅→∅),[69.13124]→[73.15954:16029](∅→∅),[73.16029]→[69.13188:13220](∅→∅),[69.13188]→[69.13188:13220](∅→∅)
pub use inflorescence_view::selection::{Channel, Dir, HeldKey, LogChange, LogChangeFileSelection, Msg, Select,State as ViewState, Status,pub use inflorescence_model::selection::{unify, Channel, Dir, HeldKey, LogChange, LogChangeFileSelection, Msg,Primary, Select, State, Status, Unified, - replacement in inflorescence/src/selection.rs at line 7
use crate::{diff, file};use crate::{diff, file, log};use iced_expl_widget::nav_scrollable;use inflorescence_model::{get_entire_log_diffs_nav_mut, get_entire_log_files_nav_mut,get_files_diffs_nav_mut, get_status_log_diffs_nav_mut,get_status_log_files_nav_mut, Log, Logs, Navigation,};use inflorescence_view::app; - replacement in inflorescence/src/selection.rs at line 22
#[derive(Debug, Default)]pub struct State {pub view: ViewState,/// Last directional key down that's not yet been releasedpub held_key: Option<HeldKey>,/// Hot potatopub struct Ctx<'a> {pub state: &'a mut State,pub files: &'a mut file::State,pub navigation: &'a mut Navigation,pub repo: &'a repo::State,pub logs: &'a Logs, - replacement in inflorescence/src/selection.rs at line 35[29.8608]→[55.4269:4309](∅→∅),[55.4309]→[73.16030:16122](∅→∅),[73.16122]→[63.108:142](∅→∅),[64.20796]→[63.108:142](∅→∅),[55.4353]→[63.108:142](∅→∅)
files_diffs: &mut diff::FilesState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState,repo: Option<&mut app::Repo>,navigation: &mut Navigation,repo: &repo::State,logs: &Logs, - edit in inflorescence/src/selection.rs at line 39
let mut ctx = Ctx {state,files,navigation,repo,logs,};let mctx = &mut ctx; - replacement in inflorescence/src/selection.rs at line 51
state.held_key.as_ref().and_then(mctx.state.held_key.as_ref().and_then( - replacement in inflorescence/src/selection.rs at line 68
state.held_key = Some(HeldKey {mctx.state.held_key = Some(HeldKey { - replacement in inflorescence/src/selection.rs at line 74[55.5148]→[73.16245:16775](∅→∅),[73.16775]→[63.143:209](∅→∅),[55.5508]→[63.143:209](∅→∅),[63.209]→[73.16776:17002](∅→∅)
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,),Dir::Left => select_left(state, repo.as_deref()),Dir::Right => select_right(state,files_diffs,status_logs,entire_logs,repo.as_deref(),),Dir::Down => select_down(mctx, delta),Dir::Up => select_up(mctx, delta),Dir::Left => select_left(mctx),Dir::Right => select_right(mctx), - replacement in inflorescence/src/selection.rs at line 80
Msg::ReleaseDir(dir) => release(dir, state, files_diffs, status_logs),Msg::ReleaseDir(dir) => release(dir, mctx), - replacement in inflorescence/src/selection.rs at line 83
state.held_key.as_ref().and_then(mctx.state.held_key.as_ref().and_then( - replacement in inflorescence/src/selection.rs at line 100
state.held_key = Some(HeldKey {mctx.state.held_key = Some(HeldKey { - replacement in inflorescence/src/selection.rs at line 106
Dir::Down => {alt_select_down(state, files_diffs, status_logs, delta)}Dir::Up => {alt_select_up(state, files_diffs, status_logs, delta)}Dir::Down => alt_select_down(mctx, delta),Dir::Up => alt_select_up(mctx, delta), - replacement in inflorescence/src/selection.rs at line 114[56.4164]→[63.341:444](∅→∅),[63.444]→[75.5341:5359](∅→∅),[75.5359]→[63.473:498](∅→∅),[63.473]→[63.473:498](∅→∅),[63.498]→[73.17330:17380](∅→∅),[73.17380]→[63.521:532](∅→∅),[64.21350]→[63.521:532](∅→∅),[63.521]→[63.521:532](∅→∅)
Msg::Select(select) => select_exact(select,state,files,repo,files_diffs,status_logs,entire_logs,),Msg::Select(select) => select_exact(select, mctx), - edit in inflorescence/src/selection.rs at line 117[54.22121]→[54.22121:22122](∅→∅),[54.22122]→[64.21351:21367](∅→∅),[64.21367]→[54.22772:22824](∅→∅),[54.22772]→[54.22772:22824](∅→∅),[63.567]→[55.5746:5786](∅→∅),[54.22856]→[55.5746:5786](∅→∅),[55.5786]→[73.17381:17473](∅→∅),[73.17473]→[64.21368:21402](∅→∅),[55.5825]→[64.21368:21402](∅→∅),[64.21402]→[55.5825:5854](∅→∅),[55.5825]→[55.5825:5854](∅→∅),[55.5854]→[64.21403:21427](∅→∅),[64.21427]→[63.568:640](∅→∅),[54.22942]→[63.568:640](∅→∅),[63.640]→[69.13221:13248](∅→∅),[69.13248]→[70.5750:5778](∅→∅),[70.5778]→[73.17474:17494](∅→∅),[70.5778]→[63.640:665](∅→∅),[69.13248]→[63.640:665](∅→∅),[73.17494]→[63.640:665](∅→∅),[63.640]→[63.640:665](∅→∅),[63.665]→[59.82:118](∅→∅),[59.82]→[59.82:118](∅→∅),[59.118]→[69.13249:13770](∅→∅),[69.13770]→[73.17495:17502](∅→∅),[73.17502]→[75.5360:5434](∅→∅),[75.5434]→[73.17576:18485](∅→∅),[73.17576]→[73.17576:18485](∅→∅),[73.18485]→[75.5435:5490](∅→∅),[75.5490]→[73.18551:18762](∅→∅),[73.18551]→[73.18551:18762](∅→∅),[73.18762]→[75.5491:5616](∅→∅),[75.5616]→[73.18942:18969](∅→∅),[73.18942]→[73.18942:18969](∅→∅),[73.18969]→[75.5617:5667](∅→∅),[75.5667]→[73.19011:19440](∅→∅),[73.19011]→[73.19011:19440](∅→∅)
fn select_down(state: &mut State,files: &mut file::State,files_diffs: &mut diff::FilesState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState,repo: Option<&mut app::Repo>,delta: Option<Duration>,) -> Task<crate::Msg> {let Some(app::Repo {state: repo_state,status_nav,switching_channel,forking_channel: _,entire_log,}) = repoelse {return Task::none();};if *switching_channel {let channels = &repo_state.other_channels;let selection = match state.view.channel.take() {Some(Channel { ix, name: _ }) => {let ix = if ix == channels.len() - 1 { 0 } else { ix + 1 };channel_selection(ix, channels)}None => {let ix = 0;channel_selection(ix, channels)}};state.view.channel = Some(selection);return Task::none();}if let Some(app::EntireLog::Got { log, nav }) = entire_log.as_mut() {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,}),};if let Some(nav) = entire_logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)}){nav_scrollable::scroll_down(nav, delta)};(selection, Task::none())} 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}; - replacement in inflorescence/src/selection.rs at line 118[73.19441]→[73.19441:19700](∅→∅),[73.19700]→[75.5668:5792](∅→∅),[75.5792]→[73.19842:19925](∅→∅),[73.19842]→[73.19842:19925](∅→∅),[73.19925]→[75.5793:5874](∅→∅),[75.5874]→[73.20148:20412](∅→∅),[73.20148]→[73.20148:20412](∅→∅),[73.20412]→[75.5875:5927](∅→∅),[75.5927]→[73.20492:21488](∅→∅),[73.20492]→[73.20492:21488](∅→∅)
let (file, selection_task) = entire_log_file_selection(entire_logs,log_entry,hash,file_ix,);if let Some((nav_changes_hash, nav)) =entire_logs.changes_nav.as_mut()&& *nav_changes_hash == hash{nav_scrollable::scroll_down_to_section(nav, file_ix)};let selection = LogChange {ix: log_ix,hash,message,file: Some(file),};(selection, selection_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;fn select_down(ctx: &mut Ctx<'_>, delta: Option<Duration>) -> Task<crate::Msg> {match ctx.state.primary {Primary::Status => select_down_status(ctx, delta),Primary::Channel => select_down_channel(ctx),Primary::EntireLog => select_down_entire_log(ctx, delta), - edit in inflorescence/src/selection.rs at line 124
} - replacement in inflorescence/src/selection.rs at line 126
let (selection, task) = match state.view.status.take() {fn select_down_status(ctx: &mut Ctx<'_>,delta: Option<Duration>,) -> Task<crate::Msg> {let (selection, task) = match ctx.state.status.take() { - replacement in inflorescence/src/selection.rs at line 138
if let Some(nav) = files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {if let Some(nav) =get_files_diffs_nav_mut(ctx.navigation, id_hash){ - replacement in inflorescence/src/selection.rs at line 151
} else if repo_state.untracked_files.len().saturating_sub(1) == ix {} else if ctx.repo.untracked_files.len().saturating_sub(1) == ix { - replacement in inflorescence/src/selection.rs at line 153
if !repo_state.changed_files.is_empty() {if !ctx.repo.changed_files.is_empty() { - replacement in inflorescence/src/selection.rs at line 155[59.1100]→[64.21676:21756](∅→∅),[64.21756]→[63.1235:1271](∅→∅),[63.1235]→[63.1235:1271](∅→∅),[63.1271]→[64.21757:21914](∅→∅),[64.21914]→[63.1332:1387](∅→∅),[63.1332]→[63.1332:1387](∅→∅)
changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,)} else if !repo_state.log.is_empty() {changed_file_selection(ix, VDir::Down, ctx)} else if !ctx.repo.short_log.is_empty() { - replacement in inflorescence/src/selection.rs at line 158[59.1304]→[73.21489:21531](∅→∅),[73.21531]→[63.1658:1694](∅→∅),[64.21950]→[63.1658:1694](∅→∅),[63.1658]→[63.1658:1694](∅→∅),[63.1694]→[73.21532:21569](∅→∅),[73.21569]→[64.21981:22106](∅→∅),[64.21981]→[64.21981:22106](∅→∅)
status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,)status_log_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 161[59.1397]→[64.22107:22189](∅→∅),[64.22189]→[63.2159:2195](∅→∅),[63.2159]→[63.2159:2195](∅→∅),[63.2195]→[64.22190:22345](∅→∅)
untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)untracked_file_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 165[59.1470]→[64.22346:22420](∅→∅),[64.22420]→[63.2590:2622](∅→∅),[63.2590]→[63.2590:2622](∅→∅),[63.2622]→[64.22421:22558](∅→∅)
untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,)untracked_file_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 176
if let Some(nav) = files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {if let Some(nav) =get_files_diffs_nav_mut(ctx.navigation, id_hash){ - replacement in inflorescence/src/selection.rs at line 189
} else if repo_state.changed_files.len().saturating_sub(1) == ix {} else if ctx.repo.changed_files.len().saturating_sub(1) == ix { - replacement in inflorescence/src/selection.rs at line 191
if !repo_state.log.is_empty() {if !ctx.repo.short_log.is_empty() { - replacement in inflorescence/src/selection.rs at line 193[59.2553]→[73.21570:21612](∅→∅),[73.21612]→[63.3120:3156](∅→∅),[64.22842]→[63.3120:3156](∅→∅),[63.3120]→[63.3120:3156](∅→∅),[63.3156]→[73.21613:21650](∅→∅),[73.21650]→[64.22873:22998](∅→∅),[64.22873]→[64.22873:22998](∅→∅),[64.22998]→[63.3237:3304](∅→∅),[63.3237]→[63.3237:3304](∅→∅)
status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,)} else if !repo_state.untracked_files.is_empty() {status_log_selection(ix, VDir::Down, ctx)} else if !ctx.repo.untracked_files.is_empty() { - replacement in inflorescence/src/selection.rs at line 196[59.2706]→[64.22999:23081](∅→∅),[64.23081]→[63.3688:3724](∅→∅),[63.3688]→[63.3688:3724](∅→∅),[63.3724]→[64.23082:23237](∅→∅)
untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)untracked_file_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 199[59.2864]→[64.23238:23318](∅→∅),[64.23318]→[63.4165:4201](∅→∅),[63.4165]→[63.4165:4201](∅→∅),[63.4201]→[64.23319:23474](∅→∅)
changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)changed_file_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 203[59.2937]→[64.23475:23547](∅→∅),[64.23547]→[63.4592:4624](∅→∅),[63.4592]→[63.4592:4624](∅→∅),[63.4624]→[64.23548:23685](∅→∅)
changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,)changed_file_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 231[73.21812]→[75.6612:6667](∅→∅),[75.6667]→[64.24172:24383](∅→∅),[73.21878]→[64.24172:24383](∅→∅),[64.24172]→[64.24172:24383](∅→∅),[64.24383]→[75.6668:6725](∅→∅)
if let Some(nav) = status_logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)}){if let Some(nav) = get_status_log_diffs_nav_mut(ctx.navigation,id_hash,) { - replacement in inflorescence/src/selection.rs at line 239
let log_entry = repo_state.log.get(log_ix).unwrap();let log_entry = ctx.repo.short_log.get(log_ix).unwrap(); - replacement in inflorescence/src/selection.rs at line 241
let file_ix =let (file_ix, dir) = - replacement in inflorescence/src/selection.rs at line 245
0(0, VDir::Up) - replacement in inflorescence/src/selection.rs at line 247
file_ix + 1(file_ix + 1, VDir::Down) - replacement in inflorescence/src/selection.rs at line 250
let (file, selection_task) = log_file_selection(status_logs,log_entry,hash,let (file, selection_task) = status_log_file_selection( - edit in inflorescence/src/selection.rs at line 252
hash,dir,ctx.navigation,log_entry, - replacement in inflorescence/src/selection.rs at line 258[28.7559]→[75.6845:6969](∅→∅),[75.6969]→[64.24903:24960](∅→∅),[73.22192]→[64.24903:24960](∅→∅),[64.24903]→[64.24903:24960](∅→∅)
if let Some((nav_changes_hash, nav)) =status_logs.changes_nav.as_mut()&& *nav_changes_hash == hashif let Some(nav) =get_status_log_files_nav_mut(ctx.navigation, hash) - replacement in inflorescence/src/selection.rs at line 274
if repo_state.log.len().saturating_sub(1) == log_ix {if ctx.repo.short_log.len().saturating_sub(1) == log_ix { - replacement in inflorescence/src/selection.rs at line 276
if !repo_state.untracked_files.is_empty() {if !ctx.repo.untracked_files.is_empty() { - replacement in inflorescence/src/selection.rs at line 278
untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)} else if !repo_state.changed_files.is_empty() {untracked_file_selection(ix, VDir::Up, ctx)} else if !ctx.repo.changed_files.is_empty() { - replacement in inflorescence/src/selection.rs at line 281
changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)changed_file_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 284[63.6405]→[73.22293:22343](∅→∅),[73.22343]→[64.26222:26266](∅→∅),[64.26222]→[64.26222:26266](∅→∅),[64.26266]→[73.22344:22389](∅→∅),[73.22389]→[64.26304:26459](∅→∅),[64.26304]→[64.26304:26459](∅→∅)
status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Up,)status_log_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 288[63.7022]→[73.22390:22436](∅→∅),[73.22436]→[63.7316:7356](∅→∅),[64.26499]→[63.7316:7356](∅→∅),[63.7316]→[63.7316:7356](∅→∅),[63.7356]→[73.22437:22478](∅→∅),[73.22478]→[64.26534:26675](∅→∅),[64.26534]→[64.26534:26675](∅→∅)
status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,)status_log_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 295
if !repo_state.untracked_files.is_empty() {if !ctx.repo.untracked_files.is_empty() { - replacement in inflorescence/src/selection.rs at line 297[59.6334]→[64.26676:26774](∅→∅),[64.26774]→[63.7884:7916](∅→∅),[63.7884]→[63.7884:7916](∅→∅),[63.7916]→[64.26775:26894](∅→∅),[64.26894]→[63.7916:7935](∅→∅),[63.7916]→[63.7916:7935](∅→∅)
let (selection, task) = untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,);let (selection, task) =untracked_file_selection(ix, VDir::Down, ctx); - replacement in inflorescence/src/selection.rs at line 300
} else if !repo_state.changed_files.is_empty() {} else if !ctx.repo.changed_files.is_empty() { - replacement in inflorescence/src/selection.rs at line 302[59.6540]→[64.26936:27032](∅→∅),[64.27032]→[63.8386:8418](∅→∅),[63.8386]→[63.8386:8418](∅→∅),[63.8418]→[64.27033:27152](∅→∅),[64.27152]→[63.8418:8437](∅→∅),[63.8418]→[63.8418:8437](∅→∅)
let (selection, task) = changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,);let (selection, task) =changed_file_selection(ix, VDir::Down, ctx); - replacement in inflorescence/src/selection.rs at line 305[64.27193]→[63.8471:8573](∅→∅),[63.8471]→[63.8471:8573](∅→∅),[63.8573]→[73.22479:22541](∅→∅),[73.22541]→[63.8787:8819](∅→∅),[64.27249]→[63.8787:8819](∅→∅),[63.8787]→[63.8787:8819](∅→∅),[63.8819]→[73.22542:22575](∅→∅),[73.22575]→[64.27276:27367](∅→∅),[64.27276]→[64.27276:27367](∅→∅),[64.27367]→[63.8819:8838](∅→∅),[63.8819]→[63.8819:8838](∅→∅)
} else if !repo_state.log.is_empty() {let ix = repo_state.log.len() - 1;let (selection, task) = status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,);} else if !ctx.repo.short_log.is_empty() {let ix = ctx.repo.short_log.len() - 1;let (selection, task) =status_log_selection(ix, VDir::Down, ctx); - replacement in inflorescence/src/selection.rs at line 315
state.view.status = selection;ctx.state.status = selection; - replacement in inflorescence/src/selection.rs at line 319[54.30877]→[64.27368:27382](∅→∅),[64.27382]→[54.30894:30946](∅→∅),[54.30894]→[54.30894:30946](∅→∅),[63.8928]→[55.6447:6487](∅→∅),[54.30978]→[55.6447:6487](∅→∅),[55.6487]→[73.22576:22668](∅→∅),[73.22668]→[64.27383:27417](∅→∅),[55.6526]→[64.27383:27417](∅→∅)
fn select_up(state: &mut State,files: &mut file::State,files_diffs: &mut diff::FilesState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState,repo: Option<&mut app::Repo>,fn select_down_channel(ctx: &mut Ctx<'_>) -> Task<crate::Msg> {let ix = match ctx.state.channel.take() {Some(Channel {ix,name: _,log: _,}) => {if ix == ctx.repo.other_channels.len() - 1 {0} else {ix + 1}}None => 0,};let (selection, task) = channel_selection(ix, VDir::Down, ctx);ctx.state.channel = Some(selection);return task;}fn select_down_entire_log(ctx: &mut Ctx<'_>, - replacement in inflorescence/src/selection.rs at line 343[64.27442]→[63.8929:9001](∅→∅),[54.31064]→[63.8929:9001](∅→∅),[63.9001]→[69.14192:14219](∅→∅),[69.14219]→[70.5779:5807](∅→∅),[70.5807]→[73.22669:22689](∅→∅),[70.5807]→[63.9001:9026](∅→∅),[69.14219]→[63.9001:9026](∅→∅),[73.22689]→[63.9001:9026](∅→∅),[63.9001]→[63.9001:9026](∅→∅),[63.9026]→[59.7061:7097](∅→∅),[59.7061]→[59.7061:7097](∅→∅),[59.7097]→[69.14220:14764](∅→∅),[69.14764]→[73.22690:22691](∅→∅),[73.22691]→[75.7105:7179](∅→∅)
let Some(app::Repo {state: repo_state,status_nav,switching_channel,forking_channel: _,entire_log,}) = repoelse {return Task::none();};if *switching_channel {let channels = &repo_state.other_channels;let selection = match state.view.channel.take() {Some(Channel { ix, name: _ }) => {let ix = if ix == 0 { channels.len() - 1 } else { ix - 1 };channel_selection(ix, channels)}None => {let ix = channels.len() - 1;channel_selection(ix, channels)}};state.view.channel = Some(selection);return Task::none();}if let Some(app::EntireLog::Got { log, nav }) = entire_log.as_mut() {if let Some(Log::Loaded { log }) = ctx.logs.entire_log.as_ref() { - replacement in inflorescence/src/selection.rs at line 349
}) = state.view.entire_log.take()}) = ctx.state.entire_log.take() - replacement in inflorescence/src/selection.rs at line 369
if let Some(nav) = entire_logsif let Some(nav) = ctx.navigation.entire_logs_navs - replacement in inflorescence/src/selection.rs at line 378
nav_scrollable::scroll_up(nav, delta)nav_scrollable::scroll_down(nav, delta) - replacement in inflorescence/src/selection.rs at line 384
let file_ix = if 0 == file_ix {log_entry.file_paths.len().saturating_sub(1)} else {file_ix - 1};let file_ix =if log_entry.file_paths.len().saturating_sub(1)== file_ix{0} else {file_ix + 1}; - replacement in inflorescence/src/selection.rs at line 394
entire_logs,file_ix,hash,VDir::Down,ctx.navigation, - edit in inflorescence/src/selection.rs at line 399
hash,file_ix, - replacement in inflorescence/src/selection.rs at line 401
if let Some((nav_changes_hash, nav)) =entire_logs.changes_nav.as_mut()&& *nav_changes_hash == hashif let Some(nav) =get_entire_log_files_nav_mut(ctx.navigation, hash) - replacement in inflorescence/src/selection.rs at line 404
nav_scrollable::scroll_up_to_section(nav, file_ix)}nav_scrollable::scroll_down_to_section(nav, file_ix)}; - replacement in inflorescence/src/selection.rs at line 417
if 0 == log_ix {let ix = log.len().saturating_sub(1);entire_log_selection(nav,entire_logs,log,ix,VertDir::Down,)if log.len().saturating_sub(1) == log_ix {let ix = 0;entire_log_selection(ix, VDir::Up, ctx, log) - replacement in inflorescence/src/selection.rs at line 421
let ix = log_ix - 1;entire_log_selection(nav,entire_logs,log,ix,VertDir::Up,)let ix = log_ix + 1;entire_log_selection(ix, VDir::Down, ctx, log) - replacement in inflorescence/src/selection.rs at line 428
entire_log_selection(nav, entire_logs, log, ix, VertDir::Down)entire_log_selection(ix, VDir::Down, ctx, log) - replacement in inflorescence/src/selection.rs at line 430
state.view.entire_log = Some(selection);ctx.state.entire_log = Some(selection); - edit in inflorescence/src/selection.rs at line 433
Task::none()} - replacement in inflorescence/src/selection.rs at line 436
let (selection, task) = match state.view.status.take() {fn select_up(ctx: &mut Ctx<'_>, delta: Option<Duration>) -> Task<crate::Msg> {match ctx.state.primary {Primary::Status => select_up_status(ctx, delta),Primary::Channel => select_up_channel(ctx),Primary::EntireLog => select_up_entire_log(ctx, delta),}}fn select_up_status(ctx: &mut Ctx<'_>,delta: Option<Duration>,) -> Task<crate::Msg> {let (selection, task) = match ctx.state.status.take() { - replacement in inflorescence/src/selection.rs at line 456
if let Some(nav) = files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {if let Some(nav) =ctx.navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},){ - replacement in inflorescence/src/selection.rs at line 475[63.9076]→[63.9076:9179](∅→∅),[63.9179]→[73.26577:26619](∅→∅),[73.26619]→[63.9449:9485](∅→∅),[64.27726]→[63.9449:9485](∅→∅),[63.9449]→[63.9449:9485](∅→∅),[63.9485]→[73.26620:26657](∅→∅),[73.26657]→[64.27757:27882](∅→∅),[64.27757]→[64.27757:27882](∅→∅),[64.27882]→[63.9566:9696](∅→∅),[63.9566]→[63.9566:9696](∅→∅),[63.9696]→[64.27883:27963](∅→∅),[64.27963]→[63.10077:10113](∅→∅),[63.10077]→[63.10077:10113](∅→∅),[63.10113]→[64.27964:28121](∅→∅)
if !repo_state.log.is_empty() {let ix = repo_state.log.len() - 1;status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,)} else if !repo_state.changed_files.is_empty() {let ix = repo_state.changed_files.len() - 1;changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,)if !ctx.repo.short_log.is_empty() {let ix = ctx.repo.short_log.len() - 1;status_log_selection(ix, VDir::Down, ctx)} else if !ctx.repo.changed_files.is_empty() {let ix = ctx.repo.changed_files.len() - 1;changed_file_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 482[54.32756]→[63.10175:10242](∅→∅),[63.10242]→[64.28122:28204](∅→∅),[64.28204]→[63.10627:10663](∅→∅),[63.10627]→[63.10627:10663](∅→∅),[63.10663]→[64.28205:28362](∅→∅)
let ix = repo_state.untracked_files.len() - 1;untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,)let ix = ctx.repo.untracked_files.len() - 1;untracked_file_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 487[59.8477]→[64.28363:28437](∅→∅),[64.28437]→[63.11056:11088](∅→∅),[63.11056]→[63.11056:11088](∅→∅),[63.11088]→[64.28438:28573](∅→∅)
untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)untracked_file_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 498
if let Some(nav) = files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {if let Some(nav) =ctx.navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},){ - replacement in inflorescence/src/selection.rs at line 517[63.11189]→[63.11189:11316](∅→∅),[63.11316]→[64.28822:28904](∅→∅),[64.28904]→[63.11699:11735](∅→∅),[63.11699]→[63.11699:11735](∅→∅),[63.11735]→[64.28905:29060](∅→∅),[64.29060]→[63.11796:11906](∅→∅),[63.11796]→[63.11796:11906](∅→∅),[63.11906]→[73.26658:26700](∅→∅),[73.26700]→[63.12243:12279](∅→∅),[64.29096]→[63.12243:12279](∅→∅),[63.12243]→[63.12243:12279](∅→∅),[63.12279]→[73.26701:26738](∅→∅),[73.26738]→[64.29127:29252](∅→∅),[64.29127]→[64.29127:29252](∅→∅)
if !repo_state.untracked_files.is_empty() {let ix = repo_state.untracked_files.len() - 1;untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)} else if !repo_state.log.is_empty() {let ix = repo_state.log.len() - 1;status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,)if !ctx.repo.untracked_files.is_empty() {let ix = ctx.repo.untracked_files.len() - 1;untracked_file_selection(ix, VDir::Up, ctx)} else if !ctx.repo.short_log.is_empty() {let ix = ctx.repo.short_log.len() - 1;status_log_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 524[54.34503]→[63.12341:12406](∅→∅),[63.12406]→[64.29253:29333](∅→∅),[64.29333]→[63.12787:12823](∅→∅),[63.12787]→[63.12787:12823](∅→∅),[63.12823]→[64.29334:29491](∅→∅)
let ix = repo_state.changed_files.len() - 1;changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,)let ix = ctx.repo.changed_files.len() - 1;changed_file_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 529[59.9995]→[64.29492:29564](∅→∅),[64.29564]→[63.13230:13262](∅→∅),[63.13230]→[63.13230:13262](∅→∅),[63.13262]→[64.29565:29700](∅→∅)
changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)changed_file_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 557
if let Some(nav) = status_logsif let Some(nav) = ctx.navigation.status_logs_navs - replacement in inflorescence/src/selection.rs at line 570
let log_entry = repo_state.log.get(log_ix).unwrap();let log_entry = ctx.repo.short_log.get(log_ix).unwrap(); - replacement in inflorescence/src/selection.rs at line 572
let file_ix = if 0 == file_ix {log_entry.file_paths.len() - 1let (file_ix, dir) = if 0 == file_ix {(log_entry.file_paths.len() - 1, VDir::Down) - replacement in inflorescence/src/selection.rs at line 575
file_ix - 1(file_ix - 1, VDir::Up) - replacement in inflorescence/src/selection.rs at line 578
let (file, selection_task) = log_file_selection(status_logs,log_entry,hash,let (file, selection_task) = status_log_file_selection( - edit in inflorescence/src/selection.rs at line 580
hash,dir,ctx.navigation,log_entry, - replacement in inflorescence/src/selection.rs at line 586[64.30780]→[75.8604:8728](∅→∅),[75.8728]→[64.30915:30972](∅→∅),[73.27280]→[64.30915:30972](∅→∅),[64.30915]→[64.30915:30972](∅→∅)
if let Some((nav_changes_hash, nav)) =status_logs.changes_nav.as_mut()&& *nav_changes_hash == hashif let Some(nav) =get_entire_log_files_nav_mut(ctx.navigation, hash) - replacement in inflorescence/src/selection.rs at line 604[63.13477]→[63.13477:13616](∅→∅),[63.13616]→[64.31575:31910](∅→∅),[64.31910]→[63.14240:14390](∅→∅),[63.14240]→[63.14240:14390](∅→∅),[63.14390]→[64.31911:32248](∅→∅)
if !repo_state.changed_files.is_empty() {let ix = repo_state.changed_files.len() - 1;changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)} else if !repo_state.untracked_files.is_empty() {let ix = repo_state.untracked_files.len() - 1;untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,)if !ctx.repo.changed_files.is_empty() {let ix = ctx.repo.changed_files.len() - 1;changed_file_selection(ix, VDir::Up, ctx)} else if !ctx.repo.untracked_files.is_empty() {let ix = ctx.repo.untracked_files.len() - 1;untracked_file_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 611[59.12750]→[63.15019:15082](∅→∅),[63.15082]→[73.27381:27431](∅→∅),[73.27431]→[64.32292:32336](∅→∅),[64.32292]→[64.32292:32336](∅→∅),[64.32336]→[73.27432:27477](∅→∅),[73.27477]→[64.32374:32531](∅→∅),[64.32374]→[64.32374:32531](∅→∅)
let ix = repo_state.log.len() - 1;status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,)let ix = ctx.repo.short_log.len() - 1;status_log_selection(ix, VDir::Down, ctx) - replacement in inflorescence/src/selection.rs at line 616[59.12959]→[73.27478:27524](∅→∅),[73.27524]→[63.16020:16060](∅→∅),[64.32571]→[63.16020:16060](∅→∅),[63.16020]→[63.16020:16060](∅→∅),[63.16060]→[73.27525:27566](∅→∅),[73.27566]→[64.32606:32745](∅→∅),[64.32606]→[64.32606:32745](∅→∅)
status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Up,)status_log_selection(ix, VDir::Up, ctx) - replacement in inflorescence/src/selection.rs at line 623[59.13173]→[63.16152:16247](∅→∅),[63.16247]→[73.27567:27629](∅→∅),[73.27629]→[63.16459:16491](∅→∅),[64.32801]→[63.16459:16491](∅→∅),[63.16459]→[63.16459:16491](∅→∅),[63.16491]→[73.27630:27663](∅→∅),[73.27663]→[64.32828:32917](∅→∅),[64.32828]→[64.32828:32917](∅→∅),[64.32917]→[63.16491:16510](∅→∅),[63.16491]→[63.16491:16510](∅→∅)
if !repo_state.log.is_empty() {let ix = repo_state.log.len() - 1;let (selection, task) = status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Up,);if !ctx.repo.short_log.is_empty() {let ix = ctx.repo.short_log.len() - 1;let (selection, task) = status_log_selection(ix, VDir::Up, ctx); - replacement in inflorescence/src/selection.rs at line 627[63.16550]→[63.16550:16672](∅→∅),[63.16672]→[64.32918:33014](∅→∅),[64.33014]→[63.17001:17033](∅→∅),[63.17001]→[63.17001:17033](∅→∅),[63.17033]→[64.33015:33132](∅→∅),[64.33132]→[63.17033:17052](∅→∅),[63.17033]→[63.17033:17052](∅→∅)
} else if !repo_state.changed_files.is_empty() {let ix = repo_state.changed_files.len() - 1;let (selection, task) = changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,);} else if !ctx.repo.changed_files.is_empty() {let ix = ctx.repo.changed_files.len() - 1;let (selection, task) =changed_file_selection(ix, VDir::Up, ctx); - replacement in inflorescence/src/selection.rs at line 632[63.17092]→[63.17092:17218](∅→∅),[63.17218]→[64.33133:33231](∅→∅),[64.33231]→[63.17549:17581](∅→∅),[63.17549]→[63.17549:17581](∅→∅),[63.17581]→[64.33232:33349](∅→∅),[64.33349]→[63.17581:17600](∅→∅),[63.17581]→[63.17581:17600](∅→∅)
} else if !repo_state.untracked_files.is_empty() {let ix = repo_state.untracked_files.len() - 1;let (selection, task) = untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Up,);} else if !ctx.repo.untracked_files.is_empty() {let ix = ctx.repo.untracked_files.len() - 1;let (selection, task) =untracked_file_selection(ix, VDir::Up, ctx); - replacement in inflorescence/src/selection.rs at line 643
state.view.status = selection;ctx.state.status = selection; - replacement in inflorescence/src/selection.rs at line 647
fn alt_select_down<M>(state: &mut State,files_diffs: &mut diff::FilesState,logs: &mut diff::LogFilesAndState,fn select_up_channel(ctx: &mut Ctx<'_>) -> Task<crate::Msg> {let ix = match ctx.state.channel.take() {Some(Channel {ix,name: _,log: _,}) => {if ix == 0 {ctx.repo.other_channels.len() - 1} else {ix - 1}}None => ctx.repo.other_channels.len() - 1,};let (selection, task) = channel_selection(ix, VDir::Up, ctx);ctx.state.channel = Some(selection);return task;}fn select_up_entire_log(ctx: &mut Ctx<'_>, - replacement in inflorescence/src/selection.rs at line 670
) -> Task<M> {match state.view.status.as_mut() {) -> Task<crate::Msg> {if let Some(Log::Loaded { log }) = ctx.logs.entire_log.as_ref() {let (selection, task) = if let Some(LogChange {ix: log_ix,hash,message,file,}) = ctx.state.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,}),};if let Some(nav) = get_entire_log_diffs_nav_mut(ctx.navigation,id_hash,) {nav_scrollable::scroll_up(nav, delta)};(selection, Task::none())} 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(file_ix,hash,VDir::Up,ctx.navigation,log_entry,);if let Some(nav) =get_entire_log_files_nav_mut(ctx.navigation, hash){nav_scrollable::scroll_up_to_section(nav, file_ix)}let selection = LogChange {ix: log_ix,hash,message,file: Some(file),};(selection, selection_task)}}None => {if 0 == log_ix {let ix = log.len().saturating_sub(1);entire_log_selection(ix, VDir::Down, ctx, log)} else {let ix = log_ix - 1;entire_log_selection(ix, VDir::Up, ctx, log)}}}} else {let ix = 0;entire_log_selection(ix, VDir::Down, ctx, log)};ctx.state.entire_log = Some(selection);return task;}Task::none()}fn alt_select_down<M>(ctx: &mut Ctx<'_>, delta: Option<Duration>) -> Task<M> {match ctx.state.status.as_mut() { - replacement in inflorescence/src/selection.rs at line 765[64.33381]→[64.33381:33440](∅→∅),[64.33440]→[75.8862:8892](∅→∅),[75.8892]→[64.33470:33523](∅→∅),[64.33470]→[64.33470:33523](∅→∅)
files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {ctx.navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| { - replacement in inflorescence/src/selection.rs at line 768
})},) - replacement in inflorescence/src/selection.rs at line 782[64.33643]→[64.33643:33702](∅→∅),[64.33702]→[75.8980:9010](∅→∅),[75.9010]→[64.33732:33785](∅→∅),[64.33732]→[64.33732:33785](∅→∅)
files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {ctx.navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| { - replacement in inflorescence/src/selection.rs at line 785
})},) - replacement in inflorescence/src/selection.rs at line 805
logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)})ctx.navigation.status_logs_navs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) - replacement in inflorescence/src/selection.rs at line 822
fn alt_select_up<M>(state: &mut State,files_diffs: &mut diff::FilesState,logs: &mut diff::LogFilesAndState,delta: Option<Duration>,) -> Task<M> {match state.view.status.as_mut() {fn alt_select_up<M>(ctx: &mut Ctx<'_>, delta: Option<Duration>) -> Task<M> {match ctx.state.status.as_mut() { - replacement in inflorescence/src/selection.rs at line 831[64.34089]→[64.34089:34148](∅→∅),[64.34148]→[75.9258:9288](∅→∅),[75.9288]→[64.34178:34231](∅→∅),[64.34178]→[64.34178:34231](∅→∅)
files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {ctx.navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| { - replacement in inflorescence/src/selection.rs at line 834
})},) - replacement in inflorescence/src/selection.rs at line 848[64.34351]→[64.34351:34410](∅→∅),[64.34410]→[75.9374:9404](∅→∅),[75.9404]→[64.34440:34493](∅→∅),[64.34440]→[64.34440:34493](∅→∅)
files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {ctx.navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| { - replacement in inflorescence/src/selection.rs at line 851
})},) - replacement in inflorescence/src/selection.rs at line 871
logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)})ctx.navigation.status_logs_navs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) - replacement in inflorescence/src/selection.rs at line 888[54.38748]→[64.34766:34912](∅→∅),[64.34912]→[75.9648:9671](∅→∅),[75.9671]→[69.15730:15760](∅→∅),[64.34932]→[69.15730:15760](∅→∅),[69.15760]→[70.5808:5836](∅→∅),[70.5836]→[73.27894:27914](∅→∅),[70.5836]→[64.34932:34966](∅→∅),[69.15760]→[64.34932:34966](∅→∅),[73.27914]→[64.34932:34966](∅→∅),[64.34932]→[64.34932:34966](∅→∅),[64.34966]→[59.14060:14096](∅→∅),[59.14060]→[59.14060:14096](∅→∅),[59.14096]→[73.27915:27916](∅→∅),[73.27916]→[75.9672:9752](∅→∅),[75.9752]→[73.27993:28091](∅→∅),[73.27993]→[73.27993:28091](∅→∅),[69.15903]→[64.35113:35252](∅→∅),[73.28091]→[64.35113:35252](∅→∅),[64.35113]→[64.35113:35252](∅→∅),[59.14661]→[54.39120:39187](∅→∅),[64.35252]→[54.39120:39187](∅→∅),[54.39120]→[54.39120:39187](∅→∅),[54.39187]→[64.35253:35292](∅→∅),[59.14708]→[54.39226:39250](∅→∅),[64.35292]→[54.39226:39250](∅→∅),[54.39226]→[54.39226:39250](∅→∅),[54.39250]→[64.35293:35370](∅→∅),[64.35370]→[73.28092:28133](∅→∅),[69.15953]→[64.35422:35589](∅→∅),[73.28133]→[64.35422:35589](∅→∅),[64.35422]→[64.35422:35589](∅→∅)
fn select_left(state: &mut State,repo: Option<&app::Repo>,) -> Task<crate::Msg> {let Some(app::Repo {state: _repo_state,status_nav: _,switching_channel: _,forking_channel: _,entire_log,}) = repo.as_ref()else {return Task::none();};if let Some(app::EntireLog::Got { log: _, nav: _ }) = entire_log.as_ref() {let (selection, task) = match state.view.entire_log.take() {Some(LogChange {ix,hash,message,file:Some(LogChangeFileSelection {ix: file_ix,path,diff_selected,}),}) => {if diff_selected {(Some(LogChange {ix,hash,message,file: Some(LogChangeFileSelection {fn select_left(ctx: &mut Ctx<'_>) -> Task<crate::Msg> {match ctx.state.primary {Primary::Status => {let (selection, task): (Option<Status>, Task<crate::Msg>) =match ctx.state.status.take() {Some(Status::LogChange(LogChange {ix,hash,message,file:Some(LogChangeFileSelection { - replacement in inflorescence/src/selection.rs at line 901
diff_selected: false,diff_selected, - edit in inflorescence/src/selection.rs at line 903
})) => {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,});(Some(selection), Task::none())}}Some(Status::UntrackedFile {ix,path,diff_selected: true,}) => (Some(Status::UntrackedFile {ix,path,diff_selected: false, - replacement in inflorescence/src/selection.rs at line 939
)} else {let selection = LogChange {),Some(Status::ChangedFile { - edit in inflorescence/src/selection.rs at line 942[64.35958]→[64.35958:36080](∅→∅),[64.36080]→[75.9753:9805](∅→∅),[75.9805]→[73.28333:28904](∅→∅),[73.28333]→[73.28333:28904](∅→∅)
hash,message,file: None,};(Some(selection), Task::none())}}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, - replacement in inflorescence/src/selection.rs at line 943
diff_selected,}),})) => {if diff_selected {(Some(Status::LogChange(LogChange {diff_selected: true,}) => (Some(Status::ChangedFile { - replacement in inflorescence/src/selection.rs at line 947
hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: false,}),})),path,diff_selected: false,}), - replacement in inflorescence/src/selection.rs at line 951
)} else {let selection = Status::LogChange(LogChange {ix,hash,message,),selection @ (Some(Status::UntrackedFile { .. })| Some(Status::ChangedFile { .. })| Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 956[73.29777]→[73.29777:29801](∅→∅),[73.29801]→[75.9806:9858](∅→∅),[75.9858]→[64.36260:36292](∅→∅),[64.36260]→[64.36260:36292](∅→∅),[64.36292]→[69.16011:16052](∅→∅),[69.16052]→[64.36336:36435](∅→∅),[64.36336]→[64.36336:36435](∅→∅),[64.36435]→[69.16053:16098](∅→∅),[69.16098]→[59.14793:14817](∅→∅),[64.36483]→[59.14793:14817](∅→∅),[59.14793]→[59.14793:14817](∅→∅),[59.14817]→[64.36484:36617](∅→∅),[64.36617]→[69.16099:16138](∅→∅),[69.16138]→[64.36659:36758](∅→∅),[64.36659]→[64.36659:36758](∅→∅),[64.36758]→[69.16139:16182](∅→∅)
});(Some(selection), Task::none())}}Some(Status::UntrackedFile {ix,path,diff_selected: true,}) => (Some(Status::UntrackedFile {ix,path,diff_selected: false,}),Task::none(),),Some(Status::ChangedFile {ix,path,diff_selected: true,}) => (Some(Status::ChangedFile {..}))| None) => (selection, Task::none()),};ctx.state.status = selection;return task;}Primary::Channel => {// todo!()}Primary::EntireLog => {let (selection, task) = match ctx.state.entire_log.take() {Some(LogChange { - replacement in inflorescence/src/selection.rs at line 970[64.36828]→[64.36828:36961](∅→∅),[64.36961]→[69.16183:16290](∅→∅),[69.16290]→[73.29802:29914](∅→∅),[69.16347]→[64.37134:37195](∅→∅),[73.29914]→[64.37134:37195](∅→∅),[64.37134]→[64.37134:37195](∅→∅),[64.37195]→[69.16348:16383](∅→∅),[65.1372]→[64.37196:37205](∅→∅),[69.16383]→[64.37196:37205](∅→∅),[59.15627]→[64.37196:37205](∅→∅),[64.37205]→[54.40638:40640](∅→∅),[54.40638]→[54.40638:40640](∅→∅),[54.40640]→[28.16096:16097](∅→∅),[28.16096]→[28.16096:16097](∅→∅),[28.16097]→[64.37206:37223](∅→∅),[64.37223]→[54.40661:40684](∅→∅),[54.40661]→[54.40661:40684](∅→∅),[63.17763]→[54.40716:40752](∅→∅),[54.40716]→[54.40716:40752](∅→∅),[54.40752]→[73.29915:30007](∅→∅),[73.30007]→[64.37263:37317](∅→∅),[64.37263]→[64.37263:37317](∅→∅),[64.37317]→[63.17764:17839](∅→∅),[54.40802]→[63.17764:17839](∅→∅),[63.17839]→[69.16384:16414](∅→∅),[69.16414]→[70.5837:5865](∅→∅),[70.5865]→[73.30008:30028](∅→∅),[70.5865]→[63.17839:17873](∅→∅),[69.16414]→[63.17839:17873](∅→∅),[73.30028]→[63.17839:17873](∅→∅),[63.17839]→[63.17839:17873](∅→∅),[63.17873]→[59.15670:15706](∅→∅),[59.15670]→[59.15670:15706](∅→∅),[59.15706]→[73.30029:30620](∅→∅),[73.30620]→[75.9859:10085](∅→∅),[75.10085]→[73.30748:30794](∅→∅),[73.30748]→[73.30748:30794](∅→∅),[73.30872]→[73.30872:30986](∅→∅),[73.30986]→[75.10086:10222](∅→∅),[75.10222]→[73.31175:31245](∅→∅),[73.31175]→[73.31175:31245](∅→∅),[73.31782]→[73.31782:31828](∅→∅)
path,diff_selected: false,}),Task::none(),),selection @ (Some(Status::UntrackedFile { .. })| Some(Status::ChangedFile { .. })| Some(Status::LogChange(LogChange {file: None,..}))| None) => (selection, Task::none()),};state.view.status = selection;task}fn select_right(state: &mut State,files_diffs: &diff::FilesState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState,repo: Option<&app::Repo>,) -> Task<crate::Msg> {let Some(app::Repo {state: repo_state,status_nav: _,switching_channel: _,forking_channel: _,entire_log,}) = repo.as_ref()else {return Task::none();};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);// If the log is not loaded yet, the nav will be initialized// once it's loaded (`repo::MsgOut::GotChangeDifs`)if let Some(log) = entire_logs.diffs.get(&id_hash) {// Init log diffs navlet unchanged_sections =diff::unchanged_sections(&log.file);let nav = nav_scrollable::State::default().with_skip_sections(unchanged_sections);entire_logs.diffs_nav = Some((id_hash, nav));};(hash,message,file: - edit in inflorescence/src/selection.rs at line 974[73.31882]→[73.31882:32043](∅→∅),[73.32043]→[75.10223:10261](∅→∅),[75.10261]→[73.32073:32940](∅→∅),[73.32073]→[73.32073:32940](∅→∅),[73.33526]→[73.33526:33732](∅→∅)
ix: 0,path: path.clone(),diff_selected: false,}),Task::none(),)} 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);(Some(LogChange {ix,hash,message,file: Some(LogChangeFileSelection { - replacement in inflorescence/src/selection.rs at line 976
diff_selected: is_diff_scrollable,diff_selected, - replacement in inflorescence/src/selection.rs at line 978[73.33898]→[73.33898:33922](∅→∅),[73.33922]→[75.10262:10296](∅→∅),[75.10296]→[73.33948:34132](∅→∅),[73.33948]→[73.33948:34132](∅→∅)
}),Task::none(),)}selection @ LogChange { .. } => (Some(selection), Task::none()),};state.view.entire_log = selection;return task;}) => {if diff_selected {(Some(LogChange {ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: false,}),}),Task::none(),)} else {let selection = LogChange {ix,hash,message,file: None,};(Some(selection), Task::none())}}selection @ (Some(LogChange { file: None, .. }) | None) => {(selection, Task::none())}};ctx.state.entire_log = selection;return task;} - edit in inflorescence/src/selection.rs at line 1011
Task::none()} - replacement in inflorescence/src/selection.rs at line 1014
let (selection, task): (Option<Status>, Task<crate::Msg>) =match state.view.status.take() {Some(Status::UntrackedFile {ix,path,diff_selected: false,}) => {let id_hash = file::id_parts_hash(&path, file::Kind::Untracked);let diff_selected =diff::file_diff_needs_scrolling(files_diffs, id_hash);(fn select_right(ctx: &mut Ctx<'_>) -> Task<crate::Msg> {match ctx.state.primary {Primary::Status => {let (selection, task): (Option<Status>, Task<crate::Msg>) =match ctx.state.status.take() { - replacement in inflorescence/src/selection.rs at line 1022
diff_selected,}),Task::none(),)}Some(Status::ChangedFile {ix,path,diff_selected: false,}) => {let id_hash = file::id_parts_hash(&path, file::Kind::Changed);let diff_selected =diff::file_diff_needs_scrolling(files_diffs, id_hash);(diff_selected: false,}) => {let id_hash =file::id_parts_hash(&path, file::Kind::Untracked);let diff_selected = diff::file_diff_needs_scrolling(&ctx.navigation.files_diffs,id_hash,);(Some(Status::UntrackedFile {ix,path,diff_selected,}),Task::none(),)} - replacement in inflorescence/src/selection.rs at line 1042[75.11441]→[75.11441:12001](∅→∅),[75.12001]→[64.40599:40752](∅→∅),[54.41902]→[64.40599:40752](∅→∅),[64.40752]→[75.12002:12464](∅→∅)
diff_selected,}),Task::none(),)}Some(Status::LogChange(LogChange {ix,hash,message,file: None,})) => {let log_entry = repo_state.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);// If the log is not loaded yet, the nav will be initialized// once it's loaded (`repo::MsgOut::GotChangeDifs`)if let Some(log) = status_logs.diffs.get(&id_hash) {// Init log diffs navlet unchanged_sections =diff::unchanged_sections(&log.file);let nav = nav_scrollable::State::default().with_skip_sections(unchanged_sections);status_logs.diffs_nav = Some((id_hash, nav));};diff_selected: false,}) => {let id_hash =file::id_parts_hash(&path, file::Kind::Changed);let diff_selected = diff::file_diff_needs_scrolling(&ctx.navigation.files_diffs,id_hash,);(Some(Status::ChangedFile {ix,path,diff_selected,}),Task::none(),)}Some(Status::LogChange(LogChange {ix,hash,message,file: None,})) => {let log_entry = ctx.repo.short_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);// If the log is not loaded yet, the nav will be// initialized once it's// loaded (`repo::MsgOut::GotChangeDifs`)if let Some(log) =ctx.navigation.log_diffs.diffs.get(&id_hash){// Init log diffs navlet unchanged_sections =diff::unchanged_sections(&log.file);let nav = nav_scrollable::State::default().with_skip_sections(unchanged_sections);ctx.navigation.status_logs_navs.diffs_nav =Some((id_hash, nav));}; - replacement in inflorescence/src/selection.rs at line 1086
(Some(LogChangeFileSelection {ix: 0,path: path.clone(),diff_selected: false,}),Task::none(),)} else {(None, Task::none())(Some(LogChangeFileSelection {ix: 0,path: path.clone(),diff_selected: false,}),Task::none(),)} else {(None, Task::none())};(Some(Status::LogChange(LogChange {ix,hash,message,file,})),task,)}Some(Status::LogChange(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 = log::log_diff_needs_scrolling(&ctx.navigation.status_logs_navs,id_hash,);(Some(Status::LogChange(LogChange {ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: is_diff_scrollable,}),})),Task::none(),)}selection => (selection, Task::none()), - replacement in inflorescence/src/selection.rs at line 1139
(Some(Status::LogChange(LogChange {ctx.state.status = selection;return task;}Primary::Channel => {// TODO}Primary::EntireLog => {if let Some(Log::Loaded { log }) = ctx.logs.entire_log.as_ref()&& let Some(entire_log) = ctx.state.entire_log.take(){let (selection, task) = match entire_log {LogChange { - replacement in inflorescence/src/selection.rs at line 1154[75.12975]→[75.12975:13030](∅→∅),[75.13030]→[54.42145:42189](∅→∅),[54.42145]→[54.42145:42189](∅→∅),[54.42189]→[75.13031:13231](∅→∅),[75.13231]→[64.42364:42401](∅→∅),[64.42364]→[64.42364:42401](∅→∅),[64.42401]→[54.43259:43289](∅→∅),[54.43259]→[54.43259:43289](∅→∅),[54.43289]→[75.13232:13278](∅→∅),[75.13278]→[54.43328:43352](∅→∅),[73.35150]→[54.43328:43352](∅→∅),[54.43328]→[54.43328:43352](∅→∅),[54.43352]→[75.13279:13556](∅→∅)
file,})),task,)}Some(Status::LogChange(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(status_logs, id_hash);(Some(Status::LogChange(LogChange {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);// If the log is not loaded yet, the nav will be// initialized once it's// loaded (`repo::MsgOut::GotChangeDifs`)if let Some(log) =ctx.navigation.log_diffs.diffs.get(&id_hash){// Init log diffs navlet unchanged_sections =diff::unchanged_sections(&log.file);let nav = nav_scrollable::State::default().with_skip_sections(unchanged_sections);ctx.navigation.entire_logs_navs.diffs_nav =Some((id_hash, nav));};(Some(LogChangeFileSelection {ix: 0,path: path.clone(),diff_selected: false,}),Task::none(),)} else {(None, Task::none())};(Some(LogChange {ix,hash,message,file,}),task,)}LogChange { - replacement in inflorescence/src/selection.rs at line 1202
file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: is_diff_scrollable,}),})),Task::none(),)file:Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: false,}),} => {let id_hash = file::log_id_parts_hash(hash, &path);let is_diff_scrollable = log::log_diff_needs_scrolling(&ctx.navigation.entire_logs_navs,id_hash,);(Some(LogChange {ix,hash,message,file: Some(LogChangeFileSelection {ix: file_ix,path,diff_selected: is_diff_scrollable,}),}),Task::none(),)}selection @ LogChange { .. } => {(Some(selection), Task::none())}};ctx.state.entire_log = selection;return task; - replacement in inflorescence/src/selection.rs at line 1235[75.13964]→[75.13964:14027](∅→∅),[75.14027]→[69.16825:16860](∅→∅),[64.42523]→[69.16825:16860](∅→∅),[65.1426]→[59.15837:15846](∅→∅),[69.16860]→[59.15837:15846](∅→∅),[59.15837]→[59.15837:15846](∅→∅)
selection => (selection, Task::none()),};state.view.status = selection;task}}Task::none() - replacement in inflorescence/src/selection.rs at line 1241[58.609]→[55.7150:7242](∅→∅),[55.7150]→[55.7150:7242](∅→∅),[55.7242]→[64.42524:42563](∅→∅),[64.42563]→[55.7286:7301](∅→∅),[55.7286]→[55.7286:7301](∅→∅)
fn release<M>(dir: Dir,state: &mut State,files_diffs: &mut diff::FilesState,logs: &mut diff::LogFilesAndState,) -> Task<M> {fn release<M>(dir: Dir, ctx: &mut Ctx<'_>) -> Task<M> {let Ctx {state,files: _,navigation,repo: _,logs: _,} = ctx; - replacement in inflorescence/src/selection.rs at line 1253
match state.view.status.as_mut() {match state.status.as_mut() { - replacement in inflorescence/src/selection.rs at line 1261
if let Some(nav) = files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {if let Some(nav) =navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},){ - replacement in inflorescence/src/selection.rs at line 1278
if let Some(nav) = files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {if let Some(nav) =navigation.files_diffs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},){ - replacement in inflorescence/src/selection.rs at line 1300
if let Some(nav) = logs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},) {if let Some(nav) =navigation.status_logs_navs.diffs_nav.as_mut().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},){ - edit in inflorescence/src/selection.rs at line 1319[54.46062]→[54.46062:46063](∅→∅),[54.46063]→[72.37:54](∅→∅),[72.54]→[54.46083:46155](∅→∅),[54.46083]→[54.46083:46155](∅→∅),[54.46155]→[75.14220:14254](∅→∅),[75.14254]→[72.55:95](∅→∅),[63.17970]→[72.55:95](∅→∅),[72.95]→[73.35312:35404](∅→∅),[73.35404]→[72.134:158](∅→∅),[72.134]→[72.134:158](∅→∅),[72.158]→[63.17971:18023](∅→∅),[54.46273]→[63.17971:18023](∅→∅),[63.18023]→[72.159:179](∅→∅),[72.179]→[69.17192:17222](∅→∅),[63.18046]→[69.17192:17222](∅→∅),[69.17222]→[70.5866:5894](∅→∅),[70.5894]→[73.35405:35425](∅→∅),[70.5894]→[63.18046:18107](∅→∅),[69.17222]→[63.18046:18107](∅→∅),[73.35425]→[63.18046:18107](∅→∅),[63.18046]→[63.18046:18107](∅→∅)
fn select_exact(select: Select,state: &mut State,files: &mut file::State,repo: Option<&mut app::Repo>,files_diffs: &mut diff::FilesState,status_logs: &mut diff::LogFilesAndState,entire_logs: &mut diff::LogFilesAndState,) -> Task<crate::Msg> {let Some(app::Repo {state: repo_state,status_nav,switching_channel: _,forking_channel: _,entire_log,}) = repoelse {return Task::none();}; - replacement in inflorescence/src/selection.rs at line 1320
if let Some(app::EntireLog::Got { log, nav }) = entire_log.as_mut() {let (selection, task) = match select {Select::LogChange {ix,hash: _,message: _,} => {let (selection, task) = entire_log_selection(nav,entire_logs,log,fn select_exact(select: Select, ctx: &mut Ctx<'_>) -> Task<crate::Msg> {match ctx.state.primary {Primary::Status => {let (selection, task) = match select {Select::UntrackedFile { ix, path } => {let id = file::Id {path: path.clone(),file_kind: file::Kind::Changed,};file::load_src_file_if_not_cached(ctx.files, id);let (selection, selection_task) =untracked_file_selection(ix, VDir::Down, ctx);(Some(selection), selection_task)}Select::ChangedFile { ix, path } => {let id = file::Id {path: path.clone(),file_kind: file::Kind::Changed,};if let Some(diffs) = ctx.repo.changed_files.get(&path)&& diff::any_diff_has_contents(diffs){file::load_src_file_if_not_cached(ctx.files, id);}let (selection, selection_task) =changed_file_selection(ix, VDir::Down, ctx);(Some(selection), selection_task)}Select::LogChange { - replacement in inflorescence/src/selection.rs at line 1350
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 (file, selection_task) = log_file_selection(entire_logs,log_entry,hash,file_ix,);let selection = Some(LogChange {hash: _,message: _,} => {let (selection, task) =status_log_selection(ix, VDir::Down, ctx);(Some(selection), task)}Select::LogChangeFile {ix: file_ix,path: _,} => match ctx.state.status.take() {Some(Status::LogChange(LogChange { - replacement in inflorescence/src/selection.rs at line 1365[73.36199]→[75.14992:15106](∅→∅),[75.15106]→[73.37988:38006](∅→∅),[73.37988]→[73.37988:38006](∅→∅),[73.38006]→[75.15107:15178](∅→∅),[75.15178]→[73.38020:38165](∅→∅),[73.38020]→[73.38020:38165](∅→∅)
file: Some(file),});(selection, selection_task)}selection => (selection, Task::none()),},_ => {unreachable!()}};state.view.entire_log = selection;return task;}file: _,})) => {let log_entry = ctx.repo.short_log.get(log_ix).unwrap(); - replacement in inflorescence/src/selection.rs at line 1369
let (selection, task) = match select {Select::UntrackedFile { ix, path } => {let id = file::Id {path: path.clone(),file_kind: file::Kind::Changed,let (file, selection_task) = status_log_file_selection(file_ix,hash,VDir::Down,ctx.navigation,log_entry,);let selection = Some(Status::LogChange(LogChange {ix: log_ix,hash,message,file: Some(file),}));(selection, selection_task)}selection => (selection, Task::none()),}, - replacement in inflorescence/src/selection.rs at line 1388
file::load_src_file_if_not_cached(files, id);let (selection, selection_task) = untracked_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,);(Some(selection), selection_task)ctx.state.status = selection;return task; - replacement in inflorescence/src/selection.rs at line 1391[54.47472]→[54.47472:47649](∅→∅),[54.47695]→[63.18108:18177](∅→∅),[63.18177]→[58.784:838](∅→∅),[54.47805]→[58.784:838](∅→∅),[58.838]→[54.47805:47819](∅→∅),[54.47805]→[54.47805:47819](∅→∅),[54.47819]→[58.839:901](∅→∅),[58.901]→[49.1460:1474](∅→∅),[54.47959]→[49.1460:1474](∅→∅),[49.1460]→[49.1460:1474](∅→∅),[72.608]→[72.608:852](∅→∅),[72.852]→[75.15226:15272](∅→∅)
Select::ChangedFile { ix, path } => {let id = file::Id {path: path.clone(),file_kind: file::Kind::Changed,};if let Some(diffs) = repo_state.changed_files.get(&path)&& diff::any_diff_has_contents(diffs){file::load_src_file_if_not_cached(files, id);}let (selection, selection_task) = changed_file_selection(repo_state,status_nav,ix,files,files_diffs,VertDir::Down,);(Some(selection), selection_task)Primary::Channel => {// TODO - replacement in inflorescence/src/selection.rs at line 1394[72.936]→[72.936:1040](∅→∅),[72.1040]→[73.38167:38376](∅→∅),[73.38376]→[72.1156:1192](∅→∅),[72.1156]→[72.1156:1192](∅→∅),[72.1192]→[28.23134:23144](∅→∅),[54.48821]→[28.23134:23144](∅→∅),[28.23134]→[28.23134:23144](∅→∅),[28.23144]→[75.15273:15634](∅→∅)
Select::LogChange {ix,hash: _,message: _,} => {let (selection, task) = status_log_selection(status_nav,status_logs,repo_state,ix,VertDir::Down,);(Some(selection), task)}Select::LogChangeFile {ix: file_ix,path: _,} => match state.view.status.take() {Some(Status::LogChange(LogChange {ix: log_ix,hash,message,file: _,})) => {let log_entry = repo_state.log.get(log_ix).unwrap();Primary::EntireLog => {if let Some(Log::Loaded { log }) = ctx.logs.entire_log.as_ref() {let (selection, task) = match select {Select::LogChange {ix,hash: _,message: _,} => {let (selection, task) =entire_log_selection(ix, VDir::Down, ctx, log);(Some(selection), task)}Select::LogChangeFile {ix: file_ix,path: _,} => match ctx.state.entire_log.take() {Some(LogChange {ix: log_ix,hash,message,file: _,}) => {let log_entry = log.get(log_ix).unwrap(); - replacement in inflorescence/src/selection.rs at line 1418
let (file, selection_task) =log_file_selection(status_logs, log_entry, hash, file_ix);let (file, selection_task) =status_log_file_selection(file_ix,hash,VDir::Down,ctx.navigation,log_entry,); - replacement in inflorescence/src/selection.rs at line 1427[75.15760]→[75.15760:15827](∅→∅),[75.15827]→[72.1193:1225](∅→∅),[73.38428]→[72.1193:1225](∅→∅),[69.17437]→[72.1193:1225](∅→∅),[72.1225]→[54.49242:49297](∅→∅),[54.49242]→[54.49242:49297](∅→∅),[54.49297]→[75.15828:15931](∅→∅)
let selection = Some(Status::LogChange(LogChange {ix: log_ix,hash,message,file: Some(file),}));(selection, selection_task)let selection = Some(LogChange {ix: log_ix,hash,message,file: Some(file),});(selection, selection_task)}selection => (selection, Task::none()),},_ => {unreachable!()}};ctx.state.entire_log = selection;return task; - replacement in inflorescence/src/selection.rs at line 1444[54.50603]→[75.15932:15995](∅→∅),[29.12008]→[28.26570:26577](∅→∅),[75.15995]→[28.26570:26577](∅→∅),[28.26570]→[28.26570:26577](∅→∅),[28.26577]→[69.17488:17523](∅→∅),[65.1565]→[54.50637:50646](∅→∅),[69.17523]→[54.50637:50646](∅→∅),[54.50637]→[54.50637:50646](∅→∅)
selection => (selection, Task::none()),},};state.view.status = selection;task}}Task::none() - replacement in inflorescence/src/selection.rs at line 1472
pub enum VertDir {pub enum VDir { - edit in inflorescence/src/selection.rs at line 1478
repo: &repo::State,status_nav: &mut nav_scrollable::State, - replacement in inflorescence/src/selection.rs at line 1479
files: &mut file::State,files_diffs: &mut diff::FilesState,dir: VertDir,dir: VDir,ctx: &mut Ctx<'_>, - edit in inflorescence/src/selection.rs at line 1482
let Ctx {state: _,files,navigation,repo,logs: _,} = ctx; - replacement in inflorescence/src/selection.rs at line 1498
files_diffs.diffs_nav = Some((id_hash, nav));navigation.files_diffs.diffs_nav = Some((id_hash, nav)); - replacement in inflorescence/src/selection.rs at line 1512
VertDir::Up => nav_scrollable::scroll_up_to_section(status_nav,VDir::Up => nav_scrollable::scroll_up_to_section(&mut navigation.status_nav, - replacement in inflorescence/src/selection.rs at line 1516
VertDir::Down => nav_scrollable::scroll_down_to_section(status_nav,VDir::Down => nav_scrollable::scroll_down_to_section(&mut navigation.status_nav, - edit in inflorescence/src/selection.rs at line 1532
repo: &repo::State,status_nav: &mut nav_scrollable::State, - replacement in inflorescence/src/selection.rs at line 1533
files: &mut file::State,files_diffs: &mut diff::FilesState,dir: VertDir,dir: VDir,ctx: &mut Ctx<'_>, - edit in inflorescence/src/selection.rs at line 1536
let Ctx {state: _,files,navigation,repo,logs: _,} = ctx; - replacement in inflorescence/src/selection.rs at line 1552
files_diffs.diffs_nav = Some((id_hash, nav));navigation.files_diffs.diffs_nav = Some((id_hash, nav)); - edit in inflorescence/src/selection.rs at line 1561
dbg!(diff::any_diff_has_contents(diffs)); - replacement in inflorescence/src/selection.rs at line 1569
VertDir::Up => nav_scrollable::scroll_up_to_section(status_nav,VDir::Up => nav_scrollable::scroll_up_to_section(&mut navigation.status_nav, - replacement in inflorescence/src/selection.rs at line 1573
VertDir::Down => nav_scrollable::scroll_down_to_section(status_nav,VDir::Down => nav_scrollable::scroll_down_to_section(&mut navigation.status_nav, - edit in inflorescence/src/selection.rs at line 1586
}fn channel_selection(ix: usize,dir: VDir,ctx: &mut Ctx<'_>,) -> (Channel, Task<crate::Msg>) {let Ctx {state: _,files: _,navigation,repo,logs,} = ctx;let name = repo.other_channels.get(ix).unwrap().clone();let task = if logs.other_channels_logs.contains_key(&name) {Task::none()} else {Task::done(crate::Msg::View(app::Msg::ToRepo(repo::MsgIn::LoadOtherChannelLog(name.clone()),)))};match dir {VDir::Up => nav_scrollable::scroll_up_to_section(&mut navigation.other_channels_nav,ix,),VDir::Down => nav_scrollable::scroll_down_to_section(&mut navigation.other_channels_nav,ix,),}let selection = Channel {ix,name,log: None,};(selection, task) - edit in inflorescence/src/selection.rs at line 1629
status_nav: &mut nav_scrollable::State,logs: &mut diff::LogFilesAndState,repo: &repo::State, - replacement in inflorescence/src/selection.rs at line 1630
dir: VertDir,dir: VDir,ctx: &mut Ctx<'_>, - replacement in inflorescence/src/selection.rs at line 1633
let entry = repo.log.get(ix).unwrap();let Ctx {state: _,files: _,navigation,repo,logs: _,} = ctx;let entry = repo.short_log.get(ix).unwrap(); - replacement in inflorescence/src/selection.rs at line 1643
let task = if logs.changes_with_loaded_diffs.contains(&hash) {let task = if navigation.log_diffs.changes_with_loaded_diffs.contains(&hash){ - replacement in inflorescence/src/selection.rs at line 1650
logs.changes_nav = Some((hash, nav));navigation.status_logs_navs.files_nav = Some((hash, nav)); - replacement in inflorescence/src/selection.rs at line 1661
VertDir::Up => nav_scrollable::scroll_up_to_section(status_nav,VDir::Up => nav_scrollable::scroll_up_to_section(&mut navigation.status_nav, - replacement in inflorescence/src/selection.rs at line 1665
VertDir::Down => nav_scrollable::scroll_down_to_section(status_nav,VDir::Down => nav_scrollable::scroll_down_to_section(&mut navigation.status_nav, - edit in inflorescence/src/selection.rs at line 1682
nav: &mut nav_scrollable::State,logs: &mut diff::LogFilesAndState,log: &repo::Log, - replacement in inflorescence/src/selection.rs at line 1683
dir: VertDir,dir: VDir,ctx: &mut Ctx<'_>,log: &repo::Log, - edit in inflorescence/src/selection.rs at line 1687
let Ctx {state: _,files: _,navigation,repo: _,logs: _,} = ctx; - replacement in inflorescence/src/selection.rs at line 1697
let task = if logs.changes_with_loaded_diffs.contains(&hash) {let task = if navigation.log_diffs.changes_with_loaded_diffs.contains(&hash){ - replacement in inflorescence/src/selection.rs at line 1704
logs.changes_nav = Some((hash, nav));navigation.entire_logs_navs.files_nav = Some((hash, nav)); - replacement in inflorescence/src/selection.rs at line 1715
VertDir::Up => nav_scrollable::scroll_up_to_section(nav, ix),VertDir::Down => nav_scrollable::scroll_down_to_section(nav, ix),VDir::Up => nav_scrollable::scroll_up_to_section(&mut navigation.entire_log_nav,ix,),VDir::Down => nav_scrollable::scroll_down_to_section(&mut navigation.entire_log_nav,ix,), - replacement in inflorescence/src/selection.rs at line 1735
fn log_file_selection(logs: &mut diff::LogFilesAndState,log_entry: &repo::LogEntry,fn status_log_file_selection(ix: usize, - replacement in inflorescence/src/selection.rs at line 1738
file_ix: usize,dir: VDir,navigation: &mut Navigation,log_entry: &repo::LogEntry, - replacement in inflorescence/src/selection.rs at line 1742
let path = log_entry.file_paths.get(file_ix).unwrap().clone();let path = log_entry.file_paths.get(ix).unwrap().clone(); - replacement in inflorescence/src/selection.rs at line 1747
if logs.diffs.contains_key(&id_hash) {let needs_new_nav = logs.diffs_nav.is_none()|| logsif navigation.log_diffs.changes_with_loaded_diffs.contains(&hash){let needs_new_nav = navigation.status_logs_navs.diffs_nav.is_none()|| navigation.status_logs_navs - replacement in inflorescence/src/selection.rs at line 1762
logs.diffs_nav = Some((id_hash, nav));navigation.status_logs_navs.diffs_nav = Some((id_hash, nav)); - edit in inflorescence/src/selection.rs at line 1765
if let Some((selected_hash, nav)) =&mut navigation.status_logs_navs.files_nav&& *selected_hash == hash{match dir {VDir::Up => nav_scrollable::scroll_up_to_section(nav, ix),VDir::Down => nav_scrollable::scroll_down_to_section(nav, ix),}} - replacement in inflorescence/src/selection.rs at line 1778
ix: file_ix,ix, - replacement in inflorescence/src/selection.rs at line 1787
logs: &mut diff::LogFilesAndState,log_entry: &repo::LogEntry,ix: usize, - replacement in inflorescence/src/selection.rs at line 1789
file_ix: usize,dir: VDir,navigation: &mut Navigation,log_entry: &repo::LogEntry, - replacement in inflorescence/src/selection.rs at line 1793
let path = log_entry.file_paths.get(file_ix).unwrap().clone();let path = log_entry.file_paths.get(ix).unwrap().clone(); - replacement in inflorescence/src/selection.rs at line 1798
if logs.diffs.contains_key(&id_hash) {let needs_new_nav = logs.diffs_nav.is_none()|| logsif navigation.log_diffs.changes_with_loaded_diffs.contains(&hash){let needs_new_nav = navigation.entire_logs_navs.diffs_nav.is_none()|| navigation.entire_logs_navs - replacement in inflorescence/src/selection.rs at line 1813
logs.diffs_nav = Some((id_hash, nav));navigation.entire_logs_navs.diffs_nav = Some((id_hash, nav)); - edit in inflorescence/src/selection.rs at line 1817
if let Some((selected_hash, nav)) =&mut navigation.entire_logs_navs.files_nav&& *selected_hash == hash{match dir {VDir::Up => nav_scrollable::scroll_up_to_section(nav, ix),VDir::Down => nav_scrollable::scroll_down_to_section(nav, ix),}} - replacement in inflorescence/src/selection.rs at line 1829
ix: file_ix,ix, - edit in inflorescence/src/selection.rs at line 1835
}fn channel_selection(ix: usize, channels: &[String]) -> Channel {let name = channels.get(ix).unwrap().clone();Channel { ix, name } - edit in inflorescence/src/main.rs at line 3
mod log; - replacement in inflorescence/src/main.rs at line 10
use inflorescence_view::app::RecordMsg;use inflorescence_model::{self as model, Log, Logs, ReadyState, RecordMsg, State as MState,SubState as MSubState,}; - edit in inflorescence/src/main.rs at line 30
use std::cmp;use std::collections::BTreeSet; - edit in inflorescence/src/main.rs at line 32
use std::{cmp, mem}; - edit in inflorescence/src/main.rs at line 75
let selection = selection::State::default(); - edit in inflorescence/src/main.rs at line 95
id: None,window_size, - edit in inflorescence/src/main.rs at line 96
repo_path, - edit in inflorescence/src/main.rs at line 97[9.6018]→[9.6018:6075](∅→∅),[9.6075]→[69.18034:18057](∅→∅),[69.18057]→[8.100:130](∅→∅),[6.1520]→[8.100:130](∅→∅)
repo: None, // This is loaded by `repo_task`selection,record_msg: None, - replacement in inflorescence/src/main.rs at line 98
files_diffs: diff::FilesState::default(),status_logs: diff::LogFilesAndState::default(),entire_logs: diff::LogFilesAndState::default(),sub: MState {window_size,repo_path,sub: MSubState::Loading {user_ids: Vec::new(),repo: None,},}, - edit in inflorescence/src/main.rs at line 113
id: Option<Id>,window_size: iced::Size, - edit in inflorescence/src/main.rs at line 114
repo_path: PathBuf, - edit in inflorescence/src/main.rs at line 115[9.6144]→[62.4371:4400](∅→∅),[62.4400]→[69.18058:18091](∅→∅),[69.18091]→[13.23:58](∅→∅),[5.652]→[13.23:58](∅→∅)
repo: Option<app::Repo>,selection: selection::State,record_msg: Option<RecordMsg>, - replacement in inflorescence/src/main.rs at line 117[29.189]→[73.42418:42485](∅→∅),[73.42485]→[54.8925:8960](∅→∅),[51.3085]→[54.8925:8960](∅→∅),[54.8960]→[73.42486:42705](∅→∅)
/// Diffs for untracked and changed files shown in status viewfiles_diffs: diff::FilesState,/// 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,sub: inflorescence_model::State, - replacement in inflorescence/src/main.rs at line 137
state.id = Some(*id);match &mut state.sub.sub {MSubState::Loading { user_ids, repo } => {// TODO switch to `SelectingId` if more than one id foundif let Some(repo) = repo.take() {state.sub.sub = MSubState::Ready(ReadyState {user_id: *id,repo,selection: default(),navigation: default(),record_msg: default(),forking_channel_name: default(),logs: default(),})} else {user_ids.push(*id);}}MSubState::SelectingId { .. } => unreachable!(),MSubState::Ready(..) => {unreachable!()}} - replacement in inflorescence/src/main.rs at line 166
start_task_to_manage_repo(state.repo_path.clone());start_task_to_manage_repo(state.sub.repo_path.clone()); - replacement in inflorescence/src/main.rs at line 177[32.26187]→[62.4401:4571](∅→∅),[62.4571]→[53.37:76](∅→∅),[50.2762]→[53.37:76](∅→∅),[53.76]→[64.8104:8129](∅→∅),[53.128]→[53.128:188](∅→∅)
let loaded = file::update(&mut state.files,state.repo.as_ref().map(|repo| &repo.state),msg,);if let Some(file::Loaded {id_hash,unchanged_sections,}) = loadedif let Some(ReadyState {repo,navigation,selection,..}) = model::ready_mut(&mut state.sub) - replacement in inflorescence/src/main.rs at line 184[53.202]→[75.19674:19794](∅→∅),[75.19794]→[64.8130:8198](∅→∅),[53.360]→[64.8130:8198](∅→∅),[64.8198]→[75.19795:19864](∅→∅)
let nav = nav_scrollable::State::default().with_skip_sections(unchanged_sections);state.files_diffs.diffs_nav = Some((id_hash, nav));state.files_diffs.diffs.entry(id_hash).or_default();let loaded = file::update(&mut state.files, repo, msg);if let Some(file::Loaded {id_hash,unchanged_sections,}) = loaded{let is_selected = match selection.status.as_ref() {Some(selection::Status::UntrackedFile {ix: _,path,diff_selected: _,}) => {let selected_id_hash = file::id_parts_hash(path,file::Kind::Untracked,);selected_id_hash == id_hash}Some(selection::Status::ChangedFile {ix: _,path,diff_selected: _,}) => {let selected_id_hash =file::id_parts_hash(path, file::Kind::Changed);selected_id_hash == id_hash}_ => false,};if is_selected {let nav = nav_scrollable::State::default().with_skip_sections(unchanged_sections);navigation.files_diffs.diffs_nav = Some((id_hash, nav));}navigation.files_diffs.diffs.entry(id_hash).or_default();} - replacement in inflorescence/src/main.rs at line 234
state.window_size = size;state.sub.window_size = size; - replacement in inflorescence/src/main.rs at line 267
if let Some(repo) = state.repo.as_mut() {if let Some(ReadyState {repo,navigation: _,selection,forking_channel_name,..}) = model::ready_mut(&mut state.sub){ - replacement in inflorescence/src/main.rs at line 276
if repo.switching_channel {if let Some(selection::Channel { ix: _, name }) =state.selection.view.channel.take()if matches!(selection.primary, selection::Primary::Channel) {if let Some(selection::Channel {ix: _,name,log: _,}) = selection.channel.take() - replacement in inflorescence/src/main.rs at line 288
repo.switching_channel = false;selection.primary = selection::Primary::default(); - replacement in inflorescence/src/main.rs at line 291
repo.forking_channel.take_if(|name| {forking_channel_name.take_if(|name| { - replacement in inflorescence/src/main.rs at line 295
!repo.state.other_channels.iter().any(|n| n == name)repo.channel != name&& !repo.other_channels.iter().any(|n| n == name) - replacement in inflorescence/src/main.rs at line 313
if let Some(RecordMsg::Typing(content)) = state.record_msg.as_ref()if let Some(ReadyState {selection,record_msg,forking_channel_name,..}) = model::ready_mut(&mut state.sub) - replacement in inflorescence/src/main.rs at line 320
state.record_msg = Some(RecordMsg::Canceled {old_msg: content.text(),});}if let Some(repo) = state.repo.as_mut() {if repo.switching_channel {repo.switching_channel = false;state.selection.view.channel = None;} else if repo.forking_channel.is_some() {repo.forking_channel = None;} else if let Some(app::EntireLog::Got { log, nav }) = repo.entire_log.take_if(|log| matches!(log, app::EntireLog::Got { .. })){// Cache for later viewingrepo.entire_log =Some(app::EntireLog::NotViewing { log, nav });if let Some(RecordMsg::Typing(content)) = record_msg.as_ref() {*record_msg = Some(RecordMsg::Canceled {old_msg: content.text(),});}match selection.primary {selection::Primary::Status => {if forking_channel_name.is_some() {*forking_channel_name = None;}}selection::Primary::Channel| selection::Primary::EntireLog => {selection.primary = selection::Primary::default();} - replacement in inflorescence/src/main.rs at line 339[69.18886]→[69.18886:18941](∅→∅),[69.18941]→[64.9017:9034](∅→∅),[64.9017]→[64.9017:9034](∅→∅),[64.9034]→[69.18942:18976](∅→∅),[69.18976]→[64.9065:9131](∅→∅),[64.9065]→[64.9065:9131](∅→∅),[64.9131]→[73.43488:43560](∅→∅),[73.43560]→[64.9160:9204](∅→∅),[64.9160]→[64.9160:9204](∅→∅)
app::Msg::Selection(msg) => selection::update(msg,&mut state.selection,&mut state.files,&mut state.files_diffs,&mut state.status_logs,&mut state.entire_logs,state.repo.as_mut(),),app::Msg::Selection(msg) => {if let Some(ReadyState {repo,selection,navigation,logs,..}) = model::ready_mut(&mut state.sub){return selection::update(msg,selection,&mut state.files,navigation,repo,logs,);}Task::none()} - replacement in inflorescence/src/main.rs at line 371
if let Some(repo) = state.repo.as_mut() {repo.switching_channel = true;if let Some(ReadyState { selection, .. }) =model::ready_mut(&mut state.sub){selection.primary = selection::Primary::Channel; - replacement in inflorescence/src/main.rs at line 379
if let Some(repo) = state.repo.as_mut() {repo.forking_channel = Some(String::new());if let Some(ReadyState {forking_channel_name,..}) = model::ready_mut(&mut state.sub){*forking_channel_name = Some(String::new()); - replacement in inflorescence/src/main.rs at line 390
if let Some(repo) = state.repo.as_mut() {repo.forking_channel = Some(name);if let Some(ReadyState {forking_channel_name,..}) = model::ready_mut(&mut state.sub){*forking_channel_name = Some(name); - replacement in inflorescence/src/main.rs at line 407
if let Some(repo) = state.repo.as_mut() {match repo.entire_log.as_ref() {if let Some(ReadyState {selection, logs, ..}) = model::ready_mut(&mut state.sub){selection.primary = selection::Primary::EntireLog;match logs.entire_log.as_ref() { - replacement in inflorescence/src/main.rs at line 418[73.44227]→[73.44227:44621](∅→∅),[73.44621]→[76.3198:3274](∅→∅),[76.3274]→[75.20100:20151](∅→∅),[75.20100]→[75.20100:20151](∅→∅),[75.20151]→[76.3275:3486](∅→∅)
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 loglet Some(app::EntireLog::NotViewing { log, nav }) =repo.entire_log.take()else {unreachable!()};repo.entire_log =Some(app::EntireLog::Got { log, nav });logs.entire_log = Some(Log::Loading); - replacement in inflorescence/src/main.rs at line 420
Some(app::EntireLog::Loading | app::EntireLog::Got { .. },) => {}Some(Log::Loading | Log::Loaded { .. }) => {} - replacement in inflorescence/src/main.rs at line 431
repo::MsgOut::Refreshed(repo) => repo_refreshed(state, repo),repo::MsgOut::Refreshed {state: repo_state,invalidate_logs,} => repo_refreshed(state, repo_state, invalidate_logs), - edit in inflorescence/src/main.rs at line 437
repo::MsgOut::Recorded(repo) => repo_refreshed(state, repo), - edit in inflorescence/src/main.rs at line 441
repo::MsgOut::LoadedOtherChannelLog { channel, log } => {loaded_other_channel_log(state, channel, log)} - replacement in inflorescence/src/main.rs at line 448[39.1265]→[62.4983:5058](∅→∅),[62.5058]→[69.19165:19195](∅→∅),[69.19195]→[70.7815:7843](∅→∅),[70.7843]→[73.47202:47225](∅→∅),[70.7843]→[62.5058:5087](∅→∅),[69.19195]→[62.5058:5087](∅→∅),[73.47225]→[62.5058:5087](∅→∅),[62.5058]→[62.5058:5087](∅→∅)
if let Some(app::Repo {state: repo_state,status_nav,switching_channel: _,forking_channel: _,entire_log: _,}) = state.repo.as_mut()if let Some(ReadyState {repo,selection,navigation,logs,..}) = model::ready_mut(&mut state.sub) - replacement in inflorescence/src/main.rs at line 459
}) = state.selection.view.status.as_ref()}) = selection.status.as_ref() - replacement in inflorescence/src/main.rs at line 466
let removed = repo_state.untracked_files.remove(path);debug_assert!(removed,"{:?}, path: {path}",repo_state.untracked_files);repo_state.changed_fileslet removed = repo.untracked_files.remove(path);debug_assert!(removed, "{:?}, path: {path}", repo.untracked_files);repo.changed_files - edit in inflorescence/src/main.rs at line 473[62.5327]→[69.19303:19339](∅→∅),[69.19339]→[75.20271:20334](∅→∅),[75.20334]→[62.5546:5584](∅→∅),[62.5546]→[62.5546:5584](∅→∅),[62.5584]→[64.9884:9885](∅→∅)
// Re-initialize status navlet new_status_nav = nav_scrollable::State::default();*status_nav = new_status_nav; - replacement in inflorescence/src/main.rs at line 474
if repo_state.untracked_files.is_empty() {state.selection.view.status = None;if repo.untracked_files.is_empty() {selection.status = None; - replacement in inflorescence/src/main.rs at line 477
let ix = cmp::min(*ix, repo_state.untracked_files.len() - 1);let (selection, selection_task) =let ix = cmp::min(*ix, repo.untracked_files.len() - 1);let (new_selection, selection_task) = - edit in inflorescence/src/main.rs at line 480
repo_state,status_nav, - replacement in inflorescence/src/main.rs at line 481
&mut state.files,&mut state.files_diffs,selection::VertDir::Down,selection::VDir::Down,&mut selection::Ctx {state: selection,files: &mut state.files,navigation,repo,logs,}, - replacement in inflorescence/src/main.rs at line 491
state.selection.view.status = Some(selection);selection.status = Some(new_selection); - replacement in inflorescence/src/main.rs at line 501[39.2373]→[62.5967:6042](∅→∅),[62.6042]→[69.19783:19813](∅→∅),[69.19813]→[70.7844:7872](∅→∅),[70.7872]→[73.47226:47249](∅→∅),[70.7872]→[62.6042:6071](∅→∅),[69.19813]→[62.6042:6071](∅→∅),[73.47249]→[62.6042:6071](∅→∅),[62.6042]→[62.6042:6071](∅→∅)
if let Some(app::Repo {state: repo_state,status_nav,switching_channel: _,forking_channel: _,entire_log: _,}) = state.repo.as_mut()if let Some(ReadyState {repo,selection,navigation,logs,..}) = model::ready_mut(&mut state.sub) - replacement in inflorescence/src/main.rs at line 512
}) = state.selection.view.status.as_ref()}) = selection.status.as_ref() - replacement in inflorescence/src/main.rs at line 514
let diffs = repo_state.changed_files.get(path).unwrap();let diffs = repo.changed_files.get(path).unwrap(); - replacement in inflorescence/src/main.rs at line 525
let removed = repo_state.changed_files.remove(path);let removed = repo.changed_files.remove(path); - replacement in inflorescence/src/main.rs at line 530
repo_state.changed_filesrepo.changed_files - replacement in inflorescence/src/main.rs at line 533
repo_state.untracked_files.insert(path.clone());repo.untracked_files.insert(path.clone()); - edit in inflorescence/src/main.rs at line 535[62.6308]→[62.6308:6341](∅→∅),[62.6341]→[75.20450:20517](∅→∅),[75.20517]→[62.6543:6585](∅→∅),[62.6543]→[62.6543:6585](∅→∅),[62.6585]→[64.10446:10447](∅→∅)
// Re-initialize navlet new_status_nav = nav_scrollable::State::default();*status_nav = new_status_nav; - replacement in inflorescence/src/main.rs at line 536
if repo_state.changed_files.is_empty() {state.selection.view.status = Noneif repo.changed_files.is_empty() {selection.status = None - replacement in inflorescence/src/main.rs at line 539
let ix = cmp::min(*ix, repo_state.changed_files.len() - 1);let (selection, selection_task) =let ix = cmp::min(*ix, repo.changed_files.len() - 1);let (new_selection, selection_task) = - edit in inflorescence/src/main.rs at line 542
repo_state,status_nav, - replacement in inflorescence/src/main.rs at line 543
&mut state.files,&mut state.files_diffs,selection::VertDir::Down,selection::VDir::Down,&mut selection::Ctx {state: selection,files: &mut state.files,navigation,repo,logs,}, - replacement in inflorescence/src/main.rs at line 553
state.selection.view.status = Some(selection);selection.status = Some(new_selection); - replacement in inflorescence/src/main.rs at line 564[39.3780]→[39.3780:3926](∅→∅),[39.3926]→[15.2052:2062](∅→∅),[15.2052]→[15.2052:2062](∅→∅),[15.2062]→[62.7011:7060](∅→∅)
if let Some(repo) = state.repo.as_ref() {if state.id.is_none() {info!("Requested to record, but ID is not yet loaded");}if repo.state.changed_files.is_empty() {if let Some(ReadyState {repo, record_msg, ..}) = model::ready_mut(&mut state.sub){if repo.changed_files.is_empty() { - replacement in inflorescence/src/main.rs at line 570
} else if let Some(RecordMsg::Typing(_)) = state.record_msg.as_ref() {} else if let Some(RecordMsg::Typing(_)) = record_msg.as_ref() { - replacement in inflorescence/src/main.rs at line 574
let content = match state.record_msg.take() {let content = match record_msg.take() { - replacement in inflorescence/src/main.rs at line 582
state.record_msg = Some(RecordMsg::Typing(content));*record_msg = Some(RecordMsg::Typing(content)); - replacement in inflorescence/src/main.rs at line 594
if let Some(RecordMsg::Typing(record_msg)) = state.record_msg.as_mut() {if let Some(ReadyState {record_msg: Some(RecordMsg::Typing(record_msg)),..}) = model::ready_mut(&mut state.sub){ - replacement in inflorescence/src/main.rs at line 605[39.5064]→[39.5064:5494](∅→∅),[39.5637]→[39.5637:5800](∅→∅),[39.5800]→[69.20142:20320](∅→∅),[69.20320]→[73.47250:47348](∅→∅)
if let Some(RecordMsg::Typing(record_msg)) = state.record_msg.as_ref() {let msg = record_msg.text();if msg.trim().is_empty() {info!("Cannot record with an empty message");} else {let id =state.id.as_ref().expect("ID must be loaded at this point");// TODO: this call has CLI prompt - replace itlet (sk, _) = id.decrypt().unwrap();let sk = Arc::new(sk);state.repo_tx_in.send(repo::MsgIn::Record { msg, sk }).unwrap();// Reset most thingsstate.selection = selection::State::default();state.record_msg = None;state.files_diffs.diffs_nav = None;state.status_logs.changes_nav = None;state.status_logs.diffs_nav = None;if let Some(ReadyState {record_msg,repo,user_id,selection,navigation,..}) = model::ready_mut(&mut state.sub){if let Some(RecordMsg::Typing(msg)) = record_msg.as_ref() {let msg = msg.text();if msg.trim().is_empty() {info!("Cannot record with an empty message");} else {// TODO: this call has CLI prompt - replace itlet (sk, _) = user_id.decrypt().unwrap();let sk = Arc::new(sk);state.repo_tx_in.send(repo::MsgIn::Record { msg, sk }).unwrap(); - replacement in inflorescence/src/main.rs at line 627[69.20405]→[69.20405:20534](∅→∅),[69.20534]→[70.7873:7909](∅→∅),[70.7909]→[73.47349:47380](∅→∅),[70.7909]→[69.20534:20698](∅→∅),[73.47380]→[69.20534:20698](∅→∅),[69.20534]→[69.20534:20698](∅→∅)
let app::Repo {state: repo_state,status_nav,switching_channel: _,forking_channel: _,entire_log: _,} = state.repo.as_mut().unwrap();repo_state.changed_files = repo::ChangedFiles::default();state.files_diffs.diffs_nav = None;// Reset most things*selection = selection::State::default();*record_msg = None;// Status view fieldsnavigation.files_diffs.diffs_nav = None;navigation.status_logs_navs.files_nav = None;navigation.status_logs_navs.diffs_nav = None; - replacement in inflorescence/src/main.rs at line 635[69.20699]→[69.20699:20739](∅→∅),[69.20739]→[75.20592:20659](∅→∅),[75.20659]→[69.20941:20983](∅→∅),[69.20941]→[69.20941:20983](∅→∅)
// Re-initialize status navlet new_status_nav = nav_scrollable::State::default();*status_nav = new_status_nav;repo.changed_files = repo::ChangedFiles::default();} - replacement in inflorescence/src/main.rs at line 643
if let Some(RecordMsg::Typing(record_msg)) = state.record_msg.as_ref() {let old_msg = record_msg.text();state.record_msg = if !old_msg.trim().is_empty() {Some(RecordMsg::Canceled { old_msg })} else {None};if let Some(ReadyState { record_msg, .. }) =model::ready_mut(&mut state.sub){if let Some(RecordMsg::Typing(msg)) = record_msg.as_ref() {let old_msg = msg.text();*record_msg = if !old_msg.trim().is_empty() {Some(RecordMsg::Canceled { old_msg })} else {None};} - replacement in inflorescence/src/main.rs at line 659
if let Some(RecordMsg::Typing(_)) = state.record_msg.as_ref() {state.record_msg = None;if let Some(ReadyState { record_msg, .. }) =model::ready_mut(&mut state.sub){if let Some(RecordMsg::Typing(_msg)) = record_msg.as_ref() {*record_msg = None;} - replacement in inflorescence/src/main.rs at line 669[9.14764]→[39.7864:7930](∅→∅),[39.7930]→[75.20660:20715](∅→∅),[75.20715]→[62.7294:7370](∅→∅),[62.7294]→[62.7294:7370](∅→∅),[62.7370]→[69.21234:21268](∅→∅),[69.21268]→[70.7910:7941](∅→∅),[70.7941]→[73.48874:48900](∅→∅),[70.7941]→[62.7370:7378](∅→∅),[69.21268]→[62.7370:7378](∅→∅),[73.48900]→[62.7370:7378](∅→∅),[62.7370]→[62.7370:7378](∅→∅)
fn repo_init(state: &mut State, repo: repo::State) -> Task<Msg> {let status_nav = nav_scrollable::State::default();state.repo = Some(app::Repo {state: repo,status_nav,switching_channel: false,forking_channel: None,entire_log: None,});fn repo_init(state: &mut State, repo_state: repo::State) -> Task<Msg> {match &mut state.sub.sub {MSubState::Loading { user_ids, repo: _ } => {state.sub.sub = if user_ids.len() == 1 {let user_id = user_ids.pop().unwrap();MSubState::Ready(ReadyState {user_id,repo: repo_state,selection: default(),navigation: default(),record_msg: default(),forking_channel_name: default(),logs: default(),})} else {MSubState::SelectingId {user_ids: mem::take(user_ids),user_selection_ix: default(),user_selection_nav: default(),repo: Some(repo_state),}}}MSubState::SelectingId { repo, .. } => *repo = Some(repo_state),MSubState::Ready(_) => {}}; - replacement in inflorescence/src/main.rs at line 721
.watch(&state.repo_path, RecursiveMode::Recursive).watch(&state.sub.repo_path, RecursiveMode::Recursive) - replacement in inflorescence/src/main.rs at line 735[10.360]→[39.9172:9306](∅→∅),[39.9306]→[69.21269:21296](∅→∅),[69.21296]→[39.9306:9441](∅→∅),[39.9306]→[39.9306:9441](∅→∅)
fn repo_refreshed(state: &mut State, repo: repo::State) -> Task<Msg> {let repo::State {dir_name: _,channel: _,other_channels: _,untracked_files,changed_files,log,} = &repo;file::diffs_cache_clear(&mut state.files.diffs_cache);fn repo_refreshed(state: &mut State,repo_state: repo::State,invalidate_logs: bool,) -> Task<Msg> {match &mut state.sub.sub {MSubState::Loading { user_ids: _, repo } => *repo = Some(repo_state),MSubState::SelectingId { repo, .. } => *repo = Some(repo_state),MSubState::Ready(ReadyState {repo,user_id: _,selection,navigation: _,record_msg: _,forking_channel_name: _,logs,}) => {*repo = repo_state;// Throw away the logsif invalidate_logs {*logs = default();}; - replacement in inflorescence/src/main.rs at line 758[10.1650]→[69.21297:21397](∅→∅),[69.21397]→[42.8696:8790](∅→∅),[42.8696]→[42.8696:8790](∅→∅),[62.7710]→[42.8820:8821](∅→∅),[42.8820]→[42.8820:8821](∅→∅),[42.8821]→[69.21398:21699](∅→∅),[69.21699]→[70.7942:8061](∅→∅),[70.8061]→[75.20732:20926](∅→∅),[70.8061]→[62.7711:7786](∅→∅),[75.20926]→[62.7711:7786](∅→∅),[69.21699]→[62.7711:7786](∅→∅),[42.8821]→[62.7711:7786](∅→∅),[62.7786]→[69.21700:21727](∅→∅),[69.21727]→[70.8062:8087](∅→∅),[70.8087]→[73.48901:48927](∅→∅),[70.8087]→[62.7786:7795](∅→∅),[69.21727]→[62.7786:7795](∅→∅),[73.48927]→[62.7786:7795](∅→∅),[62.7786]→[62.7786:7795](∅→∅),[62.7795]→[75.20927:20946](∅→∅)
// Re-index selectionlet selection_task = reindex_selection(&mut state.selection,&mut state.files,untracked_files,changed_files,log,);let switching_channel = if changed_files.is_empty() {state.repo.as_mut().map(|repo| repo.switching_channel).unwrap_or_default()} else {// If any changed files gets added, exit out of channel selectionfalse};let forking_channel = state.repo.as_mut().and_then(|repo| repo.forking_channel.take());let status_nav = state.repo.take().map(|repo| repo.status_nav).unwrap_or_default();// TODO: reload entire_log if it's being viewed or it's loadingstate.repo = Some(app::Repo {state: repo,status_nav,switching_channel,forking_channel,entire_log: None,});selection_task// Re-index selectionlet selection_task =reindex_selection(repo, selection, &mut state.files, logs);return selection_task;}}Task::none() - edit in inflorescence/src/main.rs at line 769
repo: &repo::State, - replacement in inflorescence/src/main.rs at line 772
untracked_files: &BTreeSet<String>,changed_files: &repo::ChangedFiles,log: &repo::Log,logs: &Logs, - replacement in inflorescence/src/main.rs at line 774
if let Some(current_selection) = selection.view.status.take() {let status_task = if let Some(current_selection) = selection.status.take() { - replacement in inflorescence/src/main.rs at line 781
let selection = untracked_fileslet selection = repo.untracked_files - replacement in inflorescence/src/main.rs at line 809
let selection = changed_fileslet selection = repo.changed_files - replacement in inflorescence/src/main.rs at line 823
&& let Some(diffs) = changed_files.get(&path)&& let Some(diffs) = repo.changed_files.get(&path) - replacement in inflorescence/src/main.rs at line 843
let selection = loglet selection = repo.short_log - replacement in inflorescence/src/main.rs at line 890
selection.view.status = new_selection;selection.status = new_selection; - replacement in inflorescence/src/main.rs at line 895
}}}; - replacement in inflorescence/src/main.rs at line 897[25.2587]→[39.12770:12819](∅→∅),[39.12819]→[64.12245:12273](∅→∅),[64.12273]→[39.12842:12890](∅→∅),[39.12842]→[39.12842:12890](∅→∅),[64.12318]→[73.49119:49254](∅→∅)
fn repo_got_change_diffs(state: &mut State,hash: repo::ChangeHash,diffs: repo::ChangedFiles,) -> Task<Msg> {if let Some(app::EntireLog::Got { .. }) = state.repo.as_ref().and_then(|repo| repo.entire_log.as_ref())let channel_task = if let Some(selection::Channel { ix: _, name, log }) =selection.channel.take() - replacement in inflorescence/src/main.rs at line 900
let Some(selection::LogChange {ix: _,hash: selected_hash,message: _,file,}) = state.selection.view.entire_log.as_mut()else {return Task::none();};let (new_selection, task) = {let selection = repo.other_channels.iter().enumerate().find(|(_ix, channel_name)| *channel_name == &name)// TODO: re-index log selection once loaded for channels.map(|(ix, _name)| selection::Channel { ix, name, log }); - replacement in inflorescence/src/main.rs at line 909
if *selected_hash != hash {return Task::none();}let task = if let Some(selection::Channel { name, .. }) =selection.as_ref(){// Request to get the logTask::done(Msg::View(app::Msg::ToRepo(repo::MsgIn::LoadOtherChannelLog(name.clone()),)))} else {Task::none()}; - replacement in inflorescence/src/main.rs at line 920[73.49583]→[75.20947:20991](∅→∅),[75.20991]→[64.12436:12500](∅→∅),[73.49638]→[64.12436:12500](∅→∅),[64.12436]→[64.12436:12500](∅→∅),[64.12500]→[75.20992:21054](∅→∅),[75.21054]→[64.12725:12794](∅→∅),[64.12725]→[64.12725:12794](∅→∅)
if let Some(file) = file.as_ref() {// If a file is selected, init the nav for its difflet diffs_nav = nav_scrollable::State::default();let id_hash = file::log_id_parts_hash(hash, &file.path);(selection, task)};selection.channel = new_selection;task} else {Task::none()}; - replacement in inflorescence/src/main.rs at line 928
state.entire_logs.diffs_nav = Some((id_hash, diffs_nav));let entire_log_task = if let Some(selection::LogChange {ix: _,hash,message,file,}) = selection.entire_log.take(){let new_selection =if let Some(Log::Loaded { log }) = logs.entire_log.as_ref() {log.iter().enumerate().find(|(_ix, entry)| entry.hash == hash).map(|(ix, entry)| {let file = file.and_then(|selection::LogChangeFileSelection {ix: _,path: selected_path,diff_selected,}| {entry.file_paths.iter().enumerate().find(|(_ix, path)| *path == &selected_path).map(|(ix, path)| {selection::LogChangeFileSelection {ix,path: path.clone(),diff_selected,}})},);selection::LogChange {ix,hash: entry.hash,message,file,}})} else {None};let task = if new_selection.is_some() {// Request to get the entire logTask::done(Msg::View(app::Msg::ToRepo(repo::MsgIn::LoadEntireLog))) - replacement in inflorescence/src/main.rs at line 976[64.13083]→[64.13083:13134](∅→∅),[64.13134]→[75.21055:21119](∅→∅),[75.21119]→[73.49710:49781](∅→∅),[64.13257]→[73.49710:49781](∅→∅)
// Init scrollable nav for log changeslet changes_nav = nav_scrollable::State::default();state.entire_logs.changes_nav = Some((hash, changes_nav));Task::none() - edit in inflorescence/src/main.rs at line 978
selection.entire_log = new_selection;task} else {Task::none()}; - edit in inflorescence/src/main.rs at line 986
Task::batch([status_task, channel_task, entire_log_task])}fn repo_got_change_diffs(state: &mut State,hash: repo::ChangeHash,diffs: repo::ChangedFiles,) -> Task<Msg> {if let Some(ReadyState {selection,navigation,logs,..}) = model::ready_mut(&mut state.sub){ - replacement in inflorescence/src/main.rs at line 1002
state.entire_logs.changes_with_loaded_diffs.insert(hash);navigation.log_diffs.changes_with_loaded_diffs.insert(hash); - replacement in inflorescence/src/main.rs at line 1018
state.entire_logs.diffs.insert(id_hash, log_file_diff);navigation.log_diffs.diffs.insert(id_hash, log_file_diff); - replacement in inflorescence/src/main.rs at line 1020[73.50794]→[75.21187:21208](∅→∅),[75.21208]→[73.50807:51013](∅→∅),[73.50807]→[73.50807:51013](∅→∅),[73.51013]→[75.21209:21245](∅→∅),[75.21245]→[73.51060:51176](∅→∅),[73.51060]→[73.51060:51176](∅→∅),[73.51176]→[75.21246:21312](∅→∅),[75.21312]→[73.51456:51529](∅→∅),[73.51456]→[73.51456:51529](∅→∅)
Task::none()} else if let Some(selection::Status::LogChange(selection::LogChange {ix: _,hash: selected_hash,message: _,file,})) = state.selection.view.status.as_mut(){if *selected_hash == hash {if let Some(file) = file.as_ref() {// If a file is selected, init the nav for its difflet diffs_nav = nav_scrollable::State::default();let id_hash = file::log_id_parts_hash(hash, &file.path);match selection::unify(selection) {selection::Unified::Status(Some(selection::Status::LogChange(selection::LogChange {ix: _,hash: selected_hash,message: _,file,},))) => {if *selected_hash != hash {return Task::none();}if let Some(file) = file.as_ref() {// If a file is selected, init the nav for its difflet diffs_nav = nav_scrollable::State::default();let id_hash = file::log_id_parts_hash(hash, &file.path); - replacement in inflorescence/src/main.rs at line 1039
state.status_logs.diffs_nav = Some((id_hash, diffs_nav));} else {// Init scrollable nav for log changeslet changes_nav = nav_scrollable::State::default();navigation.status_logs_navs.diffs_nav =Some((id_hash, diffs_nav));} else {// Init scrollable nav for log fileslet changes_nav = nav_scrollable::State::default(); - replacement in inflorescence/src/main.rs at line 1045
state.status_logs.changes_nav = Some((hash, changes_nav));navigation.status_logs_navs.files_nav =Some((hash, changes_nav));} - replacement in inflorescence/src/main.rs at line 1049[73.52351]→[64.14124:14135](∅→∅),[64.14124]→[64.14124:14135](∅→∅),[64.14135]→[73.52352:52381](∅→∅),[73.52381]→[75.21382:21448](∅→∅),[75.21448]→[73.52500:52913](∅→∅),[73.52500]→[73.52500:52913](∅→∅)
};// Store the changesstate.status_logs.changes_with_loaded_diffs.insert(hash);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 {selection::Unified::EntireLog(Some(selection::LogChange {ix: _,hash: selected_hash,message: _, - replacement in inflorescence/src/main.rs at line 1054
// The nav is initialized only once a file is selected,// because its tasks need it to be visible to completestate: diff::State::default(),};})) => {if *selected_hash != hash {return Task::none();} - replacement in inflorescence/src/main.rs at line 1059[64.14136]→[73.53141:53221](∅→∅),[73.53221]→[75.21449:21470](∅→∅),[75.21470]→[73.53234:53268](∅→∅),[73.53234]→[73.53234:53268](∅→∅)
state.status_logs.diffs.insert(id_hash, log_file_diff);});Task::none()} else {Task::none()let Some(Log::Loaded { .. }) = logs.entire_log.as_ref() else {return Task::none();};if let Some(file) = file.as_ref() {// If a file is selected, init the nav for its difflet diffs_nav = nav_scrollable::State::default();let id_hash = file::log_id_parts_hash(hash, &file.path);navigation.entire_logs_navs.diffs_nav =Some((id_hash, diffs_nav));} else {// Init scrollable nav for log fileslet changes_nav = nav_scrollable::State::default();navigation.entire_logs_navs.files_nav =Some((hash, changes_nav));};}selection::Unified::Channel(Some(selection::Channel {ix: _,name,log:Some(selection::LogChange {ix: _,hash: selected_hash,message: _,file,}),})) => {if *selected_hash != hash {return Task::none();}let Some(Log::Loaded { .. }) =logs.other_channels_logs.get(name)else {return Task::none();};if let Some((selected_name, navs)) =navigation.other_channel_log_navs.as_mut()&& name == selected_name{if let Some(file) = file.as_ref() {// If a file is selected, init the nav for its difflet diffs_nav = nav_scrollable::State::default();let id_hash = file::log_id_parts_hash(hash, &file.path);navs.diffs_nav = Some((id_hash, diffs_nav));} else {// Init scrollable nav for log fileslet changes_nav = nav_scrollable::State::default();navs.files_nav = Some((hash, changes_nav));};}}_ => {}} - edit in inflorescence/src/main.rs at line 1118
Task::none() - replacement in inflorescence/src/main.rs at line 1122[73.53345]→[73.53345:53527](∅→∅),[73.53527]→[75.21471:21531](∅→∅),[75.21531]→[73.53635:53781](∅→∅),[73.53635]→[73.53635:53781](∅→∅),[73.53860]→[73.53860:53874](∅→∅),[73.53874]→[75.21532:21652](∅→∅),[75.21652]→[73.54017:54110](∅→∅),[73.54017]→[73.54017:54110](∅→∅),[73.54110]→[75.21653:21693](∅→∅),[75.21693]→[73.54155:54189](∅→∅),[73.54155]→[73.54155:54189](∅→∅),[73.54189]→[75.21694:21752](∅→∅)
if let Some(repo) = state.repo.as_mut() {match repo.entire_log.as_ref() {None| Some(app::EntireLog::Loading | app::EntireLog::Got { .. }) => {let nav = nav_scrollable::State::default();repo.entire_log = Some(app::EntireLog::Got {log,nav: Box::new(nav),});}Some(app::EntireLog::LoadingButNotViewing) => {let nav = nav_scrollable::State::default();repo.entire_log = Some(app::EntireLog::NotViewing {log,nav: Box::new(nav),});}Some(app::EntireLog::NotViewing { .. }) => {}if let Some(ReadyState { logs, .. }) = model::ready_mut(&mut state.sub) {logs.entire_log = Some(Log::Loaded { log });}Task::none()}fn loaded_other_channel_log(state: &mut State,channel: String,log: Vec<repo::LogEntry>,) -> Task<Msg> {if let Some(ReadyState {navigation,selection,logs,..}) = model::ready_mut(&mut state.sub){if let Some(selection::Channel {name: selection_name,..}) = selection.channel.as_ref()&& selection_name == &channel{navigation.other_channel_log_navs =Some((channel.clone(), log::Navs::default())); - edit in inflorescence/src/main.rs at line 1149
logs.other_channels_logs.insert(channel, Log::Loaded { log }); - replacement in inflorescence/src/main.rs at line 1334[60.3737]→[32.28532:28563](∅→∅),[34.9026]→[32.28532:28563](∅→∅),[32.28532]→[32.28532:28563](∅→∅),[32.28563]→[48.5770:5791](∅→∅),[48.5791]→[32.28563:28645](∅→∅),[32.28563]→[32.28563:28645](∅→∅),[32.28645]→[69.27156:27175](∅→∅),[69.27175]→[32.28661:28696](∅→∅),[32.28661]→[32.28661:28696](∅→∅),[32.28696]→[54.17577:17598](∅→∅),[54.17598]→[73.58741:58783](∅→∅),[51.6242]→[32.28717:28732](∅→∅),[64.14983]→[32.28717:28732](∅→∅),[54.17623]→[32.28717:28732](∅→∅),[73.58783]→[32.28717:28732](∅→∅),[32.28717]→[32.28717:28732](∅→∅),[32.28732]→[51.6243:6244](∅→∅),[51.6244]→[69.27176:27290](∅→∅),[69.27290]→[64.15045:15061](∅→∅),[54.17672]→[64.15045:15061](∅→∅),[64.15061]→[54.17691:17709](∅→∅),[54.17691]→[54.17691:17709](∅→∅),[54.17709]→[64.15062:15089](∅→∅),[64.15089]→[54.17739:17831](∅→∅),[54.17739]→[54.17739:17831](∅→∅),[54.17831]→[64.15090:15153](∅→∅),[64.15153]→[66.37:302](∅→∅),[66.302]→[64.15489:15731](∅→∅),[64.15489]→[64.15489:15731](∅→∅),[64.15731]→[52.3368:3386](∅→∅),[54.17968]→[52.3368:3386](∅→∅),[52.3368]→[52.3368:3386](∅→∅),[52.3386]→[66.303:449](∅→∅),[66.449]→[64.15732:15747](∅→∅),[52.3444]→[64.15732:15747](∅→∅),[64.15747]→[69.27291:27346](∅→∅),[69.27346]→[64.15796:15880](∅→∅),[64.15796]→[64.15796:15880](∅→∅),[52.3458]→[51.6542:6552](∅→∅),[64.15880]→[51.6542:6552](∅→∅),[51.6542]→[51.6542:6552](∅→∅),[51.6552]→[69.27347:27393](∅→∅),[69.27393]→[54.18015:18033](∅→∅),[54.18015]→[54.18015:18033](∅→∅),[54.18033]→[64.15881:15924](∅→∅),[64.15924]→[54.18082:18172](∅→∅),[54.18082]→[54.18082:18172](∅→∅),[54.18172]→[64.15925:15988](∅→∅),[64.15988]→[66.450:715](∅→∅),[66.715]→[64.16324:16566](∅→∅),[64.16324]→[64.16324:16566](∅→∅),[64.16566]→[52.3662:3680](∅→∅),[54.18309]→[52.3662:3680](∅→∅),[52.3662]→[52.3662:3680](∅→∅),[52.3680]→[66.716:862](∅→∅),[66.862]→[64.16567:16582](∅→∅),[52.3738]→[64.16567:16582](∅→∅),[64.16582]→[67.13489:13859](∅→∅),[67.13859]→[69.27394:27447](∅→∅),[69.27447]→[64.16629:16698](∅→∅),[64.16629]→[64.16629:16698](∅→∅),[64.16698]→[67.13860:13901](∅→∅),[67.13901]→[64.16698:16713](∅→∅),[64.16698]→[64.16698:16713](∅→∅),[52.3752]→[51.6782:6792](∅→∅),[64.16713]→[51.6782:6792](∅→∅),[51.6782]→[51.6782:6792](∅→∅),[51.6792]→[73.58784:60549](∅→∅),[69.27492]→[64.16714:16738](∅→∅),[73.60549]→[64.16714:16738](∅→∅),[51.6978]→[64.16714:16738](∅→∅),[64.16738]→[51.6997:7015](∅→∅),[51.6997]→[51.6997:7015](∅→∅),[51.7015]→[64.16739:16778](∅→∅),[64.16778]→[51.7111:7127](∅→∅),[54.18493]→[51.7111:7127](∅→∅),[51.7111]→[51.7111:7127](∅→∅),[51.7127]→[64.16779:16821](∅→∅),[64.16821]→[69.27493:27546](∅→∅),[69.27546]→[64.16871:17064](∅→∅),[64.16871]→[64.16871:17064](∅→∅),[64.17064]→[73.60550:60621](∅→∅),[73.60621]→[66.927:1093](∅→∅),[66.927]→[66.927:1093](∅→∅),[66.1093]→[73.60622:60699](∅→∅),[73.60699]→[66.1163:1402](∅→∅),[66.1163]→[66.1163:1402](∅→∅),[66.1402]→[64.17781:18037](∅→∅),[64.17781]→[64.17781:18037](∅→∅),[64.18037]→[73.60700:60734](∅→∅),[73.60734]→[64.18064:18199](∅→∅),[64.18064]→[64.18064:18199](∅→∅),[64.18199]→[73.60735:60778](∅→∅),[69.27592]→[64.18238:18379](∅→∅),[73.60778]→[64.18238:18379](∅→∅),[64.18238]→[64.18238:18379](∅→∅),[52.3865]→[51.7354:7364](∅→∅),[64.18379]→[51.7354:7364](∅→∅),[54.18686]→[51.7354:7364](∅→∅),[51.7354]→[51.7354:7364](∅→∅),[51.7364]→[64.18380:18402](∅→∅),[52.3944]→[51.7383:7391](∅→∅),[64.18402]→[51.7383:7391](∅→∅),[51.7383]→[51.7383:7391](∅→∅),[51.7391]→[64.18403:18515](∅→∅),[65.728]→[64.18531:18572](∅→∅),[64.18531]→[64.18531:18572](∅→∅),[64.18572]→[69.27593:27679](∅→∅),[69.27679]→[73.60779:60809](∅→∅),[69.27679]→[64.18591:18645](∅→∅),[73.60809]→[64.18591:18645](∅→∅),[64.18591]→[64.18591:18645](∅→∅)
let State {id: _,window_size,repo_fs_watch: _,repo_path,repo_tx_in: _,repo,selection,record_msg,files,files_diffs,status_logs,entire_logs,} = state;let status_selection = match selection.view.status.as_ref() {Some(selection::Status::UntrackedFile {ix,path,diff_selected,}) => {let id_hash = file::id_parts_hash(path, file::Kind::Untracked);let diff = files.diffs_cache.inner.peek(&id_hash);let nav = files_diffs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav),);let diff = match (diff, nav) {(Some(file::Diff::Loaded(file)), Some(nav)) => {files_diffs.diffs.get(&id_hash).map(|state| app::Diff {is_selected: *diff_selected,file,state,nav,})}(Some(file::Diff::Loaded(_) | file::Diff::Loading) | None,_,) => None,};Some(app::StatusSelection::UntrackedFile {ix: *ix,path,diff,})}Some(selection::Status::ChangedFile {path,ix,diff_selected,}) => {let id_hash = file::id_parts_hash(path, file::Kind::Changed);let diff = files.diffs_cache.inner.peek(&id_hash);let nav = files_diffs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav),);let diff = match (diff, nav) {(Some(file::Diff::Loaded(file)), Some(nav)) => {files_diffs.diffs.get(&id_hash).map(|state| app::Diff {is_selected: *diff_selected,file,state,nav,})}(Some(file::Diff::Loaded(_) | file::Diff::Loading) | None,_,) => None,};let is_added_from_untracked = repo.as_ref().and_then(|repo| repo.state.changed_files.get(path)).map(|diffs| {diffs.iter().any(|diff| matches!(diff, repo::ChangedFileDiff::Add))}).unwrap_or_default();Some(app::StatusSelection::ChangedFile {ix: *ix,path,diff,is_added_from_untracked,})}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 {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 = entire_logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| {(*nav_id_hash == id_hash).then_some(nav)},);let diff = entire_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 = entire_logs.changes_nav.as_ref().and_then(|(nav_hash, nav)| (nav_hash == hash).then_some(nav));Some(app::EntireLogSelection {ix: *log_ix,hash: *hash,message,file,nav,})}None => None,};let state = app::State {window_size: *window_size,repo_path,repo: repo.as_ref(),record_msg: record_msg.as_ref(),status_selection,channel_selection: selection.view.channel.as_ref(),entire_log_selection,};app::view(state, window_id).map(Msg::View)app::view(&state.sub,|id_hash| file::try_get_src_file(&state.files, id_hash),window_id,).map(Msg::View) - file addition: log.rs[27.364]
//! Dealing with record logs.#[doc(inline)]pub use inflorescence_model::log::Navs;use crate::file;use iced_expl_widget::nav_scrollable;pub fn log_diff_needs_scrolling(logs: &Navs, id_hash: file::LogIdHash) -> bool {logs.diffs_nav.as_ref().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav)).map(nav_scrollable::needs_scrolling).unwrap_or_default()} - replacement in inflorescence/src/file.rs at line 5
id_hash, id_parts_hash, log_id_parts_hash, Diff, Id, IdHash, IdMap, Kind,LogIdHash, LogIdMap,id_hash, id_parts_hash, log_id_parts_hash, Diff, Id, IdHash, Kind,LogIdHash, - replacement in inflorescence/src/file.rs at line 103
repo: Option<&repo::State>,repo: &repo::State, - replacement in inflorescence/src/file.rs at line 141
if let Some(repo) = repo {let changed_file = repo.changed_files.get(&id.path);let changed_file = repo.changed_files.get(&id.path); - replacement in inflorescence/src/file.rs at line 143
let file_diff: diff::File =diff::init_file(file_content, changed_file);let skip_sections =diff::unchanged_sections(&file_diff);let file_diff: diff::File =diff::init_file(file_content, changed_file);let skip_sections =diff::unchanged_sections(&file_diff); - replacement in inflorescence/src/file.rs at line 148[50.8221]→[29.5631:5732](∅→∅),[29.5631]→[29.5631:5732](∅→∅),[29.5732]→[54.19046:19087](∅→∅),[50.8266]→[29.5768:5856](∅→∅),[54.19087]→[29.5768:5856](∅→∅),[29.5768]→[29.5768:5856](∅→∅)
diffs_cache_put(&mut state.diffs_cache,id_hash,Diff::Loaded(file_diff),);diffs_cache_put(&mut state.diffs_cache,id_hash,Diff::Loaded(file_diff),); - replacement in inflorescence/src/file.rs at line 154[50.8268]→[53.1108:1157](∅→∅),[53.1157]→[54.19088:19129](∅→∅),[53.1241]→[53.1241:1340](∅→∅),[53.1340]→[29.5856:5882](∅→∅),[50.8340]→[29.5856:5882](∅→∅),[29.5856]→[29.5856:5882](∅→∅)
return Some(Loaded {id_hash,unchanged_sections: skip_sections,});}return Some(Loaded {id_hash,unchanged_sections: skip_sections,}); - edit in inflorescence/src/diff.rs at line 3
#[doc(inline)]pub use inflorescence_view::diff::State; - replacement in inflorescence/src/diff.rs at line 4
pub use libflorescence::diff::{pub use inflorescence_model::diff::{ - replacement in inflorescence/src/diff.rs at line 6
DiffWithoutContents, File, Lines, Section, UndecodableContents,UndecodableFile,DiffWithoutContents, File, FileAndState, FileContent, FilesState, Lines,Section, State, UndecodableContents, UndecodableFile, - edit in inflorescence/src/diff.rs at line 14
use std::borrow::Cow; - edit in inflorescence/src/diff.rs at line 16[64.19016]→[54.19693:19694](∅→∅),[75.22059]→[54.19693:19694](∅→∅),[53.1373]→[54.19693:19694](∅→∅),[54.19694]→[64.19017:19314](∅→∅),[64.19314]→[75.22060:22126](∅→∅),[75.22126]→[64.19372:19374](∅→∅),[64.19372]→[64.19372:19374](∅→∅),[64.19374]→[54.19736:19793](∅→∅),[54.19736]→[54.19736:19793](∅→∅),[54.19793]→[75.22127:22245](∅→∅),[64.19610]→[54.19898:19964](∅→∅),[75.22245]→[54.19898:19964](∅→∅),[54.19898]→[54.19898:19964](∅→∅),[54.19964]→[73.60812:60848](∅→∅),[73.60848]→[54.19988:20033](∅→∅),[54.19988]→[54.19988:20033](∅→∅),[54.20033]→[75.22246:22539](∅→∅),[64.20170]→[54.20033:20035](∅→∅),[75.22539]→[54.20033:20035](∅→∅),[54.20033]→[54.20033:20035](∅→∅),[53.1373]→[23.287:288](∅→∅),[54.20035]→[23.287:288](∅→∅),[32.29153]→[23.287:288](∅→∅),[23.287]→[23.287:288](∅→∅),[23.288]→[54.20036:20121](∅→∅),[50.8814]→[50.8814:8816](∅→∅),[50.8816]→[21.1927:1928](∅→∅),[32.29202]→[21.1927:1928](∅→∅),[21.1927]→[21.1927:1928](∅→∅),[20.19291]→[20.19291:19308](∅→∅),[19.5887]→[20.19633:19687](∅→∅),[20.19687]→[21.2490:2511](∅→∅),[21.2842]→[21.2842:2844](∅→∅)
#[derive(Debug, Default)]pub struct FilesState {pub diffs: file::IdMap<State>,/// Diffs scrollable nav.////// Only the current nav is kept because the sizes of contents have to be/// queried everytime the selection changes due to possible container size/// changes.pub diffs_nav: Option<(file::IdHash, nav_scrollable::State)>,}#[derive(Debug, Default)]pub struct LogFilesAndState {/// All the hashes in this set have `diffs` loaded.pub changes_with_loaded_diffs: HashSet<repo::ChangeHash>,/// All the diffs in this map have the change hash present in/// `change_file_counts`'s keyspub diffs: file::LogIdMap<FileAndState>,/// Log changes scrollable nav. Only the currently selected nav is kept.pub changes_nav: Option<(repo::ChangeHash, nav_scrollable::State)>,/// Log diffs scrollable nav. Only the currently selected nav is kept.pub diffs_nav: Option<(file::LogIdHash, nav_scrollable::State)>,}#[derive(Debug)]pub struct FileAndState {pub file: File,pub state: State,}#[derive(Debug)]pub enum FileContent<'a> {Decoded(Cow<'a, str>),UnknownEncoding,} - edit in inflorescence/src/diff.rs at line 164[75.22575]→[75.22575:22749](∅→∅),[75.22749]→[54.20431:20538](∅→∅),[54.20431]→[54.20431:20538](∅→∅),[54.20538]→[75.22750:22769](∅→∅)
.as_ref().and_then(|(nav_id_hash, nav)| (*nav_id_hash == id_hash).then_some(nav)).map(nav_scrollable::needs_scrolling).unwrap_or_default()}pub fn log_diff_needs_scrolling(logs: &LogFilesAndState,id_hash: file::LogIdHash,) -> bool {logs.diffs_nav - edit in inflorescence/Cargo.toml at line 15
[dependencies.inflorescence-model]workspace = true - edit in Cargo.toml at line 4
"inflorescence_model", - edit in Cargo.toml at line 20
inflorescence-model = { path = "inflorescence_model" } - edit in Cargo.lock at line 2497
"inflorescence-model", - edit in Cargo.lock at line 2509
name = "inflorescence-model"version = "0.1.0"dependencies = ["iced","iced-expl-widget","libflorescence",][[package]] - edit in Cargo.lock at line 2524
"inflorescence-model",