channel selection!

[?]
Jul 24, 2025, 4:12 PM
JZXYSIYDPBWQZCAMGDZ5BFMN6SU73EVVDIYEGTDJN6DVOSBNHN4QC

Dependencies

  • [2] 6YZAVBWU Initial commit
  • [3] SWWE2R6M display basic repo stuff
  • [4] WT3GA27P add cursor with selection
  • [5] UB2ITZJS refresh changed files on FS changes
  • [6] EC3TVL4X add untracked files
  • [7] S2NVIFXR allow to enter record msg
  • [8] YBJRDOTC make all repo actions async
  • [9] KM5PSZ4A watch repo once loaded
  • [10] A5YBC77V record!
  • [11] D7A7MSIH allow to defer or abandon record, add buttons
  • [12] AMPZ2BXK show changed files diffs (only Edit atm)
  • [13] MJDGPSHG WIP contents diff
  • [14] ONRCENKT rm unnecessary state from repo's internal state
  • [15] 4ELJZGRJ load and store all change diffs at once
  • [16] FR52XEMW add action for log change file diff
  • [17] CALXOZXA flatten crates dir
  • [18] L6KSEFQI move cursor related stuff into its module
  • [19] BFN2VHZS refactor file stuff into sub-mod
  • [20] GWZGYNIB add view crate
  • [21] 3SYSJKYL add app icon
  • [22] 23SFYK4Q big view refactor into a new crate
  • [23] OPXFZKEB view tests setup
  • [24] 3QVNMRNM test non-empty repo app view
  • [25] MYGIBRRH wip custom theme
  • [26] PKJCFSBM theme improvements
  • [27] XSZZB47U refactor stuff into lib
  • [28] 3BK22XE5 add a test for hover btn and more refactors
  • [29] WGID4LS4 absolutely slayed testing with iced task
  • [30] VCNKFNUF app init test
  • [31] 6F7Q4ZLR avoid unused warns
  • [32] ACDXXAX2 refactor main's updates into smaller fns
  • [33] X6AK4QPX finish recording test
  • [34] KMB6FND3 test view update fn rather than direct fn calls
  • [35] YYKXNBFL test: add untracked file
  • [36] 5CYU7UT7 test: rm added file
  • [37] ESMM3FEL test selection reindexing
  • [38] TSFQFCB2 test got repo change
  • [39] 7SSBM4UQ view: refactor repo view
  • [40] SWDPAGF6 test channel name
  • [41] I2AG42PA new cols layout
  • [42] SASAN2XC use nav-scrollable
  • [43] YKHE3XMW refactor diffs handling
  • [44] KEPKF3WO unify diffs handling, simplify view
  • [45] KWTBNTO3 diffs selection and scrolling
  • [46] 5MUEECMJ smooth scrolling nav
  • [47] 3TLPJ57B alt scroll via context and couple fixes
  • [48] AI3IMKC3 refactor stairs
  • [49] WXQBBQ2A update nightly
  • [50] PTWZYQFR use nav-scrollable for repo status
  • [51] RDRBP7AL auto-scroll status selection
  • [52] UR4J677R nav for log changes and refactors
  • [53] K63JN6CR refactor out non-view field from cursor
  • [54] A6Z4O6RC actions menu
  • [55] 7BLZN73O add a key to refresh repo
  • [56] IQDCHWCP load a pijul repo
  • [57] KT5UYXGK fix selection after adding file, add changed file diffs
  • [58] ZVI4AWER woot contents_diff
  • [59] FVA36HBV restart repo manager task if it crashes
  • [60] S2T7RUKW add nav back placeholder
  • [61] SK3WVX7A add wee spacing for nav back
  • [62] 4G6DZDO6 rename diff msg for nav-scrollable
  • [63] NWJD6VM6 mv libflowers libflorescence
  • [64] DVKSPF7R track selected file path together with an index
  • [65] V55EAIWQ add src file LRU cache
  • [66] ELG3UDT6 allow to rm added files
  • [67] QMAUTRB6 refactor diff
  • [68] JE44NYHM display log files diffs
  • [69] BNHJU2DU clippy fixes
  • [70] Y5ATDI2H convert changed file diffs and load src only if any needs it
  • [71] FDDPOH5R add arrow controls
  • [72] HOJZI52Y rename flowers_ui to inflorescence
  • [73] I56UGW7U make record test, fix log update
  • [74] 3GZPRZXC s/-/_ in crate paths
  • [75] OQ6HSAWH show record log
  • [76] KQABQCCZ update rust to 1.88
  • [77] K5YUSV2W auto-scroll to last offset
  • [78] W7IUT3ZV start recording impl
  • [79] 4PNWU55O replace the circular hor navigation
  • [80] BJXUYQ2Y show untracked file contents in read-only text editor
  • [81] GYZWZ33T fix unwraps on navs for view

