Files
improvise/src/command/cmd/mod.rs
Edward Langley f1229a60e4 Merge branch 'main' into worktree-improvise-ewi-formula-crate
# Conflicts:
#	src/model/types.rs
#	src/view/layout.rs
2026-04-15 21:11:55 -07:00

125 lines
3.9 KiB
Rust

pub mod cell;
pub mod commit;
pub mod core;
pub mod effect_cmds;
pub mod grid;
pub mod mode;
pub mod navigation;
pub mod panel;
pub mod registry;
pub mod search;
pub mod text_buffer;
pub mod tile;
// Re-export items used by external code
pub use self::core::{Cmd, CmdContext, CmdRegistry};
pub use registry::default_registry;
#[cfg(test)]
pub(super) mod test_helpers {
use std::collections::HashMap;
use crossterm::event::KeyCode;
use crate::ui::app::AppMode;
use crate::ui::effect::Effect;
use crate::view::GridLayout;
use crate::workbook::Workbook;
use super::core::CmdContext;
use super::registry::default_registry;
pub type CmdRegistry = super::core::CmdRegistry;
pub static EMPTY_BUFFERS: std::sync::LazyLock<HashMap<String, String>> =
std::sync::LazyLock::new(HashMap::new);
pub static EMPTY_EXPANDED: std::sync::LazyLock<std::collections::HashSet<String>> =
std::sync::LazyLock::new(std::collections::HashSet::new);
pub fn make_layout(workbook: &Workbook) -> GridLayout {
GridLayout::new(&workbook.model, workbook.active_view())
}
pub fn make_ctx<'a>(
workbook: &'a Workbook,
layout: &'a GridLayout,
registry: &'a CmdRegistry,
) -> CmdContext<'a> {
let view = workbook.active_view();
let (sr, sc) = view.selected;
CmdContext {
model: &workbook.model,
workbook,
view,
layout,
registry,
mode: &AppMode::Normal,
selected: view.selected,
row_offset: view.row_offset,
col_offset: view.col_offset,
search_query: "",
yanked: &None,
dirty: false,
search_mode: false,
formula_panel_open: false,
category_panel_open: false,
view_panel_open: false,
formula_cursor: 0,
cat_panel_cursor: 0,
view_panel_cursor: 0,
tile_cat_idx: 0,
buffers: &EMPTY_BUFFERS,
view_back_stack: &[],
view_forward_stack: &[],
has_drill_state: false,
display_value: {
let key = layout.cell_key(sr, sc);
key.as_ref()
.and_then(|k| workbook.model.get_cell(k).cloned())
.map(|v| v.to_string())
.unwrap_or_default()
},
visible_rows: 20,
visible_cols: 8,
expanded_cats: &EMPTY_EXPANDED,
key_code: KeyCode::Null,
}
}
pub fn two_cat_model() -> Workbook {
let mut wb = Workbook::new("Test");
wb.add_category("Type").unwrap();
wb.add_category("Month").unwrap();
wb.model.category_mut("Type").unwrap().add_item("Food");
wb.model.category_mut("Type").unwrap().add_item("Clothing");
wb.model.category_mut("Month").unwrap().add_item("Jan");
wb.model.category_mut("Month").unwrap().add_item("Feb");
wb
}
pub fn three_cat_model_with_page() -> Workbook {
let mut wb = Workbook::new("Test");
wb.add_category("Type").unwrap();
wb.add_category("Month").unwrap();
wb.add_category("Region").unwrap();
wb.model.category_mut("Type").unwrap().add_item("Food");
wb.model.category_mut("Type").unwrap().add_item("Clothing");
wb.model.category_mut("Month").unwrap().add_item("Jan");
wb.model.category_mut("Month").unwrap().add_item("Feb");
wb.model.category_mut("Region").unwrap().add_item("North");
wb.model.category_mut("Region").unwrap().add_item("South");
wb.model.category_mut("Region").unwrap().add_item("East");
wb.active_view_mut()
.set_axis("Region", crate::view::Axis::Page);
wb
}
pub fn effects_debug(effects: &[Box<dyn Effect>]) -> String {
format!("{:?}", effects)
}
pub fn make_registry() -> CmdRegistry {
default_registry()
}
}