use allowed actions binding for key subs

tzemanovic
Feb 5, 2026, 7:32 PM
MORKDJUERANZOBUWRC2F5766BEYYWXANAF3YAQ6YQ55WFQA7X64QC

Dependencies

  • [2] WT3GA27P add cursor with selection
  • [3] S2NVIFXR allow to enter record msg
  • [4] XSZZB47U refactor stuff into lib
  • [5] 5MUEECMJ smooth scrolling nav
  • [6] A6Z4O6RC actions menu
  • [7] 3XRG4BB6 rewritten nav-scrollable!
  • [8] WAOGSCOJ very nice refactor, wip adding channels logs
  • [9] WH57EHNM update tests
  • [10] EJPSD5XO shared allowed actions conditions between update and view
  • [11] YK3MOJJL chonky refactor, wip other channels logs & diffs
  • [12] 7WCB5YQJ refactor msgs and modules
  • [13] AZ5D2LQU allow to set record description
  • [14] QUMAQ7IX fix prev focus label
  • [15] PKLUHYE4 allow to copy change hash
  • [16] CULHFNIV add error report view
  • [17] U3EAZKHR allow to copy error report
  • [18] LFEMJYYD start of to_record selection
  • [19] 5O4FWCFP add tests to_record selection and improve it
  • [20] YGZ3VCW4 add push
  • [21] ODCT4QJN add pull
  • [22] UTDTZCTX pull+push status, add info reports
  • [23] G5WLRXOD add screenshots for test
  • [24] OLT666N4 fix screenshot test to include status, fix failed test report
  • [25] TEDT26JQ add push and pull sub-menus
  • [26] BJ3CYLUT allow to reset changed file
  • [27] EH7FHUXX update iced
  • [28] YRGDFHAB project dir picker
  • [29] LPSUBGUB add projects picker
  • [30] FDDPOH5R add arrow controls
  • [31] YBJRDOTC make all repo actions async
  • [32] BJXUYQ2Y show untracked file contents in read-only text editor
  • [33] AMPZ2BXK show changed files diffs (only Edit atm)
  • [34] 23SFYK4Q big view refactor into a new crate
  • [35] ACDXXAX2 refactor main's updates into smaller fns
  • [36] ESMM3FEL test selection reindexing
  • [37] 2SLTGWP6 add change files diffs to-record selection
  • [38] UPWS6J3B filter to-record changes from selection
  • [39] KM5PSZ4A watch repo once loaded
  • [40] D7A7MSIH allow to defer or abandon record, add buttons
  • [41] A5YBC77V record!
  • [42] NRCUG4R2 load changed files src when selected
  • [43] I2AG42PA new cols layout
  • [44] 3TLPJ57B alt scroll via context and couple fixes
  • [45] FU6P5QLG indicate when a file is a dir with appended '/'
  • [46] S4WH75Y3 allow to select channels if there are any other. Conditional switch
  • [*] 6YZAVBWU Initial commit