Change contents

  • edit in libflorescence/src/repo.rs at line 40
    [8.167]
    [8.167]
    /// Current channel
  • edit in libflorescence/src/repo.rs at line 42
    [8.192]
    [8.192]
    /// All channels excluding the current one
    pub other_channels: Vec<String>,
  • edit in libflorescence/src/repo.rs at line 148
    [10.553]
    [3.466]
    SwitchToChannel(String),
  • edit in libflorescence/src/repo.rs at line 297
    [15.435]
    [8.3030]
    }
    MsgIn::SwitchToChannel(name) => {
    let state: State;
    (internal_state, state) = spawn_blocking(move || {
    switch_to_channel(&mut internal_state, name);
    let state = get_state(&internal_state);
    (internal_state, state)
    })
    .await
    .unwrap();
    let _ = msg_out_tx.send(MsgOut::Refreshed(state));
  • edit in libflorescence/src/repo.rs at line 319
    [14.1814]
    [14.1814]
    let other_channels = other_channels(repo);
  • edit in libflorescence/src/repo.rs at line 328
    [14.1978]
    [6.334]
    other_channels,
  • replacement in libflorescence/src/repo.rs at line 340
    [8.3278][3.1103:1232](),[3.1103][3.1103:1232]()
    let txn = repo.pristine.arc_txn_begin().unwrap();
    let read_guard = txn.read();
    read_guard
    .current_channel()
    [8.3278]
    [3.1232]
    let txn = repo.pristine.txn_begin().unwrap();
    txn.current_channel()
  • edit in libflorescence/src/repo.rs at line 344
    [3.1296]
    [3.1296]
    }
    /// Get all channels excluding the current channel
    fn other_channels(repo: &pijul::Repository) -> Vec<String> {
    let txn = repo.pristine.txn_begin().unwrap();
    let current = txn.current_channel().unwrap_or(pijul::DEFAULT_CHANNEL);
    txn.channels("")
    .unwrap()
    .into_iter()
    .filter_map(|channel| {
    let channel = channel.read();
    let name = txn.name(&*channel);
    (name != current).then(|| name.to_string())
    })
    .collect()
  • edit in libflorescence/src/repo.rs at line 361
    [3.1299]
    [40.1531]
    fn switch_to_channel(state: &mut InternalState, name: String) {
    let repo = &state.repo;
    let current_channel = current_channel(repo);
    let txn = repo.pristine.arc_txn_begin().unwrap();
    if name == current_channel {
    return;
    } else {
    // Check there are no unrecorded changes
    let channel = {
    let txn = txn.read();
    txn.load_channel(&current_channel).unwrap()
    };
    if let Some(channel) = channel
    && has_unrecorded_changes(txn.clone(), channel.clone(), repo)
    {
    error!("Cannot change channel, as there are unrecorded changes.");
    return;
    }
    }
    txn.write().set_current_channel(&name).unwrap();
    txn.commit().unwrap();
    }
  • edit in libflorescence/src/repo.rs at line 1030
    [12.1191]
    fn has_unrecorded_changes(
    txn: pijul::ArcTxn<libpijul::pristine::sanakirja::MutTxn<()>>,
    channel: pijul::ChannelRef<libpijul::pristine::sanakirja::MutTxn<()>>,
    repo: &pijul::Repository,
    ) -> bool {
    let mut state = libpijul::RecordBuilder::new();
    state
    .record(
    txn,
    libpijul::Algorithm::default(),
    false,
    &libpijul::DEFAULT_SEPARATOR,
    channel,
    &repo.working_copy,
    &repo.changes,
    "",
    std::thread::available_parallelism().unwrap().get(),
    )
    .unwrap();
    let rec = state.finish();
    debug!("actions = {:?}", rec.actions);
    !rec.actions.is_empty()
    }
  • file move: cursor.rs (----------)selection.rs (----------)
    [20.85]
    [27.3124]
  • replacement in inflorescence_view/src/selection.rs at line 27
    [27.3348][27.3348:3386]()
    pub selection: Option<Selection>,
    [27.3348]
    [46.359]
    pub status: Option<Status>,
    pub channel: Option<Channel>,
  • replacement in inflorescence_view/src/selection.rs at line 38
    [27.3406][27.3406:3427]()
    pub enum Selection {
    [27.3406]
    [27.3427]
    pub enum Status {
  • edit in inflorescence_view/src/selection.rs at line 84
    [27.4444]
    #[derive(Debug, Clone)]
    pub struct Channel {
    pub ix: usize,
    pub name: String,
    }
  • edit in inflorescence_view/src/lib.rs at line 2
    [22.259][42.106:122]()
    pub mod cursor;
  • edit in inflorescence_view/src/lib.rs at line 3
    [22.273]
    [23.4131]
    pub mod selection;
  • replacement in inflorescence_view/src/app.rs at line 6
    [23.4204][42.1745:1790]()
    use crate::{cursor, diff, el, theme, Theme};
    [23.4204]
    [50.956]
    use crate::{diff, el, selection, theme, Theme};
  • replacement in inflorescence_view/src/app.rs at line 12
    [52.1090][54.254:312]()
    use iced::{font, window, Element, Font, Length, Padding};
    [52.1090]
    [22.12673]
    use iced::{alignment, font, window, Element, Font, Length, Padding};
  • replacement in inflorescence_view/src/app.rs at line 30
    [44.415][52.1091:1133]()
    pub selection: Option<Selection<'a>>,
    [44.415]
    [22.12996]
    pub status_selection: Option<StatusSelection<'a>>,
    pub channel_selection: Option<&'a selection::Channel>,
  • edit in inflorescence_view/src/app.rs at line 40
    [50.1252]
    [52.1134]
    /// `Some` when we're selecting a channel to switch to.
    pub switching_channel: bool,
  • replacement in inflorescence_view/src/app.rs at line 45
    [52.1154][52.1154:1179]()
    pub enum Selection<'a> {
    [52.1154]
    [52.1179]
    pub enum StatusSelection<'a> {
  • replacement in inflorescence_view/src/app.rs at line 83
    [22.13038][22.13038:13063]()
    Cursor(cursor::Msg),
    [22.13038]
    [22.13063]
    Confirm,
    Cancel,
    Selection(selection::Msg),
  • edit in inflorescence_view/src/app.rs at line 109
    [54.450]
    [55.28]
    /// Show a list of channels to switch to
    SwitchChannel,
  • replacement in inflorescence_view/src/app.rs at line 129
    [52.2281][52.2281:2300]()
    selection,
    [52.2281]
    [52.2300]
    status_selection,
    channel_selection,
  • replacement in inflorescence_view/src/app.rs at line 133
    [52.2358][54.451:522]()
    view_repo(window_size, repo_path, repo, record_msg, selection)
    [52.2358]
    [39.75]
    view_repo(
    window_size,
    repo_path,
    repo,
    record_msg,
    status_selection,
    channel_selection,
    )
  • replacement in inflorescence_view/src/app.rs at line 147
    [39.224][39.224:255]()
    .height(Length::Fill))
    [39.224]
    [39.255]
    .height(Length::Fill)
    .padding(Padding::from([2, 5])))
  • replacement in inflorescence_view/src/app.rs at line 157
    [52.2623][52.2623:2661]()
    selection: Option<Selection<'a>>,
    [52.2623]
    [52.2661]
    status_selection: Option<StatusSelection<'a>>,
    channel_selection: Option<&'a selection::Channel>,
  • edit in inflorescence_view/src/app.rs at line 165
    [52.2785]
    [52.2785]
    other_channels,
  • edit in inflorescence_view/src/app.rs at line 171
    [50.1485]
    [50.1485]
    switching_channel,
  • edit in inflorescence_view/src/app.rs at line 173
    [50.1499]
    [50.1499]
    let can_switch_channel = changed_files.is_empty();
  • replacement in inflorescence_view/src/app.rs at line 178
    [52.2948][39.499:535](),[39.499][39.499:535](),[39.535][52.2949:3052](),[52.3052][39.650:670](),[39.650][39.650:670]()
    el(text(": ")),
    el(
    button(text(channel)), /* TODO
    * .on_press(Message) */
    ),
    ]));
    [52.2948]
    [39.670]
    el(text(", channel: ")),
    el(button(text(channel))
    .on_press_maybe(can_switch_channel.then_some(Msg::SwitchChannel))),
    ])
    .align_y(alignment::Vertical::Center));
  • replacement in inflorescence_view/src/app.rs at line 187
    [22.16079][54.523:683]()
    let is_selected = matches!(selection.as_ref() ,
    Some(Selection::UntrackedFile{ ix: selected_ix, .. }) if &ix == selected_ix
    [22.16079]
    [22.16260]
    let is_selected = matches!(status_selection.as_ref() ,
    Some(StatusSelection::UntrackedFile{ ix: selected_ix, .. }) if &ix == selected_ix
  • replacement in inflorescence_view/src/app.rs at line 194
    [26.2879][22.16338:16488](),[22.16338][22.16338:16488]()
    .on_press(Msg::Cursor(cursor::Msg::Select(
    cursor::Select::UntrackedFile{ix, path: path.clone()},
    [26.2879]
    [22.16488]
    .on_press(Msg::Selection(selection::Msg::Select(
    selection::Select::UntrackedFile{ix, path: path.clone()},
  • replacement in inflorescence_view/src/app.rs at line 206
    [22.16783][54.684:841]()
    let is_selected = matches!(selection.as_ref(),
    Some(Selection::ChangedFile{ ix: selected_ix, .. }) if &ix == selected_ix
    [22.16783]
    [22.16961]
    let is_selected = matches!(status_selection.as_ref(),
    Some(StatusSelection::ChangedFile{ ix: selected_ix, .. }) if &ix == selected_ix
  • replacement in inflorescence_view/src/app.rs at line 214
    [26.3005][22.17061:17214](),[22.17061][22.17061:17214]()
    .on_press(Msg::Cursor(cursor::Msg::Select(
    cursor::Select::ChangedFile{ix, path: file_path.clone()},
    [26.3005]
    [22.17214]
    .on_press(Msg::Selection(selection::Msg::Select(
    selection::Select::ChangedFile{ix, path: file_path.clone()},
  • replacement in inflorescence_view/src/app.rs at line 231
    [22.17641][54.842:992]()
    let is_selected = matches!(selection.as_ref(),
    Some(Selection::Log { ix: selected_ix, .. }) if &ix == selected_ix
    [22.17641]
    [22.17818]
    let is_selected = matches!(status_selection.as_ref(),
    Some(StatusSelection::Log { ix: selected_ix, .. }) if &ix == selected_ix
  • replacement in inflorescence_view/src/app.rs at line 236
    [22.17932][22.17932:18100]()
    .on_press(Msg::Cursor(cursor::Msg::Select(
    cursor::Select::LogChange { ix, hash: *hash, message: message.clone() },
    [22.17932]
    [22.18100]
    .on_press(Msg::Selection(selection::Msg::Select(
    selection::Select::LogChange { ix, hash: *hash, message: message.clone() },
  • replacement in inflorescence_view/src/app.rs at line 263
    [22.18331][52.4117:4238]()
    let selection_details = match selection.as_ref() {
    Some(Selection::UntrackedFile { ix: _, path, diff }) => {
    [22.18331]
    [45.6317]
    let selection_details = match status_selection.as_ref() {
    Some(StatusSelection::UntrackedFile { ix: _, path, diff }) => {
  • replacement in inflorescence_view/src/app.rs at line 283
    [39.2546][54.1152:1190]()
    Some(Selection::ChangedFile {
    [39.2546]
    [54.1190]
    Some(StatusSelection::ChangedFile {
  • replacement in inflorescence_view/src/app.rs at line 306
    [39.3458][52.4926:4956]()
    Some(Selection::Log {
    [39.3458]
    [39.3502]
    Some(StatusSelection::Log {
  • replacement in inflorescence_view/src/app.rs at line 322
    [22.21869][22.21869:21984]()
    Msg::Cursor(cursor::Msg::Select(cursor::Select::LogChangeFile { ix, path: path.clone() }))
    [22.21869]
    [25.7971]
    Msg::Selection(selection::Msg::Select(selection::Select::LogChangeFile { ix, path: path.clone() }))
  • replacement in inflorescence_view/src/app.rs at line 357
    [41.1006][54.1302:1359]()
    } else if let Some(selection) = selection.as_ref() {
    [41.1006]
    [41.1076]
    } else if let Some(selection) = status_selection.as_ref() {
  • replacement in inflorescence_view/src/app.rs at line 359
    [41.1102][54.1360:1557]()
    Selection::UntrackedFile { .. }
    | Selection::ChangedFile { .. }
    | Selection::Log { file: None, .. } => 1,
    Selection::Log { file: Some(_), .. } => 2,
    [41.1102]
    [41.1343]
    StatusSelection::UntrackedFile { .. }
    | StatusSelection::ChangedFile { .. }
    | StatusSelection::Log { file: None, .. } => 1,
    StatusSelection::Log { file: Some(_), .. } => 2,
  • replacement in inflorescence_view/src/app.rs at line 384
    [50.2065][52.6321:6435]()
    let status_selected = match selection.as_ref() {
    Some(Selection::UntrackedFile { diff, .. }) => !diff
    [50.2065]
    [52.6435]
    let status_selected = match status_selection.as_ref() {
    Some(StatusSelection::UntrackedFile { diff, .. }) => !diff
  • replacement in inflorescence_view/src/app.rs at line 389
    [52.6533][52.6533:6592]()
    Some(Selection::ChangedFile { diff, .. }) => !diff
    [52.6533]
    [52.6592]
    Some(StatusSelection::ChangedFile { diff, .. }) => !diff
  • replacement in inflorescence_view/src/app.rs at line 393
    [52.6690][52.6690:6751]()
    Some(Selection::Log { file, .. }) => file.is_none(),
    [52.6690]
    [52.6751]
    Some(StatusSelection::Log { file, .. }) => file.is_none(),
  • replacement in inflorescence_view/src/app.rs at line 420
    [54.1674][46.448:526](),[41.2213][46.448:526]()
    .on_press(Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Left))))
    [54.1674]
    [41.2268]
    .on_press(Msg::Selection(selection::Msg::PressDir(
    selection::Dir::Left,
    ))))
  • replacement in inflorescence_view/src/app.rs at line 431
    [41.2381][52.6961:7034]()
    let col_2 = match selection.as_ref() {
    Some(Selection::Log {
    [41.2381]
    [44.1134]
    let col_2 = match status_selection.as_ref() {
    Some(StatusSelection::Log {
  • replacement in inflorescence_view/src/app.rs at line 472
    [44.2132][46.527:628]()
    .on_press(Msg::Cursor(
    cursor::Msg::PressDir(cursor::Dir::Left),
    [44.2132]
    [46.628]
    .on_press(Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Left),
  • replacement in inflorescence_view/src/app.rs at line 483
    [22.24110][52.7701:7831]()
    Some(Selection::UntrackedFile { .. })
    | Some(Selection::ChangedFile { .. })
    | Some(Selection::Log { .. })
    [22.24110]
    [44.2515]
    Some(StatusSelection::UntrackedFile { .. })
    | Some(StatusSelection::ChangedFile { .. })
    | Some(StatusSelection::Log { .. })
  • replacement in inflorescence_view/src/app.rs at line 489
    [22.24231][54.1675:1719]()
    let main = if let Some(col_2) = col_2 {
    [22.24231]
    [41.3887]
    let view_channels = || {
    other_channels.iter().enumerate().map(|(ix, channel)| {
    let is_selected = matches!(channel_selection,
    Some(selection::Channel{ ix: selected_ix, .. }) if &ix == selected_ix
    );
    el(button(text(channel))
    .on_press(Msg::Confirm)
    .class(selectable_button_class(is_selected)))
    })
    };
    let main = if *switching_channel {
    if other_channels.is_empty() {
    el(column([el(text(format!("Current channel: {channel}")))]))
    } else {
    el(column([
    el(text(format!("Current channel: {channel}. Switch to:"))),
    el(column(view_channels())),
    ]))
    }
    } else if let Some(col_2) = col_2 {
  • replacement in inflorescence_view/src/app.rs at line 523
    [54.1967][54.1967:2048]()
    let actions_inner = view_actions(action_state(repo, record_msg, selection));
    [54.1967]
    [54.2048]
    let actions_inner = view_actions(action_state(
    repo,
    record_msg,
    status_selection,
    channel_selection,
    ));
  • replacement in inflorescence_view/src/app.rs at line 533
    [54.2199][54.2199:2241]()
    .padding(Padding::from([4, 6])));
    [54.2199]
    [54.2241]
    .padding(Padding::from([2, 5])));
  • replacement in inflorescence_view/src/app.rs at line 549
    [54.2413][54.2413:2480]()
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Left)),
    [54.2413]
    [54.2480]
    Msg::Selection(selection::Msg::PressDir(selection::Dir::Left)),
  • replacement in inflorescence_view/src/app.rs at line 555
    [54.2563][54.2563:2630]()
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Down)),
    [54.2563]
    [54.2630]
    Msg::Selection(selection::Msg::PressDir(selection::Dir::Down)),
  • replacement in inflorescence_view/src/app.rs at line 561
    [54.2711][54.2711:2776]()
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Up)),
    [54.2711]
    [54.2776]
    Msg::Selection(selection::Msg::PressDir(selection::Dir::Up)),
  • replacement in inflorescence_view/src/app.rs at line 567
    [54.2860][54.2860:2928]()
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Right)),
    [54.2860]
    [54.2928]
    Msg::Selection(selection::Msg::PressDir(selection::Dir::Right)),
  • replacement in inflorescence_view/src/app.rs at line 573
    [54.3032][54.3032:3102]()
    Msg::Cursor(cursor::Msg::AltPressDir(cursor::Dir::Down)),
    [54.3032]
    [54.3102]
    Msg::Selection(selection::Msg::AltPressDir(selection::Dir::Down)),
  • replacement in inflorescence_view/src/app.rs at line 579
    [54.3204][54.3204:3272]()
    Msg::Cursor(cursor::Msg::AltPressDir(cursor::Dir::Up)),
    [54.3204]
    [54.3272]
    Msg::Selection(selection::Msg::AltPressDir(selection::Dir::Up)),
  • edit in inflorescence_view/src/app.rs at line 591
    [54.3798]
    [55.46]
    let switch_channel =
    || action_button("c: switch channel", Msg::SwitchChannel);
  • edit in inflorescence_view/src/app.rs at line 594
    [55.126]
    [54.3798]
    let confirm = || action_button("Enter: confirm", Msg::Confirm);
    let cancel = || action_button("Esc: cancel", Msg::Cancel);
  • edit in inflorescence_view/src/app.rs at line 607
    [54.4039]
    [55.127]
    #[allow(clippy::let_and_return)]
  • replacement in inflorescence_view/src/app.rs at line 615
    [54.4234][54.4234:4264]()
    match selection {
    [54.4234]
    [54.4264]
    let row = match selection {
  • replacement in inflorescence_view/src/app.rs at line 630
    [54.4965][54.4965:4979]()
    }
    [54.4965]
    [54.4979]
    };
    let row = add_if(!can_record, switch_channel(), row);
    row
  • replacement in inflorescence_view/src/app.rs at line 640
    [54.5204][54.5204:5256]()
    add_if(can_record, start_record(), row)
    [54.5204]
    [54.5256]
    let row = add_if(can_record, start_record(), row);
    let row = add_if(!can_record, switch_channel(), row);
    row
  • replacement in inflorescence_view/src/app.rs at line 646
    [54.5393][54.5393:5445]()
    add_if(can_record, start_record(), row)
    [54.5393]
    [54.5445]
    let row = add_if(can_record, start_record(), row);
    let row = add_if(!can_record, switch_channel(), row);
    row
  • edit in inflorescence_view/src/app.rs at line 653
    [54.5571]
    [54.5571]
    ActionState::SwitchingChannel(state) => match state {
    SwitchingChannelState::NoOtherChannels => row([cancel()]),
    SwitchingChannelState::NothingSelected => {
    row([down(), up(), cancel()])
    }
    SwitchingChannelState::SomethingSelected => {
    row([down(), up(), confirm(), cancel()])
    }
    },
  • replacement in inflorescence_view/src/app.rs at line 682
    [54.5937][54.5937:5968]()
    Diff { can_record: bool },
    [54.5937]
    [54.5968]
    Diff {
    can_record: bool,
    },
  • edit in inflorescence_view/src/app.rs at line 687
    [54.6028]
    [54.6028]
    SwitchingChannel(SwitchingChannelState),
  • edit in inflorescence_view/src/app.rs at line 696
    [54.6105]
    [54.6105]
    enum SwitchingChannelState {
    NoOtherChannels,
    NothingSelected,
    SomethingSelected,
    }
  • replacement in inflorescence_view/src/app.rs at line 706
    [54.6222][54.6222:6260]()
    selection: Option<Selection<'a>>,
    [54.6222]
    [54.6260]
    status_selection: Option<StatusSelection<'a>>,
    channel_selection: Option<&'a selection::Channel>,
  • edit in inflorescence_view/src/app.rs at line 712
    [54.6425]
    [54.6425]
    }
    if repo.switching_channel {
    let sub_state = if repo.state.other_channels.is_empty() {
    SwitchingChannelState::NoOtherChannels
    } else if channel_selection.is_some() {
    SwitchingChannelState::SomethingSelected
    } else {
    SwitchingChannelState::NothingSelected
    };
    return ActionState::SwitchingChannel(sub_state);
  • replacement in inflorescence_view/src/app.rs at line 727
    [54.6492][54.6492:6554]()
    match selection {
    Some(Selection::UntrackedFile {
    [54.6492]
    [54.6554]
    match status_selection {
    Some(StatusSelection::UntrackedFile {
  • replacement in inflorescence_view/src/app.rs at line 754
    [54.7391][54.7391:7429]()
    Some(Selection::ChangedFile {
    [54.7391]
    [54.7429]
    Some(StatusSelection::ChangedFile {
  • replacement in inflorescence_view/src/app.rs at line 788
    [54.8523][54.8523:8553]()
    Some(Selection::Log {
    [54.8523]
    [54.8553]
    Some(StatusSelection::Log {
  • replacement in inflorescence_view/src/app/test.rs at line 1
    [23.4223][54.10089:10132]()
    use super::{view, Repo, Selection, State};
    [23.4223]
    [28.932]
    use super::{view, Repo, State, StatusSelection};
  • replacement in inflorescence_view/src/app/test.rs at line 38
    [23.5104][52.7894:7919]()
    selection: None,
    [23.5104]
    [23.5139]
    status_selection: None,
    channel_selection: None,
  • edit in inflorescence_view/src/app/test.rs at line 50
    [23.5526]
    [23.5526]
    other_channels: vec![],
  • edit in inflorescence_view/src/app/test.rs at line 61
    [50.2614]
    [24.96]
    switching_channel: false,
  • replacement in inflorescence_view/src/app/test.rs at line 68
    [24.254][52.7920:7945]()
    selection: None,
    [24.254]
    [24.289]
    status_selection: None,
    channel_selection: None,
  • edit in inflorescence_view/src/app/test.rs at line 80
    [24.680]
    [24.680]
    other_channels: vec![],
  • replacement in inflorescence_view/src/app/test.rs at line 110
    [25.8425][52.7989:8014]()
    selection: None,
    [25.8425]
    [25.8460]
    status_selection: None,
    channel_selection: None,
  • replacement in inflorescence_view/src/app/test.rs at line 124
    [28.1433][52.8015:8040]()
    selection: None,
    [28.1433]
    [28.1468]
    status_selection: None,
    channel_selection: None,
  • replacement in inflorescence_view/src/app/test.rs at line 142
    [25.8738][54.10133:10185]()
    let selection = Some(Selection::UntrackedFile {
    [25.8738]
    [54.10185]
    let status_selection = Some(StatusSelection::UntrackedFile {
  • replacement in inflorescence_view/src/app/test.rs at line 152
    [23.5787][54.10247:10266]()
    selection,
    [23.5787]
    [23.5822]
    status_selection,
    channel_selection: None,
  • replacement in inflorescence/src/test.rs at line 2
    [38.47][42.1937:2017]()
    cursor, init, reindex_selection, repo_got_change_diffs, update, Msg, State,
    [38.47]
    [38.137]
    init, reindex_selection, repo_got_change_diffs, selection, update, Msg,
    State,
  • replacement in inflorescence/src/test.rs at line 110
    [34.120][34.120:220]()
    Msg::View(app::Msg::Cursor(cursor::Msg::Select(
    cursor::Select::UntrackedFile {
    [34.120]
    [34.220]
    Msg::View(app::Msg::Selection(selection::Msg::Select(
    selection::Select::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 188
    [33.899][54.10420:10494]()
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
    [33.899]
    [33.968]
    state.selection.view.selection = Some(selection::Status::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 338
    [35.1581][35.1581:1681]()
    Msg::View(app::Msg::Cursor(cursor::Msg::Select(
    cursor::Select::UntrackedFile {
    [35.1581]
    [35.1681]
    Msg::View(app::Msg::Selection(selection::Msg::Select(
    selection::Select::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 373
    [36.141][36.141:239]()
    Msg::View(app::Msg::Cursor(cursor::Msg::Select(
    cursor::Select::ChangedFile {
    [36.141]
    [36.239]
    Msg::View(app::Msg::Selection(selection::Msg::Select(
    selection::Select::ChangedFile {
  • replacement in inflorescence/src/test.rs at line 432
    [37.1343][54.11148:11200]()
    assert!(state.cursor.view.selection.is_none());
    [37.1343]
    [37.1390]
    assert!(state.selection.view.status.is_none());
  • replacement in inflorescence/src/test.rs at line 435
    [37.1425][37.1425:1452]()
    &mut state.cursor,
    [37.1425]
    [37.1452]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 442
    [37.1547][54.11201:11253]()
    assert!(state.cursor.view.selection.is_none());
    [37.1547]
    [37.1594]
    assert!(state.selection.view.status.is_none());
  • replacement in inflorescence/src/test.rs at line 456
    [37.2013][54.11254:11328]()
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
    [37.2013]
    [37.2082]
    state.selection.view.selection = Some(selection::Status::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 462
    [37.2183][37.2183:2210]()
    &mut state.cursor,
    [37.2183]
    [37.2210]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 469
    [37.2306][54.11329:11381]()
    assert!(state.cursor.view.selection.is_some());
    [37.2306]
    [37.2353]
    assert!(state.selection.view.status.is_some());
  • replacement in inflorescence/src/test.rs at line 471
    [37.2374][54.11382:11437](),[54.11437][45.7517:7586](),[37.2424][45.7517:7586]()
    state.cursor.view.selection.as_ref().unwrap(),
    cursor::Selection::UntrackedFile { ix, path, diff_selected }
    [37.2374]
    [45.7586]
    state.selection.view.status.as_ref().unwrap(),
    selection::Status::UntrackedFile { ix, path, diff_selected }
  • replacement in inflorescence/src/test.rs at line 491
    [37.3093][54.11438:11512]()
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
    [37.3093]
    [37.3162]
    state.selection.view.selection = Some(selection::Status::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 497
    [37.3266][37.3266:3293]()
    &mut state.cursor,
    [37.3266]
    [37.3293]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 504
    [37.3389][54.11513:11565]()
    assert!(state.cursor.view.selection.is_none());
    [37.3389]
    [37.3436]
    assert!(state.selection.view.status.is_none());
  • replacement in inflorescence/src/test.rs at line 522
    [37.4018][54.11566:11638]()
    state.cursor.view.selection = Some(cursor::Selection::ChangedFile {
    [37.4018]
    [37.4085]
    state.selection.view.selection = Some(selection::Status::ChangedFile {
  • replacement in inflorescence/src/test.rs at line 528
    [37.4184][37.4184:4211]()
    &mut state.cursor,
    [37.4184]
    [37.4211]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 535
    [37.4308][54.11639:11691]()
    assert!(state.cursor.view.selection.is_some());
    [37.4308]
    [37.4355]
    assert!(state.selection.view.status.is_some());
  • replacement in inflorescence/src/test.rs at line 537
    [37.4376][54.11692:11747](),[54.11747][45.7861:7928](),[37.4426][45.7861:7928]()
    state.cursor.view.selection.as_ref().unwrap(),
    cursor::Selection::ChangedFile { ix, path, diff_selected }
    [37.4376]
    [45.7928]
    state.selection.view.status.as_ref().unwrap(),
    selection::Status::ChangedFile { ix, path, diff_selected }
  • replacement in inflorescence/src/test.rs at line 559
    [37.5144][54.11748:11820]()
    state.cursor.view.selection = Some(cursor::Selection::ChangedFile {
    [37.5144]
    [37.5211]
    state.selection.view.selection = Some(selection::Status::ChangedFile {
  • replacement in inflorescence/src/test.rs at line 565
    [37.5310][37.5310:5337]()
    &mut state.cursor,
    [37.5310]
    [37.5337]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 572
    [37.5434][54.11821:11873]()
    assert!(state.cursor.view.selection.is_some());
    [37.5434]
    [37.5481]
    assert!(state.selection.view.status.is_some());
  • replacement in inflorescence/src/test.rs at line 574
    [37.5502][54.11874:11929](),[54.11929][45.8184:8251](),[37.5552][45.8184:8251]()
    state.cursor.view.selection.as_ref().unwrap(),
    cursor::Selection::ChangedFile { ix, path, diff_selected }
    [37.5502]
    [45.8251]
    state.selection.view.status.as_ref().unwrap(),
    selection::Status::ChangedFile { ix, path, diff_selected }
  • replacement in inflorescence/src/test.rs at line 585
    [37.5907][54.11930:12002]()
    state.cursor.view.selection = Some(cursor::Selection::ChangedFile {
    [37.5907]
    [37.5974]
    state.selection.view.selection = Some(selection::Status::ChangedFile {
  • replacement in inflorescence/src/test.rs at line 591
    [37.6076][37.6076:6103]()
    &mut state.cursor,
    [37.6076]
    [37.6103]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 598
    [37.6200][54.12003:12055]()
    assert!(state.cursor.view.selection.is_none());
    [37.6200]
    [37.6247]
    assert!(state.selection.view.status.is_none());
  • replacement in inflorescence/src/test.rs at line 627
    [37.7196][54.12056:12126]()
    state.cursor.view.selection = Some(cursor::Selection::LogChange {
    [37.7196]
    [37.7261]
    state.selection.view.selection = Some(selection::Status::LogChange {
  • replacement in inflorescence/src/test.rs at line 634
    [37.7421][37.7421:7448]()
    &mut state.cursor,
    [37.7421]
    [37.7448]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 641
    [37.7546][54.12127:12179]()
    assert!(state.cursor.view.selection.is_some());
    [37.7546]
    [37.7593]
    assert!(state.selection.view.status.is_some());
  • replacement in inflorescence/src/test.rs at line 643
    [37.7614][54.12180:12235](),[54.12235][42.2280:2334](),[37.7664][42.2280:2334]()
    state.cursor.view.selection.as_ref().unwrap(),
    cursor::Selection::LogChange { ix, hash, .. }
    [37.7614]
    [37.7734]
    state.selection.view.status.as_ref().unwrap(),
    selection::Status::LogChange { ix, hash, .. }
  • replacement in inflorescence/src/test.rs at line 654
    [37.8012][54.12236:12310]()
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
    [37.8012]
    [37.8081]
    state.selection.view.selection = Some(selection::Status::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 660
    [37.8179][37.8179:8206]()
    &mut state.cursor,
    [37.8179]
    [37.8206]
    &mut state.selection,
  • replacement in inflorescence/src/test.rs at line 667
    [37.8304][54.12311:12363]()
    assert!(state.cursor.view.selection.is_none());
    [37.8304]
    [37.8351]
    assert!(state.selection.view.status.is_none());
  • replacement in inflorescence/src/test.rs at line 691
    [38.700][54.12364:12416]()
    assert!(state.cursor.view.selection.is_none());
    [38.700]
    [38.747]
    assert!(state.selection.view.status.is_none());
  • replacement in inflorescence/src/test.rs at line 695
    [38.889][54.12417:12469]()
    assert!(state.cursor.view.selection.is_none());
    [38.889]
    [38.936]
    assert!(state.selection.view.status.is_none());
  • replacement in inflorescence/src/test.rs at line 700
    [38.1053][54.12470:12540]()
    state.cursor.view.selection = Some(cursor::Selection::LogChange {
    [38.1053]
    [38.1118]
    state.selection.view.selection = Some(selection::Status::LogChange {
  • replacement in inflorescence/src/test.rs at line 709
    [38.1386][54.12541:12593]()
    assert!(state.cursor.view.selection.is_some());
    [38.1386]
    [38.1568]
    assert!(state.selection.view.status.is_some());
  • replacement in inflorescence/src/test.rs at line 714
    [38.1692][54.12594:12664]()
    state.cursor.view.selection = Some(cursor::Selection::LogChange {
    [38.1692]
    [38.1757]
    state.selection.view.selection = Some(selection::Status::LogChange {
  • replacement in inflorescence/src/test.rs at line 723
    [52.8102][54.12665:12717]()
    assert!(state.cursor.view.selection.is_some());
    [52.8102]
    [38.2210]
    assert!(state.selection.view.status.is_some());
  • file move: cursor.rs (----------)selection.rs (----------)
    [17.364]
    [4.26]
  • replacement in inflorescence/src/selection.rs at line 4
    [28.1961][42.9078:9116](),[42.9116][53.732:822]()
    pub use inflorescence_view::cursor::{
    Dir, HeldKey, LogChangeFileSelection, Msg, Select, Selection,
    State as ViewState,
    [28.1961]
    [22.29306]
    pub use inflorescence_view::selection::{
    Channel, Dir, HeldKey, LogChangeFileSelection, Msg, Select,
    State as ViewState, Status,
  • edit in inflorescence/src/selection.rs at line 127
    [51.640]
    [51.640]
    switching_channel,
  • replacement in inflorescence/src/selection.rs at line 132
    [48.118][53.995:1059](),[53.1059][48.177:217](),[48.177][48.177:217]()
    let (selection, task) = match state.view.selection.take() {
    Some(Selection::UntrackedFile {
    [48.118]
    [48.217]
    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();
    }
    let (selection, task) = match state.view.status.take() {
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 158
    [48.448][48.448:495]()
    Selection::UntrackedFile {
    [48.448]
    [48.495]
    Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 218
    [48.1648][48.1648:1686]()
    Some(Selection::ChangedFile {
    [48.1648]
    [48.1686]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 226
    [48.1915][48.1915:1960]()
    Selection::ChangedFile {
    [48.1915]
    [48.1960]
    Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 286
    [48.3113][48.3113:3149]()
    Some(Selection::LogChange {
    [48.3113]
    [48.3149]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 300
    [48.3574][52.23686:23749]()
    let selection = Selection::LogChange {
    [48.3574]
    [52.23749]
    let selection = Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 347
    [18.7679][52.25237:25300]()
    let selection = Selection::LogChange {
    [18.7679]
    [52.25300]
    let selection = Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 441
    [48.6976][53.1060:1098]()
    state.view.selection = selection;
    [48.6976]
    [48.7009]
    state.view.status = selection;
  • edit in inflorescence/src/selection.rs at line 456
    [51.9001]
    [51.9001]
    switching_channel,
  • replacement in inflorescence/src/selection.rs at line 461
    [48.7097][53.1099:1163](),[53.1163][48.7156:7196](),[48.7156][48.7156:7196]()
    let (selection, task) = match state.view.selection.take() {
    Some(Selection::UntrackedFile {
    [48.7097]
    [48.7196]
    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();
    }
    let (selection, task) = match state.view.status.take() {
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 487
    [48.7427][48.7427:7474]()
    Selection::UntrackedFile {
    [48.7427]
    [48.7474]
    Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 547
    [48.8655][48.8655:8693]()
    Some(Selection::ChangedFile {
    [48.8655]
    [48.8693]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 555
    [48.8922][48.8922:8967]()
    Selection::ChangedFile {
    [48.8922]
    [48.8967]
    Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 615
    [48.10171][48.10171:10207]()
    Some(Selection::LogChange {
    [48.10171]
    [48.10207]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 629
    [48.10632][52.29701:29764]()
    let selection = Selection::LogChange {
    [48.10632]
    [52.29764]
    let selection = Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 673
    [52.31247][52.31247:31310]()
    let selection = Selection::LogChange {
    [52.31247]
    [52.31310]
    let selection = Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 768
    [45.38655][53.1164:1202]()
    state.view.selection = selection;
    [45.38655]
    [48.14007]
    state.view.status = selection;
  • replacement in inflorescence/src/selection.rs at line 778
    [47.4343][53.1203:1245](),[53.1245][47.4380:4420](),[47.4380][47.4380:4420]()
    match state.view.selection.as_mut() {
    Some(Selection::UntrackedFile {
    [47.4343]
    [47.4420]
    match state.view.status.as_mut() {
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 798
    [47.4868][47.4868:4906]()
    Some(Selection::ChangedFile {
    [47.4868]
    [47.4906]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 817
    [47.5352][47.5352:5388]()
    Some(Selection::LogChange {
    [47.5352]
    [47.5388]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 839
    [47.6013][47.6013:6149]()
    Some(Selection::UntrackedFile { .. })
    | Some(Selection::ChangedFile { .. })
    | Some(Selection::LogChange { .. })
    [47.6013]
    [47.6149]
    Some(Status::UntrackedFile { .. })
    | Some(Status::ChangedFile { .. })
    | Some(Status::LogChange { .. })
  • replacement in inflorescence/src/selection.rs at line 852
    [47.6357][53.1246:1288](),[53.1288][47.6394:6434](),[47.6394][47.6394:6434]()
    match state.view.selection.as_mut() {
    Some(Selection::UntrackedFile {
    [47.6357]
    [47.6434]
    match state.view.status.as_mut() {
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 872
    [47.6880][47.6880:6918]()
    Some(Selection::ChangedFile {
    [47.6880]
    [47.6918]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 891
    [47.7362][47.7362:7398]()
    Some(Selection::LogChange {
    [47.7362]
    [47.7398]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 913
    [47.8021][47.8021:8157]()
    Some(Selection::UntrackedFile { .. })
    | Some(Selection::ChangedFile { .. })
    | Some(Selection::LogChange { .. })
    [47.8021]
    [47.8157]
    Some(Status::UntrackedFile { .. })
    | Some(Status::ChangedFile { .. })
    | Some(Status::LogChange { .. })
  • edit in inflorescence/src/selection.rs at line 927
    [52.34932]
    [52.34932]
    switching_channel: _,
  • replacement in inflorescence/src/selection.rs at line 932
    [48.14096][52.34967:35034](),[52.35034][53.1289:1333](),[53.1333][52.35073:35113](),[52.35073][52.35073:35113]()
    let (selection, task): (Option<Selection>, Task<crate::Msg>) =
    match state.view.selection.take() {
    Some(Selection::LogChange {
    [48.14096]
    [52.35113]
    let (selection, task): (Option<Status>, Task<crate::Msg>) =
    match state.view.status.take() {
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 947
    [52.35370][52.35370:35422]()
    Some(Selection::LogChange {
    [52.35370]
    [52.35422]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 960
    [52.35871][52.35871:35930]()
    let selection = Selection::LogChange {
    [52.35871]
    [52.35930]
    let selection = Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 972
    [52.36292][52.36292:36336]()
    Some(Selection::UntrackedFile {
    [52.36292]
    [52.36336]
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 977
    [52.36435][52.36435:36483]()
    Some(Selection::UntrackedFile {
    [52.36435]
    [48.14793]
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 984
    [52.36617][52.36617:36659]()
    Some(Selection::ChangedFile {
    [52.36617]
    [52.36659]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 989
    [52.36758][52.36758:36804]()
    Some(Selection::ChangedFile {
    [52.36758]
    [52.36804]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 996
    [52.36961][52.36961:37134]()
    selection @ (Some(Selection::UntrackedFile { .. })
    | Some(Selection::ChangedFile { .. })
    | Some(Selection::LogChange { file: None, .. })
    [52.36961]
    [52.37134]
    selection @ (Some(Status::UntrackedFile { .. })
    | Some(Status::ChangedFile { .. })
    | Some(Status::LogChange { file: None, .. })
  • replacement in inflorescence/src/selection.rs at line 1001
    [52.37195][53.1334:1372]()
    state.view.selection = selection;
    [52.37195]
    [52.37196]
    state.view.status = selection;
  • edit in inflorescence/src/selection.rs at line 1014
    [51.17839]
    [51.17839]
    switching_channel: _,
  • replacement in inflorescence/src/selection.rs at line 1019
    [48.15706][52.37318:37397]()
    let (selection, task): (Option<Selection>, Task<crate::Msg>) = match state
    [48.15706]
    [53.1373]
    let (selection, task): (Option<Status>, Task<crate::Msg>) = match state
  • replacement in inflorescence/src/selection.rs at line 1021
    [53.1387][52.37397:37416](),[52.37397][52.37397:37416]()
    .selection
    [53.1387]
    [52.37416]
    .status
  • replacement in inflorescence/src/selection.rs at line 1024
    [52.37438][52.37438:37478]()
    Some(Selection::UntrackedFile {
    [52.37438]
    [52.37478]
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 1045
    [52.38289][52.38289:38337]()
    Some(Selection::UntrackedFile {
    [52.38289]
    [52.38337]
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 1053
    [52.38488][52.38488:38526]()
    Some(Selection::ChangedFile {
    [52.38488]
    [52.38526]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 1074
    [52.39335][52.39335:39381]()
    Some(Selection::ChangedFile {
    [52.39335]
    [52.39381]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 1082
    [52.39532][52.39532:39568]()
    Some(Selection::LogChange {
    [52.39532]
    [52.39568]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1124
    [52.41014][52.41014:41058]()
    Some(Selection::LogChange {
    [52.41014]
    [52.41058]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1133
    [52.41229][52.41229:41265]()
    Some(Selection::LogChange {
    [52.41229]
    [52.41265]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1158
    [52.42185][52.42185:42229]()
    Some(Selection::LogChange {
    [52.42185]
    [52.42229]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1173
    [52.42523][53.1388:1426]()
    state.view.selection = selection;
    [52.42523]
    [48.15837]
    state.view.status = selection;
  • replacement in inflorescence/src/selection.rs at line 1187
    [46.7441][53.1427:1477](),[53.1477][46.7486:7534](),[46.7486][46.7486:7534]()
    match state.view.selection.as_mut() {
    Some(Selection::UntrackedFile {
    [46.7441]
    [46.7534]
    match state.view.status.as_mut() {
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 1203
    [46.8026][46.8026:8072]()
    Some(Selection::ChangedFile {
    [46.8026]
    [46.8072]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 1218
    [46.8562][46.8562:8606]()
    Some(Selection::LogChange {
    [46.8562]
    [46.8606]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1238
    [46.9311][46.9311:9471]()
    Some(Selection::UntrackedFile { .. })
    | Some(Selection::ChangedFile { .. })
    | Some(Selection::LogChange { .. })
    [46.9311]
    [46.9471]
    Some(Status::UntrackedFile { .. })
    | Some(Status::ChangedFile { .. })
    | Some(Status::LogChange { .. })
  • edit in inflorescence/src/selection.rs at line 1259
    [51.18046]
    [51.18046]
    switching_channel: _,
  • replacement in inflorescence/src/selection.rs at line 1287
    [45.47266][45.47266:47314]()
    Some(Selection::UntrackedFile {
    [45.47266]
    [45.47314]
    Some(Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 1321
    [45.48627][45.48627:48673]()
    Some(Selection::ChangedFile {
    [45.48627]
    [45.48673]
    Some(Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 1330
    [45.48875][45.48875:48915]()
    Some(Selection::LogChange {
    [45.48875]
    [45.48915]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1339
    [45.49120][53.1478:1526](),[53.1526][45.49163:49207](),[45.49163][45.49163:49207]()
    match state.view.selection.take() {
    Some(Selection::LogChange {
    [45.49120]
    [45.49207]
    match state.view.status.take() {
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1367
    [18.24736][18.24736:24788]()
    Some(Selection::LogChange {
    [18.24736]
    [45.50442]
    Some(Status::LogChange {
  • replacement in inflorescence/src/selection.rs at line 1380
    [18.26577][53.1527:1565]()
    state.view.selection = selection;
    [18.26577]
    [45.50637]
    state.view.status = selection;
  • replacement in inflorescence/src/selection.rs at line 1418
    [52.44282][52.44282:44319]()
    ) -> (Selection, Task<crate::Msg>) {
    [52.44282]
    [52.44319]
    ) -> (Status, Task<crate::Msg>) {
  • replacement in inflorescence/src/selection.rs at line 1460
    [52.45871][52.45871:45918]()
    let selection = Selection::UntrackedFile {
    [52.45871]
    [52.45918]
    let selection = Status::UntrackedFile {
  • replacement in inflorescence/src/selection.rs at line 1476
    [52.46242][52.46242:46279]()
    ) -> (Selection, Task<crate::Msg>) {
    [52.46242]
    [52.46279]
    ) -> (Status, Task<crate::Msg>) {
  • replacement in inflorescence/src/selection.rs at line 1520
    [52.47900][52.47900:47945]()
    let selection = Selection::ChangedFile {
    [52.47900]
    [52.47945]
    let selection = Status::ChangedFile {
  • replacement in inflorescence/src/selection.rs at line 1535
    [52.48225][52.48225:48262]()
    ) -> (Selection, Task<crate::Msg>) {
    [52.48225]
    [52.48262]
    ) -> (Status, Task<crate::Msg>) {
  • replacement in inflorescence/src/selection.rs at line 1569
    [52.49426][52.49426:49469]()
    let selection = Selection::LogChange {
    [52.49426]
    [52.49469]
    let selection = Status::LogChange {
  • edit in inflorescence/src/selection.rs at line 1617
    [52.50926]
    [52.50926]
    }
    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 1
    [13.1340][12.1207:1219](),[29.5222][12.1207:1219](),[2.2763][12.1207:1219]()
    mod cursor;
  • edit in inflorescence/src/main.rs at line 3
    [19.27]
    [30.4080]
    mod selection;
  • replacement in inflorescence/src/main.rs at line 50
    [31.66][31.66:127]()
    let repo_path = PathBuf::from("/home/tz/dev/pijul");
    [31.66]
    [31.127]
    let repo_path = PathBuf::from("/home/tz/dev/pj-test");
  • replacement in inflorescence/src/main.rs at line 72
    [6.1953][6.1953:1996]()
    let cursor = cursor::State::default();
    [21.654]
    [8.5475]
    let selection = selection::State::default();
  • replacement in inflorescence/src/main.rs at line 99
    [8.6075][5.1500:1520](),[5.1500][5.1500:1520]()
    cursor,
    [8.6075]
    [7.100]
    selection,
  • replacement in inflorescence/src/main.rs at line 117
    [50.4400][4.625:652](),[8.6175][4.625:652](),[3.5100][4.625:652]()
    cursor: cursor::State,
    [50.4400]
    [11.23]
    selection: selection::State,
  • replacement in inflorescence/src/main.rs at line 250
    [22.26390][52.8968:9017]()
    app::Msg::Cursor(msg) => cursor::update(
    [22.26390]
    [52.9017]
    app::Msg::Confirm => {
    if let Some(repo) = state.repo.as_mut()
    && repo.switching_channel
    && let Some(selection::Channel { ix: _, name }) =
    state.selection.view.channel.take()
    {
    state
    .repo_tx_in
    .send(repo::MsgIn::SwitchToChannel(name))
    .unwrap();
    repo.switching_channel = false;
    }
    Task::none()
    }
    app::Msg::Cancel => {
    if let Some(repo) = state.repo.as_mut()
    && repo.switching_channel
    {
    repo.switching_channel = false;
    state.selection.view.channel = None;
    }
    Task::none()
    }
    app::Msg::Selection(msg) => selection::update(
  • replacement in inflorescence/src/main.rs at line 276
    [52.9034][52.9034:9065]()
    &mut state.cursor,
    [52.9034]
    [52.9065]
    &mut state.selection,
  • edit in inflorescence/src/main.rs at line 321
    [54.13009]
    [55.237]
    app::Msg::SwitchChannel => {
    if let Some(repo) = state.repo.as_mut() {
    repo.switching_channel = true;
    }
    Task::none()
    }
  • edit in inflorescence/src/main.rs at line 354
    [50.5058]
    [50.5058]
    switching_channel: _,
  • replacement in inflorescence/src/main.rs at line 356
    [50.5087][49.145:200](),[49.145][49.145:200]()
    && let Some(cursor::Selection::UntrackedFile {
    [50.5087]
    [45.12101]
    && let Some(selection::Status::UntrackedFile {
  • replacement in inflorescence/src/main.rs at line 360
    [45.12165][53.37:87]()
    }) = state.cursor.view.selection.as_ref()
    [45.12165]
    [49.201]
    }) = state.selection.view.status.as_ref()
  • replacement in inflorescence/src/main.rs at line 379
    [50.5327][50.5327:5356]()
    // Re-initialize nav
    [50.5327]
    [50.5356]
    // Re-initialize status nav
  • replacement in inflorescence/src/main.rs at line 390
    [52.10043][53.88:135]()
    state.cursor.view.selection = None
    [52.10043]
    [49.746]
    state.selection.view.status = None
  • replacement in inflorescence/src/main.rs at line 393
    [50.5737][52.10086:10166](),[52.10166][50.5788:5816](),[50.5788][50.5788:5816](),[50.5816][52.10167:10195](),[52.10195][50.5816:5870](),[50.5816][50.5816:5870](),[50.5870][52.10196:10290]()
    let (selection, selection_task) = cursor::untracked_file_selection(
    repo_state,
    status_nav,
    ix,
    &mut state.files,
    &mut state.files_diffs,
    cursor::VertDir::Down,
    );
    [50.5737]
    [52.10290]
    let (selection, selection_task) =
    selection::untracked_file_selection(
    repo_state,
    status_nav,
    ix,
    &mut state.files,
    &mut state.files_diffs,
    selection::VertDir::Down,
    );
  • replacement in inflorescence/src/main.rs at line 403
    [52.10291][53.136:195]()
    state.cursor.view.selection = Some(selection);
    [52.10291]
    [52.10345]
    state.selection.view.status = Some(selection);
  • edit in inflorescence/src/main.rs at line 416
    [50.6042]
    [50.6042]
    switching_channel: _,
  • replacement in inflorescence/src/main.rs at line 418
    [50.6071][49.966:1019](),[49.966][49.966:1019]()
    && let Some(cursor::Selection::ChangedFile {
    [50.6071]
    [45.12264]
    && let Some(selection::Status::ChangedFile {
  • replacement in inflorescence/src/main.rs at line 422
    [45.12328][53.196:246]()
    }) = state.cursor.view.selection.as_ref()
    [45.12328]
    [49.1020]
    }) = state.selection.view.status.as_ref()
  • replacement in inflorescence/src/main.rs at line 456
    [52.10615][53.247:298]()
    state.cursor.view.selection = None
    [52.10615]
    [49.1850]
    state.selection.view.status = None
  • replacement in inflorescence/src/main.rs at line 460
    [52.10712][52.10712:10764]()
    cursor::changed_file_selection(
    [52.10712]
    [52.10764]
    selection::changed_file_selection(
  • replacement in inflorescence/src/main.rs at line 466
    [52.10954][52.10954:11001]()
    cursor::VertDir::Down,
    [52.10954]
    [52.11001]
    selection::VertDir::Down,
  • replacement in inflorescence/src/main.rs at line 469
    [52.11025][53.299:362]()
    state.cursor.view.selection = Some(selection);
    [52.11025]
    [52.11083]
    state.selection.view.status = Some(selection);
  • edit in inflorescence/src/main.rs at line 526
    [32.5494][32.5494:5532](),[32.5532][50.7061:7124](),[50.7124][32.5589:5637](),[32.5589][32.5589:5637]()
    state.record_msg = None;
    state.repo.as_mut().unwrap().state.changed_files =
    repo::ChangedFiles::default();
  • edit in inflorescence/src/main.rs at line 531
    [32.5800]
    [32.5800]
    // Reset most things
    state.selection = selection::State::default();
    state.record_msg = None;
    state.files_diffs.diffs_nav = None;
    state.logs.changes_nav = None;
    state.logs.diffs_nav = None;
    let app::Repo {
    state: repo_state,
    status_nav,
    switching_channel: _,
    } = state.repo.as_mut().unwrap();
    repo_state.changed_files = repo::ChangedFiles::default();
    state.files_diffs.diffs_nav = None;
    // Re-initialize status nav
    let contents_count = repo::nav_contents_count(repo_state);
    let (new_status_nav, status_nav_task) =
    iced_nav_scrollable::init(contents_count, HashSet::default());
    *status_nav = new_status_nav;
    return status_nav_task
    .map(|msg| Msg::View(app::Msg::StatusNav(msg)));
  • replacement in inflorescence/src/main.rs at line 602
    [32.7374][32.7374:7421]()
    if let Some(cursor::Selection::LogChange {
    [32.7374]
    [32.7421]
    if let Some(selection::Status::LogChange {
  • replacement in inflorescence/src/main.rs at line 607
    [32.7527][32.7527:7577]()
    Some(cursor::LogChangeFileSelection {
    [32.7527]
    [16.259]
    Some(selection::LogChangeFileSelection {
  • replacement in inflorescence/src/main.rs at line 612
    [32.7631][53.363:409]()
    }) = state.cursor.view.selection.as_mut()
    [32.7631]
    [32.7672]
    }) = state.selection.view.status.as_mut()
  • edit in inflorescence/src/main.rs at line 645
    [50.7370]
    [50.7370]
    switching_channel: false,
  • edit in inflorescence/src/main.rs at line 694
    [32.9306]
    [32.9306]
    other_channels: _,
  • replacement in inflorescence/src/main.rs at line 701
    [9.1650][32.9442:9475](),[32.9475][50.7499:7540](),[50.7540][37.8669:8696](),[37.8669][37.8669:8696]()
    // Re-index cursor selection
    let cursor_task = reindex_selection(
    &mut state.cursor,
    [9.1650]
    [37.8696]
    // Re-index selection
    let selection_task = reindex_selection(
    &mut state.selection,
  • edit in inflorescence/src/main.rs at line 714
    [37.8821]
    [50.7711]
    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 selection
    false
    };
  • edit in inflorescence/src/main.rs at line 727
    [50.7786]
    [50.7786]
    switching_channel,
  • replacement in inflorescence/src/main.rs at line 731
    [50.7813][50.7813:7834]()
    cursor_task,
    [50.7813]
    [50.7834]
    selection_task,
  • replacement in inflorescence/src/main.rs at line 738
    [37.8931][37.8931:8963]()
    cursor: &mut cursor::State,
    [37.8931]
    [37.8963]
    selection: &mut selection::State,
  • replacement in inflorescence/src/main.rs at line 744
    [37.9110][53.410:470](),[53.470][32.9641:9691](),[37.9165][32.9641:9691](),[32.9641][32.9641:9691](),[32.9691][45.13823:13870]()
    if let Some(selection) = cursor.view.selection.take() {
    let (selection, task) = match selection {
    cursor::Selection::UntrackedFile {
    [37.9110]
    [45.13870]
    if let Some(current_selection) = selection.view.status.take() {
    let (new_selection, task) = match current_selection {
    selection::Status::UntrackedFile {
  • replacement in inflorescence/src/main.rs at line 755
    [32.10197][32.10197:10271]()
    .map(|(ix, _path)| cursor::Selection::UntrackedFile {
    [32.10197]
    [32.10271]
    .map(|(ix, _path)| selection::Status::UntrackedFile {
  • replacement in inflorescence/src/main.rs at line 773
    [32.10409][45.14006:14051]()
    cursor::Selection::ChangedFile {
    [32.10409]
    [45.14051]
    selection::Status::ChangedFile {
  • replacement in inflorescence/src/main.rs at line 783
    [32.10920][32.10920:10977]()
    cursor::Selection::ChangedFile {
    [32.10920]
    [32.10977]
    selection::Status::ChangedFile {
  • replacement in inflorescence/src/main.rs at line 805
    [32.11168][32.11168:11211]()
    cursor::Selection::LogChange {
    [32.11168]
    [32.11211]
    selection::Status::LogChange {
  • replacement in inflorescence/src/main.rs at line 817
    [45.14241][45.14241:14303]()
    |cursor::LogChangeFileSelection {
    [45.14241]
    [45.14303]
    |selection::LogChangeFileSelection {
  • replacement in inflorescence/src/main.rs at line 828
    [45.14795][45.14795:14868]()
    cursor::LogChangeFileSelection {
    [45.14795]
    [45.14868]
    selection::LogChangeFileSelection {
  • replacement in inflorescence/src/main.rs at line 836
    [45.15178][32.12298:12353](),[32.12298][32.12298:12353]()
    cursor::Selection::LogChange {
    [45.15178]
    [32.12353]
    selection::Status::LogChange {
  • replacement in inflorescence/src/main.rs at line 857
    [37.10442][53.471:514]()
    cursor.view.selection = selection;
    [37.10442]
    [15.9662]
    selection.view.status = new_selection;
  • replacement in inflorescence/src/main.rs at line 872
    [52.12318][52.12318:12376]()
    let task = if let Some(cursor::Selection::LogChange {
    [52.12318]
    [32.12937]
    let task = if let Some(selection::Status::LogChange {
  • replacement in inflorescence/src/main.rs at line 877
    [52.12391][53.515:561]()
    }) = state.cursor.view.selection.as_mut()
    [52.12391]
    [49.2861]
    }) = state.selection.view.status.as_mut()
  • replacement in inflorescence/src/main.rs at line 941
    [54.13082][46.932:1058](),[22.27435][46.932:1058]()
    "j" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::PressDir(cursor::Dir::Down),
    [54.13082]
    [46.1058]
    "c" => Some(Msg::View(app::Msg::SwitchChannel)),
    "j" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Down),
  • replacement in inflorescence/src/main.rs at line 945
    [46.1083][46.1083:1207]()
    "k" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::PressDir(cursor::Dir::Up),
    [46.1083]
    [46.1207]
    "k" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Up),
  • replacement in inflorescence/src/main.rs at line 948
    [46.1232][46.1232:1358]()
    "h" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::PressDir(cursor::Dir::Left),
    [46.1232]
    [46.1358]
    "h" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Left),
  • replacement in inflorescence/src/main.rs at line 951
    [46.1383][46.1383:1510]()
    "l" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::PressDir(cursor::Dir::Right),
    [46.1383]
    [46.1510]
    "l" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Right),
  • replacement in inflorescence/src/main.rs at line 958
    [4.3059][46.1536:2210]()
    Key::Named(key::Named::ArrowDown) => Some(Msg::View(
    app::Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Down)),
    )),
    Key::Named(key::Named::ArrowUp) => Some(Msg::View(
    app::Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Up)),
    )),
    Key::Named(key::Named::ArrowLeft) => Some(Msg::View(
    app::Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Left)),
    )),
    Key::Named(key::Named::ArrowRight) => Some(Msg::View(
    app::Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Right)),
    )),
    [4.3059]
    [4.3059]
    Key::Named(key::Named::Enter) => {
    Some(Msg::View(app::Msg::Confirm))
    }
    Key::Named(key::Named::Escape) => {
    Some(Msg::View(app::Msg::Cancel))
    }
    Key::Named(key::Named::ArrowDown) => {
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Down),
    )))
    }
    Key::Named(key::Named::ArrowUp) => {
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Up),
    )))
    }
    Key::Named(key::Named::ArrowLeft) => {
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Left),
    )))
    }
    Key::Named(key::Named::ArrowRight) => {
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::PressDir(selection::Dir::Right),
    )))
    }
  • replacement in inflorescence/src/main.rs at line 1002
    [47.185][47.185:315]()
    Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::AltPressDir(cursor::Dir::Down),
    [47.185]
    [47.315]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Down),
  • replacement in inflorescence/src/main.rs at line 1007
    [47.422][47.422:550]()
    Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::AltPressDir(cursor::Dir::Up),
    [47.422]
    [47.550]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Up),
  • replacement in inflorescence/src/main.rs at line 1012
    [47.636][47.636:766]()
    Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::AltPressDir(cursor::Dir::Left),
    [47.636]
    [47.766]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Left),
  • replacement in inflorescence/src/main.rs at line 1017
    [47.873][47.873:1004]()
    Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::AltPressDir(cursor::Dir::Right),
    [47.873]
    [47.1004]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Right),
  • replacement in inflorescence/src/main.rs at line 1026
    [47.1174][47.1174:1320]()
    Some(Msg::View(app::Msg::Cursor(cursor::Msg::AltPressDir(
    cursor::Dir::Down,
    ))))
    [47.1174]
    [47.1320]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Down),
    )))
  • replacement in inflorescence/src/main.rs at line 1031
    [47.1419][47.1419:1563]()
    Some(Msg::View(app::Msg::Cursor(cursor::Msg::AltPressDir(
    cursor::Dir::Up,
    ))))
    [47.1419]
    [47.1563]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Up),
    )))
  • replacement in inflorescence/src/main.rs at line 1038
    [47.1700][47.1700:1846]()
    Some(Msg::View(app::Msg::Cursor(cursor::Msg::AltPressDir(
    cursor::Dir::Left,
    ))))
    [47.1700]
    [47.1846]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Left),
    )))
  • replacement in inflorescence/src/main.rs at line 1045
    [47.1984][47.1984:2131]()
    Some(Msg::View(app::Msg::Cursor(cursor::Msg::AltPressDir(
    cursor::Dir::Right,
    ))))
    [47.1984]
    [47.2131]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::AltPressDir(selection::Dir::Right),
    )))
  • replacement in inflorescence/src/main.rs at line 1058
    [46.2468][46.2468:2596]()
    "j" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::ReleaseDir(cursor::Dir::Down),
    [46.2468]
    [46.2596]
    "j" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Down),
  • replacement in inflorescence/src/main.rs at line 1061
    [46.2621][46.2621:2747]()
    "k" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::ReleaseDir(cursor::Dir::Up),
    [46.2621]
    [46.2747]
    "k" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Up),
  • replacement in inflorescence/src/main.rs at line 1064
    [46.2772][46.2772:2900]()
    "h" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::ReleaseDir(cursor::Dir::Left),
    [46.2772]
    [46.2900]
    "h" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Left),
  • replacement in inflorescence/src/main.rs at line 1067
    [46.2925][46.2925:3054]()
    "l" => Some(Msg::View(app::Msg::Cursor(
    cursor::Msg::ReleaseDir(cursor::Dir::Right),
    [46.2925]
    [46.3054]
    "l" => Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Right),
  • replacement in inflorescence/src/main.rs at line 1073
    [46.3184][46.3184:3329]()
    Some(Msg::View(app::Msg::Cursor(cursor::Msg::ReleaseDir(
    cursor::Dir::Down,
    ))))
    [46.3184]
    [46.3329]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Down),
    )))
    }
    Key::Named(key::Named::ArrowUp) => {
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Up),
    )))
  • edit in inflorescence/src/main.rs at line 1082
    [46.3347][46.3347:3514]()
    Key::Named(key::Named::ArrowUp) => Some(Msg::View(
    app::Msg::Cursor(cursor::Msg::ReleaseDir(cursor::Dir::Up)),
    )),
  • replacement in inflorescence/src/main.rs at line 1083
    [46.3569][46.3569:3714]()
    Some(Msg::View(app::Msg::Cursor(cursor::Msg::ReleaseDir(
    cursor::Dir::Left,
    ))))
    [46.3569]
    [46.3714]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Left),
    )))
  • replacement in inflorescence/src/main.rs at line 1088
    [46.3788][46.3788:3934]()
    Some(Msg::View(app::Msg::Cursor(cursor::Msg::ReleaseDir(
    cursor::Dir::Right,
    ))))
    [46.3788]
    [46.3934]
    Some(Msg::View(app::Msg::Selection(
    selection::Msg::ReleaseDir(selection::Dir::Right),
    )))
  • replacement in inflorescence/src/main.rs at line 1118
    [50.8111][53.562:631](),[53.631][45.15805:15853](),[50.8175][45.15805:15853](),[45.15805][45.15805:15853]()
    let diff_nav_subs = match state.cursor.view.selection.as_ref() {
    Some(cursor::Selection::UntrackedFile {
    [50.8111]
    [45.15853]
    let diff_nav_subs = match state.selection.view.status.as_ref() {
    Some(selection::Status::UntrackedFile {
  • replacement in inflorescence/src/main.rs at line 1134
    [45.16253][45.16253:16299]()
    Some(cursor::Selection::ChangedFile {
    [45.16253]
    [45.16299]
    Some(selection::Status::ChangedFile {
  • replacement in inflorescence/src/main.rs at line 1149
    [45.16697][45.16697:16741]()
    Some(cursor::Selection::LogChange {
    [45.16697]
    [45.16741]
    Some(selection::Status::LogChange {
  • replacement in inflorescence/src/main.rs at line 1154
    [45.16820][45.16820:16874]()
    Some(cursor::LogChangeFileSelection {
    [45.16820]
    [45.16874]
    Some(selection::LogChangeFileSelection {
  • replacement in inflorescence/src/main.rs at line 1168
    [45.17309][45.17309:17469]()
    Some(cursor::Selection::UntrackedFile { .. })
    | Some(cursor::Selection::ChangedFile { .. })
    | Some(cursor::Selection::LogChange { .. })
    [45.17309]
    [45.17469]
    Some(selection::Status::UntrackedFile { .. })
    | Some(selection::Status::ChangedFile { .. })
    | Some(selection::Status::LogChange { .. })
  • replacement in inflorescence/src/main.rs at line 1192
    [22.28645][22.28645:28661]()
    cursor,
    [22.28645]
    [22.28661]
    selection,
  • replacement in inflorescence/src/main.rs at line 1199
    [43.6244][54.13429:13488](),[53.697][45.17624:17672](),[54.13488][45.17624:17672](),[52.15044][45.17624:17672](),[43.6308][45.17624:17672]()
    let selection = match cursor.view.selection.as_ref() {
    Some(cursor::Selection::UntrackedFile {
    [43.6244]
    [52.15045]
    let status_selection = match selection.view.status.as_ref() {
    Some(selection::Status::UntrackedFile {
  • replacement in inflorescence/src/main.rs at line 1224
    [52.15747][52.15747:15796]()
    Some(app::Selection::UntrackedFile {
    [52.15747]
    [52.15796]
    Some(app::StatusSelection::UntrackedFile {
  • replacement in inflorescence/src/main.rs at line 1230
    [43.6552][45.17969:18015]()
    Some(cursor::Selection::ChangedFile {
    [43.6552]
    [45.18015]
    Some(selection::Status::ChangedFile {
  • replacement in inflorescence/src/main.rs at line 1265
    [54.13859][52.16582:16629](),[52.16582][52.16582:16629]()
    Some(app::Selection::ChangedFile {
    [54.13859]
    [52.16629]
    Some(app::StatusSelection::ChangedFile {
  • replacement in inflorescence/src/main.rs at line 1272
    [43.6934][43.6934:6978]()
    Some(cursor::Selection::LogChange {
    [43.6792]
    [52.16714]
    Some(selection::Status::LogChange {
  • replacement in inflorescence/src/main.rs at line 1279
    [52.16821][52.16821:16871]()
    |cursor::LogChangeFileSelection {
    [52.16821]
    [52.16871]
    |selection::LogChangeFileSelection {
  • replacement in inflorescence/src/main.rs at line 1309
    [52.18199][52.18199:18238]()
    Some(app::Selection::Log {
    [52.18199]
    [52.18238]
    Some(app::StatusSelection::Log {
  • replacement in inflorescence/src/main.rs at line 1325
    [52.18572][52.18572:18591]()
    selection,
    [52.18572]
    [52.18591]
    status_selection,
    channel_selection: selection.view.channel.as_ref(),