actions menu

[?]
Jul 23, 2025, 12:22 PM
A6Z4O6RC33HYWP7JIVQ6FDWE4EOCQWQTIGENK2WAHUGSHDDLSA7QC

Dependencies

  • [2] WT3GA27P add cursor with selection
  • [3] KT5UYXGK fix selection after adding file, add changed file diffs
  • [4] ELG3UDT6 allow to rm added files
  • [5] S2NVIFXR allow to enter record msg
  • [6] D7A7MSIH allow to defer or abandon record, add buttons
  • [7] ZVI4AWER woot contents_diff
  • [8] AHWWRC73 navigate log entries
  • [9] L6KSEFQI move cursor related stuff into its module
  • [10] 23SFYK4Q big view refactor into a new crate
  • [11] OPXFZKEB view tests setup
  • [12] 3QVNMRNM test non-empty repo app view
  • [13] MYGIBRRH wip custom theme
  • [14] PKJCFSBM theme improvements
  • [15] XSZZB47U refactor stuff into lib
  • [16] 3BK22XE5 add a test for hover btn and more refactors
  • [17] ACDXXAX2 refactor main's updates into smaller fns
  • [18] I56UGW7U make record test, fix log update
  • [19] X6AK4QPX finish recording test
  • [20] KMB6FND3 test view update fn rather than direct fn calls
  • [21] YYKXNBFL test: add untracked file
  • [22] 5CYU7UT7 test: rm added file
  • [23] ESMM3FEL test selection reindexing
  • [24] TSFQFCB2 test got repo change
  • [25] 7SSBM4UQ view: refactor repo view
  • [26] OC6DLIZ3 test record when nothing to record
  • [27] ZD56BUSU add back +/- bg colors
  • [28] I2AG42PA new cols layout
  • [29] SASAN2XC use nav-scrollable
  • [30] YKHE3XMW refactor diffs handling
  • [31] KWTBNTO3 diffs selection and scrolling
  • [32] 5MUEECMJ smooth scrolling nav
  • [33] PTWZYQFR use nav-scrollable for repo status
  • [34] UR4J677R nav for log changes and refactors
  • [35] K63JN6CR refactor out non-view field from cursor
  • [36] FLQWY7L4 iced-nav-scrollable more docs
  • [37] WW36JYLR add iced_nav_scrollable widget crate
  • [38] 3TLPJ57B alt scroll via context and couple fixes
  • [39] A5YBC77V record!
  • [40] GOLHUD6R nav-scrollable: set skip-able sections
  • [41] 65DXFP3Y fix status overflow
  • [42] 6YZAVBWU Initial commit
  • [43] BFN2VHZS refactor file stuff into sub-mod
  • [44] S2T7RUKW add nav back placeholder
  • [45] W7IUT3ZV start recording impl
  • [46] KEPKF3WO unify diffs handling, simplify view
  • [47] YBJRDOTC make all repo actions async
  • [48] TEI5NQ3S add log files selection
  • [*] VCNKFNUF app init test

