diff --git a/src/command/cmd.rs b/src/command/cmd.rs index ecccf94..6a2e96d 100644 --- a/src/command/cmd.rs +++ b/src/command/cmd.rs @@ -13,6 +13,7 @@ use crate::view::{Axis, AxisEntry, GridLayout}; pub struct CmdContext<'a> { pub model: &'a Model, pub layout: &'a GridLayout, + pub registry: &'a CmdRegistry, pub mode: &'a AppMode, pub selected: (usize, usize), pub row_offset: usize, @@ -2849,12 +2850,13 @@ mod tests { GridLayout::new(model, model.active_view()) } - fn make_ctx<'a>(model: &'a Model, layout: &'a GridLayout) -> CmdContext<'a> { + fn make_ctx<'a>(model: &'a Model, layout: &'a GridLayout, registry: &'a CmdRegistry) -> CmdContext<'a> { let view = model.active_view(); let (sr, sc) = view.selected; CmdContext { model, layout, + registry, mode: &AppMode::Normal, selected: view.selected, row_offset: view.row_offset, @@ -2902,7 +2904,7 @@ mod tests { fn move_selection_down_produces_set_selected() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = Move { kind: MoveKind::Relative(1, 0), cursor: CursorState::from_ctx(&ctx), @@ -2917,7 +2919,7 @@ mod tests { fn move_selection_clamps_to_bounds() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); // Try to move way past the end let cmd = Move { kind: MoveKind::Relative(100, 100), @@ -2934,7 +2936,7 @@ mod tests { let mut bufs = HashMap::new(); bufs.insert("command".to_string(), "q".to_string()); let layout = make_layout(&m); - let mut ctx = make_ctx(&m, &layout); + let reg = default_registry(); let mut ctx = make_ctx(&m, &layout, ®); ctx.dirty = true; ctx.buffers = &bufs; let cmd = ExecuteCommand; @@ -2949,7 +2951,7 @@ mod tests { let mut bufs = HashMap::new(); bufs.insert("command".to_string(), "q".to_string()); let layout = make_layout(&m); - let mut ctx = make_ctx(&m, &layout); + let reg = default_registry(); let mut ctx = make_ctx(&m, &layout, ®); ctx.buffers = &bufs; let cmd = ExecuteCommand; let effects = cmd.execute(&ctx); @@ -2969,7 +2971,7 @@ mod tests { ]); m.set_cell(key, CellValue::Number(42.0)); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = ClearCellCommand { key: ctx.cell_key().clone().unwrap(), }; @@ -2986,7 +2988,7 @@ mod tests { ]); m.set_cell(key, CellValue::Number(99.0)); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = YankCell { key: ctx.cell_key().clone().unwrap(), }; @@ -2998,7 +3000,7 @@ mod tests { fn toggle_panel_open_and_focus() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = TogglePanelAndFocus { panel: effect::Panel::Formula, open: true, @@ -3017,7 +3019,7 @@ mod tests { fn toggle_panel_close_and_unfocus() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = TogglePanelAndFocus { panel: effect::Panel::Formula, open: false, @@ -3031,7 +3033,7 @@ mod tests { fn enter_advance_moves_down() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = EnterAdvance { cursor: CursorState::from_ctx(&ctx), }; @@ -3048,7 +3050,7 @@ mod tests { fn search_navigate_with_empty_query_returns_nothing() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = SearchNavigate(true); let effects = cmd.execute(&ctx); assert!(effects.is_empty()); @@ -3058,7 +3060,7 @@ mod tests { fn enter_edit_mode_produces_editing_mode() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = EnterEditMode { initial_value: String::new(), }; @@ -3072,7 +3074,7 @@ mod tests { fn enter_tile_select_with_categories() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = EnterTileSelect; let effects = cmd.execute(&ctx); assert_eq!(effects.len(), 2); // SetTileCatIdx + ChangeMode @@ -3089,7 +3091,7 @@ mod tests { // select always has something to operate on. let m = Model::new("Empty"); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = EnterTileSelect; let effects = cmd.execute(&ctx); assert_eq!(effects.len(), 2); // SetTileCatIdx + ChangeMode @@ -3099,7 +3101,7 @@ mod tests { fn toggle_group_under_cursor_returns_empty_without_groups() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = ToggleGroupAtCursor { is_row: true }; let effects = cmd.execute(&ctx); // No groups defined, so nothing to toggle @@ -3110,7 +3112,7 @@ mod tests { fn search_or_category_add_without_query_opens_category_add() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = SearchOrCategoryAdd; let effects = cmd.execute(&ctx); assert_eq!(effects.len(), 2); // SetPanelOpen + ChangeMode @@ -3125,7 +3127,7 @@ mod tests { fn cycle_panel_focus_with_no_panels_open() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = CyclePanelFocus { formula_open: false, category_open: false, @@ -3139,7 +3141,7 @@ mod tests { fn cycle_panel_focus_with_formula_panel_open() { let m = two_cat_model(); let layout = make_layout(&m); - let mut ctx = make_ctx(&m, &layout); + let reg = default_registry(); let mut ctx = make_ctx(&m, &layout, ®); ctx.formula_panel_open = true; let cmd = CyclePanelFocus { formula_open: true, @@ -3167,7 +3169,7 @@ mod tests { fn law_move_to_start_idempotent() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = Move { kind: MoveKind::ToStart(true), cursor: CursorState::from_ctx(&ctx), @@ -3193,7 +3195,7 @@ mod tests { fn law_toggle_group_involution() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = ToggleGroupAtCursor { is_row: true }; let first = effects_debug(&cmd.execute(&ctx)); let second = effects_debug(&cmd.execute(&ctx)); @@ -3209,7 +3211,7 @@ mod tests { fn law_sequence_associativity() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let mk_a = || { Move { @@ -3259,7 +3261,7 @@ mod tests { fn law_move_to_end_reaches_last_col() { let m = two_cat_model(); let layout = make_layout(&m); - let ctx = make_ctx(&m, &layout); + let reg = default_registry(); let ctx = make_ctx(&m, &layout, ®); let cmd = Move { kind: MoveKind::ToEnd(false), cursor: CursorState::from_ctx(&ctx),