fix and refactor action bindings

tzemanovic
Feb 5, 2026, 8:06 PM
IMJQ4PML6OQ2MG5OK3SVUJH4RGXO4DD3O6IFD2A4UBZIMF6QI6YQC

Dependencies

  • [2] EJPSD5XO shared allowed actions conditions between update and view
  • [3] YK3MOJJL chonky refactor, wip other channels logs & diffs
  • [4] 7WCB5YQJ refactor msgs and modules
  • [5] AZ5D2LQU allow to set record description
  • [6] PKLUHYE4 allow to copy change hash
  • [7] LFEMJYYD start of to_record selection
  • [8] 5O4FWCFP add tests to_record selection and improve it
  • [9] FU6P5QLG indicate when a file is a dir with appended '/'
  • [10] YGZ3VCW4 add push
  • [11] ODCT4QJN add pull
  • [12] UTDTZCTX pull+push status, add info reports
  • [13] TEDT26JQ add push and pull sub-menus
  • [14] BJ3CYLUT allow to reset changed file
  • [15] K6VFUIKI simpler scroll of untracked files
  • [16] MORKDJUE use allowed actions binding for key subs
  • [17] CULHFNIV add error report view
  • [18] YRGDFHAB project dir picker

Change contents

  • edit in inflorescence_model/src/action.rs at line 268
    [2.6016][2.6016:6044](),[2.6044][16.172699:173006](),[16.173006][2.6067:6086](),[2.6067][2.6067:6086](),[2.6086][4.7519:7586](),[4.7586][2.6145:6179](),[2.6145][2.6145:6179](),[4.7754][4.7754:7767](),[4.7767][2.6531:6567](),[2.6531][2.6531:6567](),[2.6567][16.173007:173315](),[16.173315][2.6590:6609](),[2.6590][2.6590:6609](),[2.6609][4.7768:7835](),[4.7835][2.6668:6723](),[2.6668][2.6668:6723]()
    let left = || Binding {
    keys_str: "←| h",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowLeft),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("h".into()),
    mods: Mods::NONE,
    },
    ),
    label: "",
    msg: Some(FilteredMsg::Selection(selection::Msg::PressDir(
    selection::Dir::Left,
    ))),
    };
    let right = || Binding {
    keys_str: "→| l",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowRight),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("l".into()),
    mods: Mods::NONE,
    },
    ),
    label: "",
    msg: Some(FilteredMsg::Selection(selection::Msg::PressDir(
    selection::Dir::Right,
    ))),
    };
  • replacement in inflorescence_model/src/action.rs at line 427
    [16.175923][16.175923:175998]()
    key: Key::Character("r".into()),
    mods: Mods::CTRL,
    [16.175923]
    [16.175998]
    key: Key::Named(Named::Enter),
    mods: Mods::NONE,
  • replacement in inflorescence_model/src/action.rs at line 517
    [6.445][12.5797:5839](),[12.5839][16.177107:177256](),[12.5859][10.4927:4950](),[16.177256][10.4927:4950](),[10.4927][10.4927:4950](),[10.4950][13.532816:532911]()
    let push = |can_push: bool| Binding {
    keys_str: "S-p",
    keys: ModKeys::One(ModKey {
    key: Key::Character("p".into()),
    mods: Mods::SHIFT,
    }),
    label: "push",
    msg: can_push
    .then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Push)),
    [6.445]
    [10.4988]
    let push_sub_menu = |can_push: bool| {
    move || -> Binding {
    Binding {
    keys_str: "S-p",
    keys: ModKeys::One(ModKey {
    key: Key::Character("p".into()),
    mods: Mods::SHIFT,
    }),
    label: "push",
    msg: can_push
    .then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Push)),
    }
    }
  • replacement in inflorescence_model/src/action.rs at line 531
    [10.4995][12.5913:5955](),[12.5955][16.177257:177406](),[12.5975][11.9763:9786](),[16.177406][11.9763:9786](),[11.9763][11.9763:9786](),[11.9786][13.532912:533007]()
    let pull = |can_pull: bool| Binding {
    keys_str: "S-f",
    keys: ModKeys::One(ModKey {
    key: Key::Character("f".into()),
    mods: Mods::SHIFT,
    }),
    label: "pull",
    msg: can_pull
    .then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Pull)),
    [10.4995]
    [11.9824]
    let pull_sub_menu = |can_pull: bool| {
    move || -> Binding {
    Binding {
    keys_str: "S-f",
    keys: ModKeys::One(ModKey {
    key: Key::Character("f".into()),
    mods: Mods::SHIFT,
    }),
    label: "pull",
    msg: can_pull
    .then_some(FilteredMsg::EnterSubMenu(model::SubMenu::Pull)),
    }
    }
  • replacement in inflorescence_model/src/action.rs at line 557
    [2.9209][2.9209:9265]()
    ma.push(down());
    ma.push(up());
    [2.9209]
    [9.9732]
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 562
    [9.9867][9.9867:9917]()
    ma.push(add_untracked());
    [9.9867]
    [9.9917]
    push(add_untracked, ma);
  • replacement in inflorescence_model/src/action.rs at line 567
    [9.10190][9.10190:10232](),[9.10232][14.2368:2423]()
    ma.push(right());
    ma.push(reset_changed_file());
    [9.10190]
    [9.10294]
    push(right, ma);
    push(reset_changed_file, ma);
  • replacement in inflorescence_model/src/action.rs at line 571
    [9.10377][9.10377:10427]()
    ma.push(rm_added_file());
    [9.10377]
    [9.10427]
    push(rm_added_file, ma);
  • replacement in inflorescence_model/src/action.rs at line 576
    [9.10687][9.10687:10750]()
    ma.push(clipboard_copy_change_hash());
    [9.10687]
    [9.10812]
    push(clipboard_copy_change_hash, ma);
  • replacement in inflorescence_model/src/action.rs at line 581
    [12.6108][2.9947:9987](),[9.10849][2.9947:9987](),[2.9947][2.9947:9987]()
    ma.push(show_entire_log());
    [12.6108]
    [2.9987]
    push(show_entire_log, ma);
  • replacement in inflorescence_model/src/action.rs at line 583
    [2.10048][5.3369:3443]()
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [2.10048]
    [7.14582]
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 587
    [7.14738][12.6109:6193]()
    ma.push(push(can_push_pull));
    ma.push(pull(can_push_pull));
    [7.14738]
    [2.10048]
    push(push_sub_menu(can_push_pull), ma);
    push(pull_sub_menu(can_push_pull), ma);
  • replacement in inflorescence_model/src/action.rs at line 594
    [2.10163][2.10163:10248]()
    ma.push(left());
    ma.push(down());
    ma.push(up());
    [2.10163]
    [2.10248]
    push(left, ma);
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 599
    [2.10349][6.839:890](),[6.890][2.10349:10389](),[2.10349][2.10349:10389]()
    ma.push(clipboard_copy_change_hash());
    ma.push(show_entire_log());
    [2.10349]
    [2.10389]
    push(clipboard_copy_change_hash, ma);
    push(show_entire_log, ma);
  • replacement in inflorescence_model/src/action.rs at line 602
    [2.10450][5.3444:3518]()
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [2.10450]
    [2.10450]
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 612
    [7.14850][2.10512:10597](),[2.10512][2.10512:10597]()
    ma.push(left());
    ma.push(down());
    ma.push(up());
    [7.14850]
    [15.86]
    push(left, ma);
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 624
    [14.2664][6.891:942](),[2.10669][6.891:942]()
    ma.push(clipboard_copy_change_hash());
    [14.2664]
    [2.10669]
    push(clipboard_copy_change_hash, ma);
  • replacement in inflorescence_model/src/action.rs at line 626
    [2.10720][2.10720:10760]()
    ma.push(show_entire_log());
    [2.10720]
    [2.10760]
    push(show_entire_log, ma);
  • replacement in inflorescence_model/src/action.rs at line 628
    [2.10821][5.3519:3593]()
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [2.10821]
    [8.16459]
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 644
    [2.10864][5.3594:3664](),[5.3664][2.10864:10979](),[2.10864][2.10864:10979]()
    ma.push(focus_next());
    ma.push(focus_prev());
    ma.push(save_record());
    ma.push(postpone_record());
    ma.push(discard_record());
    [2.10864]
    [2.10979]
    push(focus_next, ma);
    push(focus_prev, ma);
    push(save_record, ma);
    push(postpone_record, ma);
    push(discard_record, ma);
  • replacement in inflorescence_model/src/action.rs at line 652
    [2.11062][3.20315:20392]()
    SelectingChannelState::NoOtherChannels => ma.push(cancel()),
    [2.11062]
    [3.20392]
    SelectingChannelState::NoOtherChannels => push(cancel, ma),
  • replacement in inflorescence_model/src/action.rs at line 654
    [3.20452][2.11199:11310](),[2.11199][2.11199:11310]()
    ma.push(down());
    ma.push(up());
    ma.push(cancel());
    [3.20452]
    [2.11310]
    push(down, ma);
    push(up, ma);
    push(cancel, ma);
  • replacement in inflorescence_model/src/action.rs at line 662
    [3.20605][2.11405:11477](),[2.11405][2.11405:11477]()
    ma.push(down());
    ma.push(up());
    [3.20605]
    [3.20606]
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 665
    [3.20664][2.11477:11516](),[2.11477][2.11477:11516]()
    ma.push(cancel());
    [3.20664]
    [2.11516]
    push(cancel, ma);
  • replacement in inflorescence_model/src/action.rs at line 678
    [2.11942][3.20665:20705](),[3.20705][5.3665:3739]()
    ma.push(show_entire_log());
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [2.11942]
    [3.20705]
    push(show_entire_log, ma);
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 683
    [3.20775][3.20775:20860]()
    ma.push(left());
    ma.push(down());
    ma.push(up());
    [3.20775]
    [3.20860]
    push(left, ma);
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 687
    [3.20910][6.943:994](),[6.994][3.20910:20994](),[3.20910][3.20910:20994](),[3.20994][5.3740:3814]()
    ma.push(clipboard_copy_change_hash());
    ma.push(exit_other_channels());
    ma.push(show_entire_log());
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [3.20910]
    [3.20994]
    push(clipboard_copy_change_hash, ma);
    push(exit_other_channels, ma);
    push(show_entire_log, ma);
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 694
    [3.21070][3.21070:21155]()
    ma.push(left());
    ma.push(down());
    ma.push(up());
    [3.21070]
    [3.21155]
    push(left, ma);
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 698
    [3.21205][6.995:1046](),[6.1046][3.21205:21249](),[3.21205][3.21205:21249](),[3.21249][2.11942:11982](),[2.11942][2.11942:11982](),[2.11982][5.3815:3889]()
    ma.push(clipboard_copy_change_hash());
    ma.push(exit_other_channels());
    ma.push(show_entire_log());
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [3.21205]
    [3.21250]
    push(clipboard_copy_change_hash, ma);
    push(exit_other_channels, ma);
    push(show_entire_log, ma);
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 705
    [3.21309][3.21309:21466](),[3.21466][6.1047:1098](),[6.1098][3.21466:21510](),[3.21466][3.21466:21510](),[3.21510][5.3890:3964]()
    ma.push(left());
    ma.push(down());
    ma.push(up());
    ma.push(down_no_skip());
    ma.push(up_no_skip());
    ma.push(clipboard_copy_change_hash());
    ma.push(exit_other_channels());
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [3.21309]
    [2.11982]
    push(left, ma);
    push(down, ma);
    push(up, ma);
    push(down_no_skip, ma);
    push(up_no_skip, ma);
    push(clipboard_copy_change_hash, ma);
    push(exit_other_channels, ma);
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 718
    [2.12196][2.12196:12227]()
    ma.push(cancel());
    [2.12196]
    [2.12227]
    push(cancel, ma);
  • replacement in inflorescence_model/src/action.rs at line 721
    [2.12291][2.12291:12347]()
    ma.push(down());
    ma.push(up());
    [2.12291]
    [2.12347]
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 724
    [2.12397][6.1099:1150](),[6.1150][2.12397:12437](),[2.12397][2.12397:12437]()
    ma.push(clipboard_copy_change_hash());
    ma.push(exit_entire_log());
    [2.12397]
    [2.12437]
    push(clipboard_copy_change_hash, ma);
    push(exit_entire_log, ma);
  • replacement in inflorescence_model/src/action.rs at line 727
    [2.12498][5.3965:4039]()
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [2.12498]
    [2.12498]
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 731
    [2.12568][2.12568:12653]()
    ma.push(left());
    ma.push(down());
    ma.push(up());
    [2.12568]
    [2.12653]
    push(left, ma);
    push(down, ma);
    push(up, ma);
  • replacement in inflorescence_model/src/action.rs at line 735
    [2.12703][6.1151:1202](),[6.1202][2.12703:12743](),[2.12703][2.12703:12743]()
    ma.push(clipboard_copy_change_hash());
    ma.push(exit_entire_log());
    [2.12703]
    [2.12743]
    push(clipboard_copy_change_hash, ma);
    push(exit_entire_log, ma);
  • replacement in inflorescence_model/src/action.rs at line 738
    [2.12804][5.4040:4114]()
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [2.12804]
    [2.12804]
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • replacement in inflorescence_model/src/action.rs at line 742
    [2.12857][2.12857:13014](),[2.13014][6.1203:1254](),[6.1254][2.13014:13054](),[2.13014][2.13014:13054](),[2.13054][5.4115:4189]()
    ma.push(left());
    ma.push(down());
    ma.push(up());
    ma.push(down_no_skip());
    ma.push(up_no_skip());
    ma.push(clipboard_copy_change_hash());
    ma.push(exit_entire_log());
    ma.push(fork_channel());
    ma.push(refresh_repo());
    [2.12857]
    [2.13054]
    push(left, ma);
    push(down, ma);
    push(up, ma);
    push(down_no_skip, ma);
    push(up_no_skip, ma);
    push(clipboard_copy_change_hash, ma);
    push(exit_entire_log, ma);
    push(fork_channel, ma);
    push(refresh_repo, ma);
  • edit in inflorescence_model/src/action.rs at line 757
    [2.13165]
    [3.21511]
    fn push<F>(to_add: F, actions: &mut Vec<Binding>)
    where
    F: Fn() -> Binding,
    {
    actions.push(to_add())
    }
  • edit in inflorescence_model/src/action.rs at line 1163
    [13.533241]
    [13.533241]
    fn left() -> Binding {
    Binding {
    keys_str: "←| h",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowLeft),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("h".into()),
    mods: Mods::NONE,
    },
    ),
    label: "",
    msg: Some(FilteredMsg::Selection(selection::Msg::PressDir(
    selection::Dir::Left,
    ))),
    }
    }
    fn right() -> Binding {
    Binding {
    keys_str: "→| l",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowRight),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("l".into()),
    mods: Mods::NONE,
    },
    ),
    label: "",
    msg: Some(FilteredMsg::Selection(selection::Msg::PressDir(
    selection::Dir::Right,
    ))),
    }
    }