chore: format
This commit is contained in:
@ -3,7 +3,7 @@ use crate::ui::app::AppMode;
|
||||
use crate::ui::effect::{self, Effect};
|
||||
|
||||
use super::core::{Cmd, CmdContext};
|
||||
use super::navigation::{viewport_effects, CursorState, EnterAdvance};
|
||||
use super::navigation::{CursorState, EnterAdvance, viewport_effects};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
|
||||
@ -3,8 +3,8 @@ use std::fmt::Debug;
|
||||
|
||||
use crossterm::event::KeyCode;
|
||||
|
||||
use crate::model::cell::{CellKey, CellValue};
|
||||
use crate::model::Model;
|
||||
use crate::model::cell::{CellKey, CellValue};
|
||||
use crate::ui::app::AppMode;
|
||||
use crate::ui::effect::{Effect, Panel};
|
||||
use crate::view::{Axis, GridLayout};
|
||||
|
||||
@ -2,7 +2,7 @@ use crate::model::cell::CellValue;
|
||||
use crate::ui::effect::{self, Effect};
|
||||
use crate::view::Axis;
|
||||
|
||||
use super::core::{require_args, Cmd, CmdContext};
|
||||
use super::core::{Cmd, CmdContext, require_args};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
@ -110,7 +110,6 @@ macro_rules! effect_cmd {
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
effect_cmd!(
|
||||
AddCategoryCmd,
|
||||
"add-category",
|
||||
@ -202,7 +201,10 @@ effect_cmd!(
|
||||
"add-formula",
|
||||
|args: &[String]| {
|
||||
if args.is_empty() || args.len() > 2 {
|
||||
return Err(format!("add-formula requires 1-2 argument(s), got {}", args.len()));
|
||||
return Err(format!(
|
||||
"add-formula requires 1-2 argument(s), got {}",
|
||||
args.len()
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
@ -397,7 +399,10 @@ effect_cmd!(
|
||||
"help",
|
||||
|_args: &[String]| -> Result<(), String> { Ok(()) },
|
||||
|_args: &Vec<String>, _ctx: &CmdContext| -> Vec<Box<dyn Effect>> {
|
||||
vec![effect::help_page_set(0), effect::change_mode(crate::ui::app::AppMode::Help)]
|
||||
vec![
|
||||
effect::help_page_set(0),
|
||||
effect::change_mode(crate::ui::app::AppMode::Help),
|
||||
]
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
pub mod core;
|
||||
pub mod navigation;
|
||||
pub mod mode;
|
||||
pub mod cell;
|
||||
pub mod search;
|
||||
pub mod panel;
|
||||
pub mod grid;
|
||||
pub mod tile;
|
||||
pub mod text_buffer;
|
||||
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};
|
||||
|
||||
@ -3,7 +3,7 @@ use crossterm::event::KeyCode;
|
||||
use crate::ui::app::AppMode;
|
||||
use crate::ui::effect::{self, Effect};
|
||||
|
||||
use super::core::{read_buffer, Cmd, CmdContext};
|
||||
use super::core::{Cmd, CmdContext, read_buffer};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
|
||||
@ -235,9 +235,8 @@ impl Keymap {
|
||||
|
||||
/// Look up the binding for a key, falling through to parent keymaps.
|
||||
pub fn lookup(&self, key: KeyCode, mods: KeyModifiers) -> Option<&Binding> {
|
||||
self.lookup_local(key, mods).or_else(|| {
|
||||
self.parent.as_ref().and_then(|p| p.lookup(key, mods))
|
||||
})
|
||||
self.lookup_local(key, mods)
|
||||
.or_else(|| self.parent.as_ref().and_then(|p| p.lookup(key, mods)))
|
||||
}
|
||||
|
||||
/// Dispatch a key: look up binding, resolve through registry, return effects.
|
||||
@ -729,50 +728,82 @@ impl KeymapSet {
|
||||
|
||||
// ── Editing mode ─────────────────────────────────────────────────
|
||||
let mut ed = Keymap::new();
|
||||
ed.bind_seq(KeyCode::Esc, none, vec![
|
||||
("clear-buffer", vec!["edit".into()]),
|
||||
("enter-mode", vec!["normal".into()]),
|
||||
]);
|
||||
ed.bind_seq(KeyCode::Enter, none, vec![
|
||||
("commit-cell-edit", vec![]),
|
||||
("clear-buffer", vec!["edit".into()]),
|
||||
]);
|
||||
ed.bind_seq(KeyCode::Tab, none, vec![
|
||||
("commit-and-advance-right", vec![]),
|
||||
("clear-buffer", vec!["edit".into()]),
|
||||
]);
|
||||
ed.bind_seq(
|
||||
KeyCode::Esc,
|
||||
none,
|
||||
vec![
|
||||
("clear-buffer", vec!["edit".into()]),
|
||||
("enter-mode", vec!["normal".into()]),
|
||||
],
|
||||
);
|
||||
ed.bind_seq(
|
||||
KeyCode::Enter,
|
||||
none,
|
||||
vec![
|
||||
("commit-cell-edit", vec![]),
|
||||
("clear-buffer", vec!["edit".into()]),
|
||||
],
|
||||
);
|
||||
ed.bind_seq(
|
||||
KeyCode::Tab,
|
||||
none,
|
||||
vec![
|
||||
("commit-and-advance-right", vec![]),
|
||||
("clear-buffer", vec!["edit".into()]),
|
||||
],
|
||||
);
|
||||
ed.bind_args(KeyCode::Backspace, none, "pop-char", vec!["edit".into()]);
|
||||
ed.bind_any_char("append-char", vec!["edit".into()]);
|
||||
set.insert(ModeKey::Editing, Arc::new(ed));
|
||||
|
||||
// ── Formula edit ─────────────────────────────────────────────────
|
||||
let mut fe = Keymap::new();
|
||||
fe.bind_seq(KeyCode::Esc, none, vec![
|
||||
("clear-buffer", vec!["formula".into()]),
|
||||
("enter-mode", vec!["formula-panel".into()]),
|
||||
]);
|
||||
fe.bind_seq(KeyCode::Enter, none, vec![
|
||||
("commit-formula", vec![]),
|
||||
("clear-buffer", vec!["formula".into()]),
|
||||
]);
|
||||
fe.bind_seq(
|
||||
KeyCode::Esc,
|
||||
none,
|
||||
vec![
|
||||
("clear-buffer", vec!["formula".into()]),
|
||||
("enter-mode", vec!["formula-panel".into()]),
|
||||
],
|
||||
);
|
||||
fe.bind_seq(
|
||||
KeyCode::Enter,
|
||||
none,
|
||||
vec![
|
||||
("commit-formula", vec![]),
|
||||
("clear-buffer", vec!["formula".into()]),
|
||||
],
|
||||
);
|
||||
fe.bind_args(KeyCode::Backspace, none, "pop-char", vec!["formula".into()]);
|
||||
fe.bind_any_char("append-char", vec!["formula".into()]);
|
||||
set.insert(ModeKey::FormulaEdit, Arc::new(fe));
|
||||
|
||||
// ── Category add ─────────────────────────────────────────────────
|
||||
let mut ca = Keymap::new();
|
||||
ca.bind_seq(KeyCode::Esc, none, vec![
|
||||
("clear-buffer", vec!["category".into()]),
|
||||
("enter-mode", vec!["category-panel".into()]),
|
||||
]);
|
||||
ca.bind_seq(KeyCode::Enter, none, vec![
|
||||
("commit-category-add", vec![]),
|
||||
("clear-buffer", vec!["category".into()]),
|
||||
]);
|
||||
ca.bind_seq(KeyCode::Tab, none, vec![
|
||||
("commit-category-add", vec![]),
|
||||
("clear-buffer", vec!["category".into()]),
|
||||
]);
|
||||
ca.bind_seq(
|
||||
KeyCode::Esc,
|
||||
none,
|
||||
vec![
|
||||
("clear-buffer", vec!["category".into()]),
|
||||
("enter-mode", vec!["category-panel".into()]),
|
||||
],
|
||||
);
|
||||
ca.bind_seq(
|
||||
KeyCode::Enter,
|
||||
none,
|
||||
vec![
|
||||
("commit-category-add", vec![]),
|
||||
("clear-buffer", vec!["category".into()]),
|
||||
],
|
||||
);
|
||||
ca.bind_seq(
|
||||
KeyCode::Tab,
|
||||
none,
|
||||
vec![
|
||||
("commit-category-add", vec![]),
|
||||
("clear-buffer", vec!["category".into()]),
|
||||
],
|
||||
);
|
||||
ca.bind_args(
|
||||
KeyCode::Backspace,
|
||||
none,
|
||||
@ -784,46 +815,74 @@ impl KeymapSet {
|
||||
|
||||
// ── Item add ─────────────────────────────────────────────────────
|
||||
let mut ia = Keymap::new();
|
||||
ia.bind_seq(KeyCode::Esc, none, vec![
|
||||
("clear-buffer", vec!["item".into()]),
|
||||
("enter-mode", vec!["category-panel".into()]),
|
||||
]);
|
||||
ia.bind_seq(KeyCode::Enter, none, vec![
|
||||
("commit-item-add", vec![]),
|
||||
("clear-buffer", vec!["item".into()]),
|
||||
]);
|
||||
ia.bind_seq(KeyCode::Tab, none, vec![
|
||||
("commit-item-add", vec![]),
|
||||
("clear-buffer", vec!["item".into()]),
|
||||
]);
|
||||
ia.bind_seq(
|
||||
KeyCode::Esc,
|
||||
none,
|
||||
vec![
|
||||
("clear-buffer", vec!["item".into()]),
|
||||
("enter-mode", vec!["category-panel".into()]),
|
||||
],
|
||||
);
|
||||
ia.bind_seq(
|
||||
KeyCode::Enter,
|
||||
none,
|
||||
vec![
|
||||
("commit-item-add", vec![]),
|
||||
("clear-buffer", vec!["item".into()]),
|
||||
],
|
||||
);
|
||||
ia.bind_seq(
|
||||
KeyCode::Tab,
|
||||
none,
|
||||
vec![
|
||||
("commit-item-add", vec![]),
|
||||
("clear-buffer", vec!["item".into()]),
|
||||
],
|
||||
);
|
||||
ia.bind_args(KeyCode::Backspace, none, "pop-char", vec!["item".into()]);
|
||||
ia.bind_any_char("append-char", vec!["item".into()]);
|
||||
set.insert(ModeKey::ItemAdd, Arc::new(ia));
|
||||
|
||||
// ── Export prompt ────────────────────────────────────────────────
|
||||
let mut ep = Keymap::new();
|
||||
ep.bind_seq(KeyCode::Esc, none, vec![
|
||||
("clear-buffer", vec!["export".into()]),
|
||||
("enter-mode", vec!["normal".into()]),
|
||||
]);
|
||||
ep.bind_seq(KeyCode::Enter, none, vec![
|
||||
("commit-export", vec![]),
|
||||
("clear-buffer", vec!["export".into()]),
|
||||
]);
|
||||
ep.bind_seq(
|
||||
KeyCode::Esc,
|
||||
none,
|
||||
vec![
|
||||
("clear-buffer", vec!["export".into()]),
|
||||
("enter-mode", vec!["normal".into()]),
|
||||
],
|
||||
);
|
||||
ep.bind_seq(
|
||||
KeyCode::Enter,
|
||||
none,
|
||||
vec![
|
||||
("commit-export", vec![]),
|
||||
("clear-buffer", vec!["export".into()]),
|
||||
],
|
||||
);
|
||||
ep.bind_args(KeyCode::Backspace, none, "pop-char", vec!["export".into()]);
|
||||
ep.bind_any_char("append-char", vec!["export".into()]);
|
||||
set.insert(ModeKey::ExportPrompt, Arc::new(ep));
|
||||
|
||||
// ── Command mode ─────────────────────────────────────────────────
|
||||
let mut cm = Keymap::new();
|
||||
cm.bind_seq(KeyCode::Esc, none, vec![
|
||||
("clear-buffer", vec!["command".into()]),
|
||||
("enter-mode", vec!["normal".into()]),
|
||||
]);
|
||||
cm.bind_seq(KeyCode::Enter, none, vec![
|
||||
("execute-command", vec![]),
|
||||
("clear-buffer", vec!["command".into()]),
|
||||
]);
|
||||
cm.bind_seq(
|
||||
KeyCode::Esc,
|
||||
none,
|
||||
vec![
|
||||
("clear-buffer", vec!["command".into()]),
|
||||
("enter-mode", vec!["normal".into()]),
|
||||
],
|
||||
);
|
||||
cm.bind_seq(
|
||||
KeyCode::Enter,
|
||||
none,
|
||||
vec![
|
||||
("execute-command", vec![]),
|
||||
("clear-buffer", vec!["command".into()]),
|
||||
],
|
||||
);
|
||||
cm.bind(KeyCode::Backspace, none, "command-mode-backspace");
|
||||
cm.bind_any_char("append-char", vec!["command".into()]);
|
||||
set.insert(ModeKey::CommandMode, Arc::new(cm));
|
||||
@ -1086,9 +1145,11 @@ mod tests {
|
||||
let ks = KeymapSet::default_keymaps();
|
||||
let editing = ks.mode_maps.get(&ModeKey::Editing).unwrap();
|
||||
// Should have AnyChar for text input
|
||||
assert!(editing
|
||||
.lookup(KeyCode::Char('z'), KeyModifiers::NONE)
|
||||
.is_some());
|
||||
assert!(
|
||||
editing
|
||||
.lookup(KeyCode::Char('z'), KeyModifiers::NONE)
|
||||
.is_some()
|
||||
);
|
||||
// Should have Esc to exit
|
||||
assert!(editing.lookup(KeyCode::Esc, KeyModifiers::NONE).is_some());
|
||||
}
|
||||
@ -1097,9 +1158,11 @@ mod tests {
|
||||
fn search_mode_has_any_char_and_esc() {
|
||||
let ks = KeymapSet::default_keymaps();
|
||||
let search = ks.mode_maps.get(&ModeKey::SearchMode).unwrap();
|
||||
assert!(search
|
||||
.lookup(KeyCode::Char('a'), KeyModifiers::NONE)
|
||||
.is_some());
|
||||
assert!(
|
||||
search
|
||||
.lookup(KeyCode::Char('a'), KeyModifiers::NONE)
|
||||
.is_some()
|
||||
);
|
||||
assert!(search.lookup(KeyCode::Esc, KeyModifiers::NONE).is_some());
|
||||
}
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
//! Coordinate pairs use `/`: `Category/Item`
|
||||
//! Quoted strings supported: `"Profit = Revenue - Cost"`
|
||||
|
||||
use super::cmd::{default_registry, Cmd, CmdRegistry};
|
||||
use super::cmd::{Cmd, CmdRegistry, default_registry};
|
||||
|
||||
/// Parse a line into commands using the default registry.
|
||||
pub fn parse_line(line: &str) -> Result<Vec<Box<dyn Cmd>>, String> {
|
||||
|
||||
Reference in New Issue
Block a user