Change contents

  • replacement in inflorescence_view/src/view.rs at line 1410
    [10.2832][10.2832:2990](),[9.435][6.8298:8319](),[10.2990][6.8298:8319](),[8.29418][6.8298:8319](),[6.8298][6.8298:8319](),[6.8319][10.2991:3043](),[10.3043][6.8499:8513](),[6.8499][6.8499:8513](),[6.8513][10.3044:3055]()
    .map(|action::Binding { key, label, msg }| {
    if let Some(msg) = msg {
    action_button(key, label, Msg::Action(msg.clone()))
    } else {
    el(action_button_inner(key, label))
    }
    })
    [10.2832]
    [10.3055]
    .map(
    |action::Binding {
    keys_str,
    keys: _,
    label,
    msg,
    }| {
    if let Some(msg) = msg {
    action_button(keys_str, label, Msg::Action(msg.clone()))
    } else {
    el(action_button_inner(keys_str, label))
    }
    },
    )
  • replacement in inflorescence_view/screenshots/loaded_selected_untracked-wgpu.png at line 3
    [23.1036001][28.1438110:1438257]()
    [23.1036001]
    [28.1438257]
  • replacement in inflorescence_view/screenshots/loaded_selected_untracked-wgpu.png at line 1493
    [28.1887136][28.1887136:1899774](),[28.1899774][23.1555204:1555231](),[23.1555204][23.1555204:1555231](),[23.1555231][28.1899775:1918853]()
    [28.1887136]
    [28.1918853]
  • replacement in inflorescence_view/screenshots/loaded_selected_untracked-wgpu.png at line 1572
    [28.1918964][28.1918964:1921317]()
    [28.1918964]
    [28.1921317]
  • replacement in inflorescence_view/screenshots/loaded_selected_untracked-wgpu.png at line 1574
    [28.1921706][28.1921706:1947957]()
    [28.1921706]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 3
    [23.1583539][28.1947959:1948101]()
    [23.1583539]
    [28.1948101]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1055
    [28.2448204][28.2448204:2483894](),[28.2483894][23.1789645:1789666](),[23.1789645][23.1789645:1789666](),[23.1789666][28.2483895:2483912]()
    [28.2448204]
    [24.333412]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1113
    [24.333426][28.2483913:2483925]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1114
    [24.333433]
    [24.333443]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1117
    [24.333457][28.2483926:2483938]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1118
    [24.333464]
    [24.333476]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1121
    [24.333490][28.2483939:2483951]()
    [24.333490]
    [24.333490]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1125
    [24.333523][28.2483952:2483964]()
    [24.333523]
    [24.333535]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1128
    [24.333549][28.2483965:2483977]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1129
    [24.333556]
    [24.333568]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1132
    [24.333582][28.2483978:2483990]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1133
    [24.333589]
    [24.333601]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1136
    [24.333615][28.2483991:2484006]()
    [24.333615]
    [24.333615]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1140
    [24.333648][28.2484007:2484016]()
    [24.333648]
    [24.333663]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1144
    [24.333684][28.2484017:2484029]()
    [24.333684]
    [24.333701]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1147
    [24.333715]
    [24.333715]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1149
    [24.333722][28.2484030:2484042]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1151
    [24.333748]
    [24.333760]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1153
    [24.333767][28.2484043:2484055]()
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1155
    [24.333781][28.2484056:2484068]()
    [24.333781]
    [24.333793]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1159
    [24.333814][28.2484069:2484305]()
    [24.333814]
    [24.333826]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1162
    [24.333840]
    [24.333840]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1167
    [24.333847][28.2484306:2484316]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1169
    [24.334097]
    [24.334097]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1171
    [24.334104][28.2484317:2484329]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1172
    [24.334121]
    [24.334121]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1175
    [24.334135][28.2484330:2484342]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1176
    [24.334154]
    [24.334154]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1179
    [24.334180][28.2484343:2484355]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1180
    [24.334187]
    [24.334187]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1182
    [24.334194][28.2484356:2484368]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1184
    [24.334220]
    [24.334220]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1186
    [24.334227][28.2484369:2484381]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1187
    [24.334246]
    [24.334246]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1190
    [24.334260][28.2484382:2484394]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1191
    [24.334279]
    [24.334279]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1194
    [24.334305][28.2484395:2484407]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1195
    [24.334312]
    [24.334312]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1197
    [24.334319][28.2484408:2484420]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1199
    [24.334345]
    [24.334345]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1201
    [24.334352][28.2484421:2484433]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1202
    [24.334371]
    [24.334371]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1205
    [24.334385][28.2484434:2484446]()
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1206
    [24.334404]
    [24.334404]
  • edit in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1209
    [24.334430][28.2484447:2484484]()
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1210
    [24.334437][28.2484485:2484514]()
    [24.334437]
    [24.334437]
  • replacement in inflorescence_view/screenshots/loaded_point_at_untracked-wgpu.png at line 1213
    [24.334444][28.2484515:2503568]()
    [24.334444]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 3
    [23.2124925][28.2503570:2503712]()
    [23.2124925]
    [28.2503712]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 999
    [28.3004187][28.3004187:3039436](),[28.3039436][24.392234:392248](),[24.392234][24.392234:392248]()
    [28.3004187]
    [24.392248]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1070
    [24.392255][28.3039437:3039454]()
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1072
    [24.392279][28.3039455:3039467]()
    [24.392279]
    [24.392279]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1076
    [24.392312][28.3039468:3039480]()
    [24.392312]
    [24.392312]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1080
    [24.392345][28.3039481:3039493]()
    [24.392345]
    [24.392345]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1084
    [24.392378][28.3039494:3039506]()
    [24.392378]
    [24.392390]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1087
    [24.392404][28.3039507:3039519]()
    [24.392404]
    [24.392404]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1091
    [24.392437][28.3039520:3039532]()
    [24.392437]
    [24.392437]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1095
    [24.392470][28.3039533:3039548]()
    [24.392470]
    [24.392470]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1099
    [24.392499][28.3039549:3039558]()
    [24.392499]
    [24.392499]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1102
    [24.392530]
    [24.392530]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1104
    [24.392537][28.3039559:3039571]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1106
    [24.392563]
    [24.392563]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1108
    [24.392570][28.3039572:3039584]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1110
    [24.392596]
    [24.392596]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1112
    [24.392603][28.3039585:3039597]()
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1114
    [24.392629][28.3039598:3039610]()
    [24.392629]
    [24.392629]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1117
    [24.392655]
    [24.392655]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1119
    [24.392662][28.3039611:3039848]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1121
    [24.392912]
    [24.392912]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1126
    [24.392919][28.3039849:3039859]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1128
    [24.392943]
    [24.392943]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1130
    [24.392950][28.3039860:3039872]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1132
    [24.392976]
    [24.392976]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1134
    [24.392983][28.3039873:3039885]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1135
    [24.392990]
    [24.393002]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1138
    [24.393016][28.3039886:3039898]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1139
    [24.393035]
    [24.393035]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1141
    [24.393042][28.3039899:3039911]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1143
    [24.393068]
    [24.393068]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1145
    [24.393075][28.3039912:3039924]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1147
    [24.393101]
    [24.393101]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1149
    [24.393108][28.3039925:3039937]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1150
    [24.393115]
    [24.393127]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1153
    [24.393141][28.3039938:3039950]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1154
    [24.393160]
    [24.393160]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1156
    [24.393167][28.3039951:3039963]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1158
    [24.393193]
    [24.393193]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1160
    [24.393200][28.3039964:3039976]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1162
    [24.393226]
    [24.393226]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1164
    [24.393233][28.3039977:3039989]()
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1165
    [24.393240]
    [24.393252]
  • edit in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1168
    [24.393266][28.3039990:3040027]()
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1169
    [28.3040034][28.3040034:3040063]()
    [28.3040034]
    [28.3040063]
  • replacement in inflorescence_view/screenshots/loaded_non_empty_repo-wgpu.png at line 1172
    [28.3040070][28.3040070:3059130]()
    [28.3040070]
  • replacement in inflorescence_model/src/to_record.rs at line 16
    [18.2648][18.2648:2687]()
    #[derive(Debug, Clone, PartialEq, Eq)]
    [18.2616]
    [18.2687]
    #[derive(Debug, Clone, PartialEq, Eq, Hash)]
  • replacement in inflorescence_model/src/selection.rs at line 6
    [4.3202][10.3292:3327]()
    #[derive(Debug, Clone, PartialEq)]
    [4.3202]
    [4.3226]
    #[derive(Debug, Clone, PartialEq, Hash)]
  • replacement in inflorescence_model/src/selection.rs at line 24
    [5.200][5.200:245]()
    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
    [5.200]
    [5.245]
    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
  • replacement in inflorescence_model/src/model.rs at line 64
    [28.3592383][25.531884:531929](),[12.4338][25.531884:531929]()
    #[derive(Clone, Copy, Debug, PartialEq, Eq)]
    [28.3592383]
    [25.531929]
    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
  • edit in inflorescence_model/src/action.rs at line 3
    [18.12963]
    [28.3592421]
    use iced::keyboard::key::Named;
  • replacement in inflorescence_model/src/action.rs at line 7
    [10.3777][10.3777:3794]()
    #[derive(Debug)]
    [10.3777]
    [10.3794]
    use iced::keyboard::{Key, Modifiers as Mods};
    #[derive(Debug, Clone, Hash)]
  • replacement in inflorescence_model/src/action.rs at line 11
    [10.3815][10.3815:3842]()
    pub key: &'static str,
    [10.3815]
    [10.3842]
    // NOTE: This could be derived from keys, but preferrably at compile time
    pub keys_str: &'static str,
    pub keys: ModKeys,
  • edit in inflorescence_model/src/action.rs at line 16
    [12.7188]
    [10.3897]
    }
    #[derive(Debug, Clone, Hash)]
    pub enum ModKeys {
    One(ModKey),
    Two(ModKey, ModKey),
    }
    #[derive(Debug, Clone, Hash)]
    pub struct ModKey {
    pub key: Key,
    pub mods: Mods,
  • replacement in inflorescence_model/src/action.rs at line 32
    [12.7322][10.3997:4021](),[11.18960][10.3997:4021](),[10.3997][10.3997:4021]()
    #[derive(Debug, Clone)]
    [12.7322]
    [12.7323]
    #[derive(Debug, Clone, Hash)]
  • replacement in inflorescence_model/src/action.rs at line 182
    [16.7170][22.5618:5642]()
    key: "S-r",
    [16.7170]
    [16.7194]
    keys_str: "S-r",
    keys: ModKeys::One(ModKey {
    key: Key::Character("r".into()),
    mods: Mods::SHIFT,
    }),
  • replacement in inflorescence_model/src/action.rs at line 193
    [17.314][17.314:344]()
    key: "S-C-c",
    [17.314]
    [22.5695]
    keys_str: "S-C-c",
    keys: ModKeys::One(ModKey {
    key: Key::Character("c".into()),
    mods: Mods::SHIFT.union(Mods::CTRL),
    }),
  • edit in inflorescence_model/src/action.rs at line 207
    [16.7283]
    [28.3593010]
    impl ModKeys {
    pub fn iter(&self) -> ModKeysIter<'_> {
    ModKeysIter { keys: self, ix: 0 }
    }
    }
    pub struct ModKeysIter<'a> {
    keys: &'a ModKeys,
    ix: usize,
    }
    impl<'a> Iterator for ModKeysIter<'a> {
    type Item = &'a ModKey;
    fn next(&mut self) -> Option<Self::Item> {
    let Self { keys, ix } = self;
    match keys {
    ModKeys::One(mod_key) => {
    if *ix == 0 {
    *ix += 1;
    Some(mod_key)
    } else {
    None
    }
    }
    ModKeys::Two(mod_key_0, mod_key_1) => {
    if *ix == 0 {
    *ix += 1;
    Some(mod_key_0)
    } else if *ix == 1 {
    *ix += 1;
    Some(mod_key_1)
    } else {
    None
    }
    }
    }
    }
    }
  • replacement in inflorescence_model/src/action.rs at line 269
    [10.6044][10.6044:6067]()
    key: "←| h",
    [10.6044]
    [10.6067]
    keys_str: "←| h",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowLeft),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("h".into()),
    mods: Mods::NONE,
    },
    ),
  • replacement in inflorescence_model/src/action.rs at line 286
    [10.6567][10.6567:6590]()
    key: "→| l",
    [10.6567]
    [10.6590]
    keys_str: "→| l",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowRight),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("l".into()),
    mods: Mods::NONE,
    },
    ),
  • replacement in inflorescence_model/src/action.rs at line 303
    [10.6759][10.6759:6786]()
    key: "S-(↓| j)",
    [10.6759]
    [10.6786]
    keys_str: "S-(↓| j)",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowDown),
    mods: Mods::SHIFT,
    },
    ModKey {
    key: Key::Character("j".into()),
    mods: Mods::SHIFT,
    },
    ),
  • replacement in inflorescence_model/src/action.rs at line 320
    [10.6962][10.6962:6989]()
    key: "S-(↑| k)",
    [10.6962]
    [10.6989]
    keys_str: "S-(↑| k)",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowUp),
    mods: Mods::SHIFT,
    },
    ModKey {
    key: Key::Character("k".into()),
    mods: Mods::SHIFT,
    },
    ),
  • replacement in inflorescence_model/src/action.rs at line 338
    [10.7167][10.7167:7185]()
    key: "a",
    [10.7167]
    [10.7185]
    keys_str: "a",
    keys: ModKeys::One(ModKey {
    key: Key::Character("a".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 347
    [26.2097][26.2097:2115]()
    key: "x",
    [26.2097]
    [26.2115]
    keys_str: "x",
    keys: ModKeys::One(ModKey {
    key: Key::Character("x".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 356
    [26.2235][26.2235:2253]()
    key: "x",
    [26.2235]
    [26.2253]
    keys_str: "x",
    keys: ModKeys::One(ModKey {
    key: Key::Character("x".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 365
    [10.7300][10.7300:7318]()
    key: "x",
    [10.7300]
    [10.7318]
    keys_str: "x",
    keys: ModKeys::One(ModKey {
    key: Key::Character("x".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 375
    [10.7430][10.7430:7448]()
    key: "r",
    [10.7430]
    [10.7448]
    keys_str: "r",
    keys: ModKeys::One(ModKey {
    key: Key::Character("r".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 384
    [10.7552][10.7552:7572]()
    key: "C-s",
    [10.7552]
    [10.7572]
    keys_str: "C-s",
    keys: ModKeys::One(ModKey {
    key: Key::Character("s".into()),
    mods: Mods::CTRL,
    }),
  • replacement in inflorescence_model/src/action.rs at line 393
    [10.7684][13.3077:3097]()
    key: "C-p",
    [10.7684]
    [10.7704]
    keys_str: "C-p",
    keys: ModKeys::One(ModKey {
    key: Key::Character("p".into()),
    mods: Mods::CTRL,
    }),
  • replacement in inflorescence_model/src/action.rs at line 402
    [10.7823][10.7823:7843]()
    key: "C-d",
    [10.7823]
    [10.7843]
    keys_str: "C-d",
    keys: ModKeys::One(ModKey {
    key: Key::Character("d".into()),
    mods: Mods::CTRL,
    }),
  • replacement in inflorescence_model/src/action.rs at line 411
    [13.3132][13.3132:3152]()
    key: "TAB",
    [13.3132]
    [13.3152]
    keys_str: "Tab",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Tab),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 420
    [13.3265][14.40:62]()
    key: "S-TAB",
    [13.3265]
    [13.3285]
    keys_str: "S-Tab",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Tab),
    mods: Mods::SHIFT,
    }),
  • replacement in inflorescence_model/src/action.rs at line 430
    [10.7961][10.7961:7979]()
    key: "c",
    [10.7961]
    [10.7979]
    keys_str: "c",
    keys: ModKeys::One(ModKey {
    key: Key::Character("c".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 439
    [10.8094][10.8094:8112]()
    key: "f",
    [10.8094]
    [10.8112]
    keys_str: "f",
    keys: ModKeys::One(ModKey {
    key: Key::Character("f".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 449
    [10.8224][10.8224:8244]()
    key: "C-r",
    [10.8224]
    [10.8244]
    keys_str: "C-r",
    keys: ModKeys::One(ModKey {
    key: Key::Character("r".into()),
    mods: Mods::CTRL,
    }),
  • replacement in inflorescence_model/src/action.rs at line 459
    [10.8502][10.8502:8524]()
    key: "Enter",
    [10.8502]
    [10.8524]
    keys_str: "Enter",
    keys: ModKeys::One(ModKey {
    key: Key::Character("r".into()),
    mods: Mods::CTRL,
    }),
  • replacement in inflorescence_model/src/action.rs at line 468
    [10.8718][10.8718:8738]()
    key: "Esc",
    [10.8718]
    [10.8738]
    keys_str: "Esc",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Escape),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 477
    [11.20214][11.20214:20234]()
    key: "Esc",
    [11.20214]
    [11.20234]
    keys_str: "Esc",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Escape),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 486
    [10.8850][10.8850:8868]()
    key: "e",
    [10.8850]
    [10.8868]
    keys_str: "e",
    keys: ModKeys::One(ModKey {
    key: Key::Character("e".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 495
    [15.343][15.343:363]()
    key: "C-c",
    [15.343]
    [15.363]
    keys_str: "C-c",
    keys: ModKeys::One(ModKey {
    key: Key::Character("c".into()),
    mods: Mods::CTRL,
    }),
  • replacement in inflorescence_model/src/action.rs at line 511
    [18.13932][18.13932:13954]()
    key: "T",
    [18.13932]
    [18.13954]
    keys_str: "S-t",
    keys: ModKeys::One(ModKey {
    key: Key::Character("t".into()),
    mods: Mods::SHIFT,
    }),
  • replacement in inflorescence_model/src/action.rs at line 527
    [18.14394][18.14394:14416]()
    key: "t",
    [18.14394]
    [18.14416]
    keys_str: "t",
    keys: ModKeys::One(ModKey {
    key: Key::Character("t".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 542
    [19.16299][19.16299:16321]()
    key: "t",
    [19.16299]
    [19.16321]
    keys_str: "t",
    keys: ModKeys::One(ModKey {
    key: Key::Character("t".into()),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 552
    [22.5839][22.5839:5859]()
    key: "S-p",
    [22.5839]
    [20.4927]
    keys_str: "S-p",
    keys: ModKeys::One(ModKey {
    key: Key::Character("p".into()),
    mods: Mods::SHIFT,
    }),
  • replacement in inflorescence_model/src/action.rs at line 562
    [22.5955][22.5955:5975]()
    key: "S-f",
    [22.5955]
    [21.9763]
    keys_str: "S-f",
    keys: ModKeys::One(ModKey {
    key: Key::Character("f".into()),
    mods: Mods::SHIFT,
    }),
  • replacement in inflorescence_model/src/action.rs at line 1185
    [28.3593518][28.3593518:3593541]()
    key: "↓| j",
    [28.3593518]
    [28.3593541]
    keys_str: "↓| j",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowDown),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("j".into()),
    mods: Mods::NONE,
    },
    ),
  • replacement in inflorescence_model/src/action.rs at line 1205
    [28.3593718][28.3593718:3593741]()
    key: "↑| k",
    [28.3593718]
    [28.3593741]
    keys_str: "↑| k",
    keys: ModKeys::Two(
    ModKey {
    key: Key::Named(Named::ArrowUp),
    mods: Mods::NONE,
    },
    ModKey {
    key: Key::Character("k".into()),
    mods: Mods::NONE,
    },
    ),
  • replacement in inflorescence_model/src/action.rs at line 1225
    [25.533301][25.533301:533323]()
    key: "Enter",
    [25.533301]
    [25.533323]
    keys_str: "Enter",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Enter),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence_model/src/action.rs at line 1237
    [25.533427][25.533427:533447]()
    key: "Esc",
    [25.533427]
    [25.533447]
    keys_str: "Esc",
    keys: ModKeys::One(ModKey {
    key: Key::Named(Named::Escape),
    mods: Mods::NONE,
    }),
  • replacement in inflorescence/src/main.rs at line 2041
    [28.3625858][28.3625858:3625902](),[28.3625902][29.26623:26676](),[29.26676][28.3625962:3626217](),[28.3625962][28.3625962:3626217](),[28.3626217][29.26677:26750](),[29.26750][28.3626217:3626432](),[28.3626217][28.3626217:3626432](),[28.3626432][27.225:278](),[7.21800][27.225:278]()
    let key_subs = match &state.model.sub {
    model::SubState::PickingRepoDir(_model) => {
    Subscription::none()
    // dir_picker::subs(&picking_repo.picker)
    // .map(view::Msg::PickingRepo)
    // .map(Msg::View)
    }
    model::SubState::ManagingRepo(model) => subs_managing_repo(model),
    model::SubState::PickingProject(_model) => Subscription::none(),
    };
    let window_subs = window::events().map(|(_id, event)| Msg::Window(event));
    Subscription::batch([key_subs, window_subs])
    }
    fn subs_managing_repo(_model: &model::ManagingRepo) -> Subscription<Msg> {
    use iced::keyboard::{self, key, Key, Modifiers};
    [28.3625858]
    [2.2762]
    use iced::keyboard::{self, key, Key};
  • replacement in inflorescence/src/main.rs at line 2043
    [2.2763][28.3626433:3626765]()
    keyboard::listen().filter_map(|event| {
    let action = |msg| Some(Msg::View(view::Msg::Action(msg)));
    let selection =
    |selection| action(action::FilteredMsg::Selection(selection));
    let unfiltered = |selection| {
    Some(Msg::View(view::Msg::UnfilteredSelection(selection)))
    };
    [2.2763]
    [5.2302]
    let allowed_actions = state.model.allowed_actions.clone();
    let key_subs = keyboard::listen().with(allowed_actions).filter_map(
    |(allowed_actions, event)| {
    let unfiltered = |selection| {
    Some(Msg::View(view::Msg::UnfilteredSelection(selection)))
    };
  • replacement in inflorescence/src/main.rs at line 2050
    [5.2303][28.3626766:3626884]()
    match event {
    keyboard::Event::KeyPressed {
    key,
    modifiers: mods,
    [5.2303]
    [28.3626884]
    match event {
    keyboard::Event::KeyPressed { key, modifiers, .. } => {
    allowed_actions
    .iter()
    .find_map(|binding| {
    binding.msg.as_ref().and_then(|msg| {
    if binding.keys.iter().any(|binding| {
    binding.key == key
    && binding.mods == modifiers
    }) {
    Some(msg.clone())
    } else {
    None
    }
    })
    })
    .map(view::Msg::Action)
    .map(Msg::View)
    }
    keyboard::Event::KeyReleased {
    key,
    modifiers: mods,
  • replacement in inflorescence/src/main.rs at line 2073
    [28.3626907][28.3626907:3627460](),[28.3627460][27.2867:2897](),[27.2867][27.2867:2897](),[27.2897][28.3627461:3630111](),[28.3630111][27.3029:3059](),[27.3029][27.3029:3059](),[27.3059][28.3630112:3630446](),[28.3630446][27.3216:3246](),[27.3216][27.3216:3246](),[27.3246][28.3630447:3630587](),[28.3630587][27.3399:3429](),[27.3399][27.3399:3429](),[27.3429][28.3630588:3630725](),[28.3630725][27.3586:3616](),[27.3586][27.3586:3616](),[27.3616][28.3630726:3630866](),[28.3630866][27.3775:3805](),[27.3775][27.3775:3805](),[27.3805][28.3630867:3631003](),[28.3631003][27.3937:3967](),[27.3937][27.3937:3967](),[27.3967][28.3631004:3632702](),[28.3632702][27.4038:4064](),[27.4038][27.4038:4064](),[27.4064][28.3632703:3634128]()
    } => {
    if mods.is_empty() {
    match key {
    Key::Character(c) => match c.as_str() {
    // _____________________________________________
    // Directions
    "j" => selection(selection::Msg::PressDir(
    selection::Dir::Down,
    )),
    "k" => {
    selection(selection::Msg::PressDir(selection::Dir::Up))
    }
    "h" => selection(selection::Msg::PressDir(
    selection::Dir::Left,
    )),
    "l" => selection(selection::Msg::PressDir(
    selection::Dir::Right,
    )),
    // _____________________________________________
    // Other keys (sort alphabetically)
    "a" => action(action::FilteredMsg::AddUntrackedFile),
    "c" => action(action::FilteredMsg::SelectChannel),
    "e" => action(action::FilteredMsg::ShowEntireLog),
    "f" => action(action::FilteredMsg::ForkChannel),
    "t" => action(
    action::FilteredMsg::ToRecordToggleSelectedFileOrChange,
    ),
    "r" => action(action::FilteredMsg::StartRecord),
    "x" => action(action::FilteredMsg::RmChange),
    _ => None,
    },
    Key::Named(key::Named::Enter) => {
    action(action::FilteredMsg::Confirm)
    }
    Key::Named(key::Named::Escape) => {
    action(action::FilteredMsg::Cancel)
    }
    Key::Named(key::Named::ArrowDown) => {
    selection(selection::Msg::PressDir(selection::Dir::Down))
    }
    Key::Named(key::Named::ArrowUp) => {
    selection(selection::Msg::PressDir(selection::Dir::Up))
    }
    Key::Named(key::Named::ArrowLeft) => {
    selection(selection::Msg::PressDir(selection::Dir::Left))
    }
    Key::Named(key::Named::ArrowRight) => {
    selection(selection::Msg::PressDir(selection::Dir::Right))
    }
    Key::Named(key::Named::Tab) => {
    action(action::FilteredMsg::FocusNext)
    }
    Key::Named(_) | Key::Unidentified => None,
    }
    } else {
    match key {
    Key::Character(c) => match c.as_str() {
    "c" if mods == Modifiers::CTRL => {
    action(action::FilteredMsg::ClipboardCopy)
    }
    "c" if mods == Modifiers::SHIFT | Modifiers::CTRL => {
    action(action::FilteredMsg::ClipboardCopyReports)
    }
    "d" if mods == Modifiers::CTRL => {
    action(action::FilteredMsg::DiscardRecord)
    }
    "p" if mods == Modifiers::CTRL => {
    action(action::FilteredMsg::PostponeRecord)
    }
    "r" if mods == Modifiers::CTRL => {
    action(action::FilteredMsg::RefreshRepo)
    }
    "r" if mods == Modifiers::SHIFT => {
    action(action::FilteredMsg::ToggleReports)
    }
    "s" if mods == Modifiers::CTRL => {
    action(action::FilteredMsg::SaveRecord)
    }
    "f" if mods == Modifiers::SHIFT => action(
    action::FilteredMsg::EnterSubMenu(model::SubMenu::Pull),
    ),
    "j" if mods == Modifiers::SHIFT => selection(
    selection::Msg::AltPressDir(selection::Dir::Down),
    ),
    "k" if mods == Modifiers::SHIFT => selection(
    selection::Msg::AltPressDir(selection::Dir::Up),
    ),
    "h" if mods == Modifiers::SHIFT => selection(
    selection::Msg::AltPressDir(selection::Dir::Left),
    ),
    "l" if mods == Modifiers::SHIFT => selection(
    selection::Msg::AltPressDir(selection::Dir::Right),
    ),
    "p" if mods == Modifiers::SHIFT => action(
    action::FilteredMsg::EnterSubMenu(model::SubMenu::Push),
    ),
    "t" if mods == Modifiers::SHIFT => {
    action(action::FilteredMsg::ToRecord(
    to_record::Msg::ToggleOverall,
    ))
    }
    _ => None,
    },
    Key::Named(key::Named::ArrowDown)
    if mods == Modifiers::SHIFT =>
    {
    selection(selection::Msg::AltPressDir(selection::Dir::Down))
    }
    Key::Named(key::Named::ArrowUp) if mods == Modifiers::SHIFT => {
    selection(selection::Msg::AltPressDir(selection::Dir::Up))
    }
    Key::Named(key::Named::ArrowLeft)
    if mods == Modifiers::SHIFT =>
    {
    selection(selection::Msg::AltPressDir(selection::Dir::Left))
    }
    Key::Named(key::Named::ArrowRight)
    if mods == Modifiers::SHIFT =>
    {
    selection(selection::Msg::AltPressDir(
    selection::Dir::Right,
    ))
    }
    Key::Named(key::Named::Tab) if mods == Modifiers::SHIFT => {
    action(action::FilteredMsg::FocusPrev)
    }
    Key::Named(_) | Key::Unidentified => None,
    }
    }
    }
    keyboard::Event::KeyReleased {
    key,
    modifiers: mods,
    ..
    } => {
    if mods.is_empty() {
    match key {
    Key::Character(c) => match c.as_str() {
    "j" =>
    unfiltered(
    [28.3626907]
    [28.3634128]
    } => {
    if mods.is_empty() {
    match key {
    Key::Character(c) => match c.as_str() {
    "j" => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2082
    [28.3634338][28.3634338:3634413]()
    "k" =>
    unfiltered(
    [28.3634338]
    [28.3634413]
    "k" => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2087
    [27.5714][28.3634587:3634662]()
    "h" =>
    unfiltered(
    [27.5714]
    [28.3634662]
    "h" => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2092
    [27.5914][28.3634838:3634913]()
    "l" =>
    unfiltered(
    [27.5914]
    [28.3634913]
    "l" => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2097
    [27.6112][28.3635090:3635259]()
    _ => None,
    },
    Key::Named(key::Named::ArrowDown) => {
    unfiltered(
    [27.6112]
    [28.3635259]
    _ => None,
    },
    Key::Named(key::Named::ArrowDown) => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2103
    [27.6312][28.3635388:3635545]()
    )
    }
    Key::Named(key::Named::ArrowUp) => {
    unfiltered(
    [27.6312]
    [28.3635545]
    ),
    Key::Named(key::Named::ArrowUp) => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2108
    [27.6513][28.3635672:3635831]()
    )
    }
    Key::Named(key::Named::ArrowLeft) => {
    unfiltered(
    [27.6513]
    [28.3635831]
    ),
    Key::Named(key::Named::ArrowLeft) => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2113
    [27.6716][28.3635960:3636120]()
    )
    }
    Key::Named(key::Named::ArrowRight) => {
    unfiltered(
    [27.6716]
    [28.3636120]
    ),
    Key::Named(key::Named::ArrowRight) => unfiltered(
  • replacement in inflorescence/src/main.rs at line 2118
    [28.3636226][28.3636226:3636256]()
    )
    [28.3636226]
    [27.8459]
    ),
    Key::Named(_) | Key::Unidentified => None,
  • replacement in inflorescence/src/main.rs at line 2121
    [27.8485][28.3636257:3636324]()
    Key::Named(_) | Key::Unidentified => None,
    [27.8485]
    [28.3636324]
    } else {
    None
  • edit in inflorescence/src/main.rs at line 2124
    [28.3636346][28.3636346:3636396]()
    } else {
    None
  • edit in inflorescence/src/main.rs at line 2125
    [28.3636414]
    [3.1663]
    keyboard::Event::ModifiersChanged(_) => None,
  • replacement in inflorescence/src/main.rs at line 2127
    [3.1677][28.3636415:3636490]()
    keyboard::Event::ModifiersChanged(_) => None,
    }
    })
    [3.1677]
    [2.4172]
    },
    );
    let window_subs = window::events().map(|(_id, event)| Msg::Window(event));
    Subscription::batch([key_subs, window_subs])