Change contents

  • edit in inflorescence_view/src/theme.rs at line 60
    [14.1261]
    [14.1261]
    const ACTIONS_BG: Background = Background::Color(BLUE_DARKER);
  • edit in inflorescence_view/src/theme.rs at line 86
    [14.1363]
    [27.163]
    ActionsBg,
  • edit in inflorescence_view/src/theme.rs at line 197
    [14.2391]
    [27.200]
    Container::ActionsBg => container::Style {
    background: Some(ACTIONS_BG),
    ..default()
    },
  • replacement in inflorescence_view/src/app.rs at line 12
    [34.1090][15.5749:5798](),[15.5749][15.5749:5798]()
    use iced::{font, window, Element, Font, Length};
    [34.1090]
    [10.12673]
    use iced::{font, window, Element, Font, Length, Padding};
  • edit in inflorescence_view/src/app.rs at line 27
    [33.1029][10.12861:12896](),[10.12861][10.12861:12896]()
    pub cursor: &'a cursor::State,
  • edit in inflorescence_view/src/app.rs at line 52
    [34.1372]
    [34.1372]
    is_added_from_untracked: bool,
  • replacement in inflorescence_view/src/app.rs at line 88
    [10.13128][10.13128:13145]()
    DeferRecord,
    [10.13128]
    [10.13145]
    PostponeRecord,
  • replacement in inflorescence_view/src/app.rs at line 90
    [10.13161][10.13161:13180]()
    AbandonRecord,
    [10.13161]
    [34.1954]
    DiscardRecord,
  • edit in inflorescence_view/src/app.rs at line 101
    [10.13379]
    [10.15355]
    AddUntrackedFile,
    RmAddedFile,
    StartRecord,
  • edit in inflorescence_view/src/app.rs at line 120
    [34.2245][34.2245:2261]()
    cursor,
  • replacement in inflorescence_view/src/app.rs at line 124
    [34.2358][34.2358:2437]()
    view_repo(window_size, repo_path, repo, cursor, record_msg, selection)
    [34.2358]
    [25.75]
    view_repo(window_size, repo_path, repo, record_msg, selection)
  • edit in inflorescence_view/src/app.rs at line 139
    [34.2553][34.2553:2584]()
    cursor: &'a cursor::State,
  • replacement in inflorescence_view/src/app.rs at line 166
    [10.16079][34.3138:3209](),[34.3209][10.16156:16260](),[10.16156][10.16156:16260]()
    let is_selected = matches!(cursor.selection.as_ref() ,
    Some(cursor::Selection::UntrackedFile{ ix: selected_ix, .. }) if &ix == selected_ix
    [10.16079]
    [10.16260]
    let is_selected = matches!(selection.as_ref() ,
    Some(Selection::UntrackedFile{ ix: selected_ix, .. }) if &ix == selected_ix
  • replacement in inflorescence_view/src/app.rs at line 185
    [10.16783][34.3291:3361](),[34.3361][10.16859:16961](),[10.16859][10.16859:16961]()
    let is_selected = matches!(cursor.selection.as_ref(),
    Some(cursor::Selection::ChangedFile{ ix: selected_ix, .. }) if &ix == selected_ix
    [10.16783]
    [10.16961]
    let is_selected = matches!(selection.as_ref(),
    Some(Selection::ChangedFile{ ix: selected_ix, .. }) if &ix == selected_ix
  • replacement in inflorescence_view/src/app.rs at line 210
    [10.17641][34.3423:3493](),[34.3493][10.17717:17818](),[10.17717][10.17717:17818]()
    let is_selected = matches!(cursor.selection.as_ref(),
    Some(cursor::Selection::LogChange { ix: selected_ix, .. }) if &ix == selected_ix
    [10.17641]
    [10.17818]
    let is_selected = matches!(selection.as_ref(),
    Some(Selection::Log { ix: selected_ix, .. }) if &ix == selected_ix
  • replacement in inflorescence_view/src/app.rs at line 234
    [34.3875][34.3875:4027]()
    el(button(text("Defer")).on_press(Msg::DeferRecord)),
    el(button(text("Abandon")).on_press(Msg::AbandonRecord)),
    [34.3875]
    [34.4027]
    el(button(text("Postpone")).on_press(Msg::PostponeRecord)),
    el(button(text("Discard")).on_press(Msg::DiscardRecord)),
  • replacement in inflorescence_view/src/app.rs at line 262
    [25.2546][34.4550:4614]()
    Some(Selection::ChangedFile { path, ix: _, diff }) => {
    [25.2546]
    [31.6761]
    Some(Selection::ChangedFile {
    path,
    ix: _,
    diff,
    is_added_from_untracked: _,
    }) => {
  • replacement in inflorescence_view/src/app.rs at line 336
    [28.1006][34.6044:6108]()
    } else if let Some(selection) = cursor.selection.as_ref() {
    [28.1006]
    [28.1076]
    } else if let Some(selection) = selection.as_ref() {
  • replacement in inflorescence_view/src/app.rs at line 338
    [28.1102][28.1102:1343]()
    cursor::Selection::UntrackedFile { .. }
    | cursor::Selection::ChangedFile { .. }
    | cursor::Selection::LogChange { file: None, .. } => 1,
    cursor::Selection::LogChange { file: Some(_), .. } => 2,
    [28.1102]
    [28.1343]
    Selection::UntrackedFile { .. }
    | Selection::ChangedFile { .. }
    | Selection::Log { file: None, .. } => 1,
    Selection::Log { file: Some(_), .. } => 2,
  • replacement in inflorescence_view/src/app.rs at line 396
    [28.2077][28.2077:2213]()
    el(button(row([
    el(text("← ").font(Font::MONOSPACE)),
    el(text("Status")),
    ]))
    [28.2077]
    [32.448]
    el(button(row([el(
    text("← Status").shaping(text::Shaping::Advanced)
    )]))
  • replacement in inflorescence_view/src/app.rs at line 466
    [10.24231][28.3854:3887]()
    if let Some(col_2) = col_2 {
    [10.24231]
    [28.3887]
    let main = if let Some(col_2) = col_2 {
  • replacement in inflorescence_view/src/app.rs at line 468
    [28.3959][28.3959:3998]()
    el(row(cols).spacing(SPACING))
    [28.3959]
    [28.3998]
    el(row(cols)
    .spacing(SPACING)
    .width(Length::Fill)
    .height(Length::Fill))
  • replacement in inflorescence_view/src/app.rs at line 474
    [28.4046][28.4046:4091]()
    el(row(cols).spacing(SPACING))
    }
    [28.4046]
    [10.24344]
    el(row(cols)
    .spacing(SPACING)
    .width(Length::Fill)
    .height(Length::Fill))
    };
    let actions_inner = view_actions(action_state(repo, record_msg, selection));
    let actions = el(container(actions_inner)
    .class(theme::Container::ActionsBg)
    .width(Length::Fill)
    .height(Length::Shrink)
    .padding(Padding::from([4, 6])));
    el(column([main, actions]))
  • edit in inflorescence_view/src/app.rs at line 495
    [10.24506]
    [10.24506]
    }
    fn view_actions<'a>(state: ActionState) -> Element<'a, Msg, Theme> {
    let left = || {
    action_button(
    "← | h",
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Left)),
    )
    };
    let down = || {
    action_button(
    "↓ | j",
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Down)),
    )
    };
    let up = || {
    action_button(
    "↑ | k",
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Up)),
    )
    };
    let right = || {
    action_button(
    "→ | l",
    Msg::Cursor(cursor::Msg::PressDir(cursor::Dir::Right)),
    )
    };
    let down_no_skip = || {
    action_button(
    "S-(↓ | j): no skip",
    Msg::Cursor(cursor::Msg::AltPressDir(cursor::Dir::Down)),
    )
    };
    let up_no_skip = || {
    action_button(
    "S-(↑ | k): no skip",
    Msg::Cursor(cursor::Msg::AltPressDir(cursor::Dir::Up)),
    )
    };
    let add_untracked =
    || action_button("a: track file", Msg::AddUntrackedFile);
    let rm_added_file = || action_button("x: untrack file", Msg::RmAddedFile);
    let start_record = || action_button("r: record", Msg::StartRecord);
    let save_record = || action_button("C-s: save record", Msg::SaveRecord);
    let postpone_record =
    || action_button("C-d: postpone record", Msg::PostponeRecord);
    let discard_record =
    || action_button("C-d: discard record", Msg::DiscardRecord);
    let add_if = |predicate: bool,
    button: Element<'a, Msg, Theme>,
    row: row::Row<'a, Msg, Theme>| {
    if predicate {
    row.push(button)
    } else {
    row
    }
    };
    let buttons = match state {
    ActionState::Main {
    selection,
    can_select_right,
    can_record,
    } => {
    let row = row([down(), up()]);
    match selection {
    MainSelection::Untracked => {
    let row = row.push(add_untracked());
    let row = add_if(can_select_right, right(), row);
    add_if(can_record, start_record(), row)
    }
    MainSelection::AddedFromUntracked => {
    let row = row.push(rm_added_file());
    let row = add_if(can_select_right, right(), row);
    add_if(can_record, start_record(), row)
    }
    MainSelection::Other => {
    let row = add_if(can_select_right, right(), row);
    add_if(can_record, start_record(), row)
    }
    }
    }
    ActionState::LogChange {
    can_select_right,
    can_record,
    } => {
    let row = row([left(), down(), up()]);
    let row = add_if(can_select_right, right(), row);
    add_if(can_record, start_record(), row)
    }
    ActionState::Diff { can_record } => {
    let row = row([left(), down(), up(), down_no_skip(), up_no_skip()]);
    add_if(can_record, start_record(), row)
    }
    ActionState::Recording => {
    row([save_record(), postpone_record(), discard_record()])
    }
    };
    el(buttons.spacing(2).wrap())
  • edit in inflorescence_view/src/app.rs at line 597
    [10.24508]
    [10.24508]
    enum ActionState {
    /// Main status
    Main {
    selection: MainSelection,
    can_select_right: bool,
    can_record: bool,
    },
    /// Selected a log change, but not diff
    LogChange {
    can_select_right: bool,
    can_record: bool,
    },
    /// Untracked, changed of log change's diff
    Diff { can_record: bool },
    /// Making a record from current changes
    Recording,
    }
    enum MainSelection {
    Untracked,
    AddedFromUntracked,
    Other,
    }
    /// Determine state for actions menu
    fn action_state<'a>(
    repo: &'a Repo,
    record_msg: Option<&'a RecordMsg>,
    selection: Option<Selection<'a>>,
    ) -> ActionState {
    match record_msg {
    Some(RecordMsg::Typing(_)) => return ActionState::Recording,
    Some(RecordMsg::Canceled { .. }) | None => {}
    }
  • edit in inflorescence_view/src/app.rs at line 633
    [10.24509]
    [13.8111]
    let can_record = !repo.state.changed_files.is_empty();
    match selection {
    Some(Selection::UntrackedFile {
    ix: _,
    path: _,
    diff,
    }) => {
    if let Some(diff) = diff {
    if diff.is_selected {
    ActionState::Diff { can_record }
    } else {
    ActionState::Main {
    selection: MainSelection::Untracked,
    can_select_right: matches!(
    diff.nav.ready,
    Some(iced_nav_scrollable::NeedsScrolling::Yes)
    ),
    can_record,
    }
    }
    } else {
    ActionState::Main {
    selection: MainSelection::Untracked,
    can_select_right: false,
    can_record,
    }
    }
    }
    Some(Selection::ChangedFile {
    ix: _,
    path: _,
    diff,
    is_added_from_untracked,
    }) => {
    let main_selection = || {
    if is_added_from_untracked {
    MainSelection::AddedFromUntracked
    } else {
    MainSelection::Other
    }
    };
    if let Some(diff) = diff {
    if diff.is_selected {
    ActionState::Diff { can_record }
    } else {
    ActionState::Main {
    selection: main_selection(),
    can_select_right: matches!(
    diff.nav.ready,
    Some(iced_nav_scrollable::NeedsScrolling::Yes)
    ),
    can_record,
    }
    }
    } else {
    ActionState::Main {
    selection: main_selection(),
    can_select_right: false,
    can_record,
    }
    }
    }
    Some(Selection::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 }
    } else {
    ActionState::LogChange {
    can_select_right: matches!(
    diff.nav.ready,
    Some(iced_nav_scrollable::NeedsScrolling::Yes)
    ),
    can_record,
    }
    }
    } else {
    ActionState::LogChange {
    can_select_right: false,
    can_record,
    }
    }
    }
    None => ActionState::Main {
    selection: MainSelection::Other,
    can_select_right: nav.and_then(|nav| nav.ready).is_some(),
    can_record,
    },
    },
    None => ActionState::Main {
    selection: MainSelection::Other,
    can_select_right: false,
    can_record,
    },
    }
    }
    fn action_button<'a>(label: &'a str, on_press: Msg) -> Element<'a, Msg, Theme> {
    el(button(text(label).shaping(text::Shaping::Advanced)).on_press(on_press))
    }
  • replacement in inflorescence_view/src/app/test.rs at line 1
    [11.4223][33.2241:2281]()
    use super::{cursor, view, Repo, State};
    [11.4223]
    [16.932]
    use super::{view, Repo, Selection, State};
  • edit in inflorescence_view/src/app/test.rs at line 31
    [11.4800][32.651:694]()
    let cursor = cursor::State::default();
  • edit in inflorescence_view/src/app/test.rs at line 37
    [11.5038][11.5038:5063]()
    cursor: &cursor,
  • edit in inflorescence_view/src/app/test.rs at line 64
    [12.188][12.188:213]()
    cursor: &cursor,
  • edit in inflorescence_view/src/app/test.rs at line 104
    [13.8359][13.8359:8384]()
    cursor: &cursor,
  • edit in inflorescence_view/src/app/test.rs at line 117
    [16.1367][16.1367:1392]()
    cursor: &cursor,
  • replacement in inflorescence_view/src/app/test.rs at line 135
    [13.8738][13.8738:8830](),[13.8830][14.3390:3409](),[14.3409][13.8849:8883](),[13.8849][13.8849:8883](),[13.8883][31.7414:7448](),[31.7448][13.8883:8895](),[13.8883][13.8883:8895](),[13.8895][32.695:719](),[32.719][13.8895:8902](),[13.8895][13.8895:8902]()
    let cursor = cursor::State {
    selection: Some(cursor::Selection::UntrackedFile {
    ix: 0,
    path: "".to_string(),
    diff_selected: false,
    }),
    held_key: None,
    };
    [13.8738]
    [11.5637]
    let selection = Some(Selection::UntrackedFile {
    ix: 0,
    path: "",
    diff: None,
    });
  • edit in inflorescence_view/src/app/test.rs at line 144
    [11.5721][11.5721:5746]()
    cursor: &cursor,
  • replacement in inflorescence_view/src/app/test.rs at line 145
    [11.5787][34.8041:8066]()
    selection: None,
    [11.5787]
    [11.5822]
    selection,
  • replacement in inflorescence/src/test.rs at line 120
    [18.3182][18.3182:3241]()
    let _task = update(&mut state, Msg::AddUntrackedFile);
    [18.3182]
    [18.3241]
    let _task = update(&mut state, Msg::View(app::Msg::AddUntrackedFile));
  • replacement in inflorescence/src/test.rs at line 130
    [18.3483][20.426:480]()
    let _task = update(&mut state, Msg::StartRecord);
    [18.3483]
    [18.3525]
    let _task = update(&mut state, Msg::View(app::Msg::StartRecord));
  • replacement in inflorescence/src/test.rs at line 187
    [19.899][19.899:968]()
    state.cursor.selection = Some(cursor::Selection::UntrackedFile {
    [19.899]
    [19.968]
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 194
    [19.1065][19.1065:1124]()
    let _task = update(&mut state, Msg::AddUntrackedFile);
    [19.1065]
    [19.1124]
    let _task = update(&mut state, Msg::View(app::Msg::AddUntrackedFile));
  • replacement in inflorescence/src/test.rs at line 204
    [19.1366][20.718:772]()
    let _task = update(&mut state, Msg::StartRecord);
    [19.1366]
    [19.1408]
    let _task = update(&mut state, Msg::View(app::Msg::StartRecord));
  • replacement in inflorescence/src/test.rs at line 226
    [19.1991][20.940:1012]()
    let _task = update(&mut state, Msg::View(app::Msg::AbandonRecord));
    [19.1991]
    [19.2023]
    let _task = update(&mut state, Msg::View(app::Msg::DiscardRecord));
  • replacement in inflorescence/src/test.rs at line 233
    [19.2135][20.1013:1067]()
    let _task = update(&mut state, Msg::StartRecord);
    [19.2135]
    [19.2177]
    let _task = update(&mut state, Msg::View(app::Msg::StartRecord));
  • replacement in inflorescence/src/test.rs at line 255
    [19.2766][20.1235:1305]()
    let _task = update(&mut state, Msg::View(app::Msg::DeferRecord));
    [19.2766]
    [19.2796]
    let _task = update(&mut state, Msg::View(app::Msg::PostponeRecord));
  • replacement in inflorescence/src/test.rs at line 264
    [19.3067][20.1306:1360]()
    let _task = update(&mut state, Msg::StartRecord);
    [19.3067]
    [19.3109]
    let _task = update(&mut state, Msg::View(app::Msg::StartRecord));
  • replacement in inflorescence/src/test.rs at line 284
    [26.548][26.548:601]()
    let task = update(&mut state, Msg::StartRecord);
    [26.548]
    [26.601]
    let task = update(&mut state, Msg::View(app::Msg::StartRecord));
  • replacement in inflorescence/src/test.rs at line 348
    [21.1918][21.1918:1977]()
    let _task = update(&mut state, Msg::AddUntrackedFile);
    [21.1918]
    [21.1977]
    let _task = update(&mut state, Msg::View(app::Msg::AddUntrackedFile));
  • replacement in inflorescence/src/test.rs at line 381
    [22.456][22.456:510]()
    let _task = update(&mut state, Msg::RmAddedFile);
    [22.456]
    [22.510]
    let _task = update(&mut state, Msg::View(app::Msg::RmAddedFile));
  • replacement in inflorescence/src/test.rs at line 431
    [23.1343][23.1343:1390]()
    assert!(state.cursor.selection.is_none());
    [23.1343]
    [23.1390]
    assert!(state.cursor.view.selection.is_none());
  • replacement in inflorescence/src/test.rs at line 441
    [23.1547][23.1547:1594]()
    assert!(state.cursor.selection.is_none());
    [23.1547]
    [23.1594]
    assert!(state.cursor.view.selection.is_none());
  • replacement in inflorescence/src/test.rs at line 455
    [23.2013][23.2013:2082]()
    state.cursor.selection = Some(cursor::Selection::UntrackedFile {
    [23.2013]
    [23.2082]
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 468
    [23.2306][23.2306:2353]()
    assert!(state.cursor.selection.is_some());
    [23.2306]
    [23.2353]
    assert!(state.cursor.view.selection.is_some());
  • replacement in inflorescence/src/test.rs at line 470
    [23.2374][23.2374:2424]()
    state.cursor.selection.as_ref().unwrap(),
    [23.2374]
    [31.7517]
    state.cursor.view.selection.as_ref().unwrap(),
  • replacement in inflorescence/src/test.rs at line 490
    [23.3093][23.3093:3162]()
    state.cursor.selection = Some(cursor::Selection::UntrackedFile {
    [23.3093]
    [23.3162]
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 503
    [23.3389][23.3389:3436]()
    assert!(state.cursor.selection.is_none());
    [23.3389]
    [23.3436]
    assert!(state.cursor.view.selection.is_none());
  • replacement in inflorescence/src/test.rs at line 521
    [23.4018][23.4018:4085]()
    state.cursor.selection = Some(cursor::Selection::ChangedFile {
    [23.4018]
    [23.4085]
    state.cursor.view.selection = Some(cursor::Selection::ChangedFile {
  • replacement in inflorescence/src/test.rs at line 534
    [23.4308][23.4308:4355]()
    assert!(state.cursor.selection.is_some());
    [23.4308]
    [23.4355]
    assert!(state.cursor.view.selection.is_some());
  • replacement in inflorescence/src/test.rs at line 536
    [23.4376][23.4376:4426]()
    state.cursor.selection.as_ref().unwrap(),
    [23.4376]
    [31.7861]
    state.cursor.view.selection.as_ref().unwrap(),
  • replacement in inflorescence/src/test.rs at line 558
    [23.5144][23.5144:5211]()
    state.cursor.selection = Some(cursor::Selection::ChangedFile {
    [23.5144]
    [23.5211]
    state.cursor.view.selection = Some(cursor::Selection::ChangedFile {
  • replacement in inflorescence/src/test.rs at line 571
    [23.5434][23.5434:5481]()
    assert!(state.cursor.selection.is_some());
    [23.5434]
    [23.5481]
    assert!(state.cursor.view.selection.is_some());
  • replacement in inflorescence/src/test.rs at line 573
    [23.5502][23.5502:5552]()
    state.cursor.selection.as_ref().unwrap(),
    [23.5502]
    [31.8184]
    state.cursor.view.selection.as_ref().unwrap(),
  • replacement in inflorescence/src/test.rs at line 584
    [23.5907][23.5907:5974]()
    state.cursor.selection = Some(cursor::Selection::ChangedFile {
    [23.5907]
    [23.5974]
    state.cursor.view.selection = Some(cursor::Selection::ChangedFile {
  • replacement in inflorescence/src/test.rs at line 597
    [23.6200][23.6200:6247]()
    assert!(state.cursor.selection.is_none());
    [23.6200]
    [23.6247]
    assert!(state.cursor.view.selection.is_none());
  • replacement in inflorescence/src/test.rs at line 626
    [23.7196][23.7196:7261]()
    state.cursor.selection = Some(cursor::Selection::LogChange {
    [23.7196]
    [23.7261]
    state.cursor.view.selection = Some(cursor::Selection::LogChange {
  • replacement in inflorescence/src/test.rs at line 640
    [23.7546][23.7546:7593]()
    assert!(state.cursor.selection.is_some());
    [23.7546]
    [23.7593]
    assert!(state.cursor.view.selection.is_some());
  • replacement in inflorescence/src/test.rs at line 642
    [23.7614][23.7614:7664]()
    state.cursor.selection.as_ref().unwrap(),
    [23.7614]
    [29.2280]
    state.cursor.view.selection.as_ref().unwrap(),
  • replacement in inflorescence/src/test.rs at line 653
    [23.8012][23.8012:8081]()
    state.cursor.selection = Some(cursor::Selection::UntrackedFile {
    [23.8012]
    [23.8081]
    state.cursor.view.selection = Some(cursor::Selection::UntrackedFile {
  • replacement in inflorescence/src/test.rs at line 666
    [23.8304][23.8304:8351]()
    assert!(state.cursor.selection.is_none());
    [23.8304]
    [23.8351]
    assert!(state.cursor.view.selection.is_none());
  • replacement in inflorescence/src/test.rs at line 690
    [24.700][24.700:747]()
    assert!(state.cursor.selection.is_none());
    [24.700]
    [24.747]
    assert!(state.cursor.view.selection.is_none());
  • replacement in inflorescence/src/test.rs at line 694
    [24.889][24.889:936]()
    assert!(state.cursor.selection.is_none());
    [24.889]
    [24.936]
    assert!(state.cursor.view.selection.is_none());
  • replacement in inflorescence/src/test.rs at line 699
    [24.1053][24.1053:1118]()
    state.cursor.selection = Some(cursor::Selection::LogChange {
    [24.1053]
    [24.1118]
    state.cursor.view.selection = Some(cursor::Selection::LogChange {
  • replacement in inflorescence/src/test.rs at line 708
    [24.1386][24.1386:1433]()
    assert!(state.cursor.selection.is_some());
    [24.1386]
    [24.1568]
    assert!(state.cursor.view.selection.is_some());
  • replacement in inflorescence/src/test.rs at line 713
    [24.1692][24.1692:1757]()
    state.cursor.selection = Some(cursor::Selection::LogChange {
    [24.1692]
    [24.1757]
    state.cursor.view.selection = Some(cursor::Selection::LogChange {
  • replacement in inflorescence/src/test.rs at line 722
    [30.2892][24.2025:2072](),[34.8102][24.2025:2072](),[31.8653][24.2025:2072](),[24.2025][24.2025:2072]()
    assert!(state.cursor.selection.is_some());
    [34.8102]
    [24.2210]
    assert!(state.cursor.view.selection.is_some());
  • edit in inflorescence/src/main.rs at line 135
    [9.42][3.4615:4637](),[8.682][3.4615:4637](),[7.2918][3.4615:4637](),[2.735][3.4615:4637](),[3.4637][4.632:649](),[4.649][17.125:142]()
    AddUntrackedFile,
    RmAddedFile,
    StartRecord,
  • edit in inflorescence/src/main.rs at line 166
    [4.2051][17.183:342]()
    Msg::AddUntrackedFile => add_untracked_file(state),
    Msg::RmAddedFile => rm_added_file(state),
    Msg::StartRecord => start_record(state),
  • replacement in inflorescence/src/main.rs at line 284
    [17.470][17.470:582]()
    app::Msg::DeferRecord => defer_record(state),
    app::Msg::AbandonRecord => abandon_record(state),
    [17.470]
    [34.9593]
    app::Msg::PostponeRecord => defer_record(state),
    app::Msg::DiscardRecord => abandon_record(state),
  • edit in inflorescence/src/main.rs at line 294
    [34.9883]
    [17.850]
    app::Msg::AddUntrackedFile => add_untracked_file(state),
    app::Msg::RmAddedFile => rm_added_file(state),
    app::Msg::StartRecord => start_record(state),
  • replacement in inflorescence/src/main.rs at line 868
    [2.2903][10.27379:27435]()
    "a" => Some(Msg::AddUntrackedFile),
    [2.2903]
    [32.932]
    "a" => Some(Msg::View(app::Msg::AddUntrackedFile)),
  • replacement in inflorescence/src/main.rs at line 881
    [32.1535][17.13721:13772](),[10.27805][17.13721:13772](),[17.13772][10.27851:27902](),[10.27851][10.27851:27902]()
    "r" => Some(Msg::StartRecord),
    "x" => Some(Msg::RmAddedFile),
    [32.1535]
    [2.3009]
    "r" => Some(Msg::View(app::Msg::StartRecord)),
    "x" => Some(Msg::View(app::Msg::RmAddedFile)),
  • edit in inflorescence/src/main.rs at line 902
    [5.1479][6.2103:2159](),[6.2159][10.28198:28263](),[10.28263][6.2212:2234](),[6.2212][6.2212:2234]()
    "a" if mods == Modifiers::CTRL => {
    Some(Msg::View(app::Msg::AbandonRecord))
    }
  • replacement in inflorescence/src/main.rs at line 903
    [6.2290][10.28264:28327]()
    Some(Msg::View(app::Msg::DeferRecord))
    [6.2290]
    [10.28327]
    Some(Msg::View(app::Msg::DiscardRecord))
  • edit in inflorescence/src/main.rs at line 905
    [10.28349]
    [10.28349]
    "p" if mods == Modifiers::CTRL => {
    Some(Msg::View(app::Msg::PostponeRecord))
    }
  • replacement in inflorescence/src/main.rs at line 1107
    [30.6244][35.632:697]()
    let selection = match state.cursor.view.selection.as_ref() {
    [30.6244]
    [31.17624]
    let selection = match cursor.view.selection.as_ref() {
  • edit in inflorescence/src/main.rs at line 1162
    [34.16582]
    [34.16582]
    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();
  • edit in inflorescence/src/main.rs at line 1177
    [34.16698]
    [34.16698]
    is_added_from_untracked,
  • edit in inflorescence/src/main.rs at line 1232
    [34.18515][35.698:728]()
    cursor: &cursor.view,
  • replacement in iced_nav_scrollable/src/lib.rs at line 14
    [36.749][36.749:788]()
    //! [`Msg::RefreshOffset`] manually.
    [36.749]
    [36.788]
    //! [`Msg::RefreshOffsets`] manually.