Skip to content

Commit

Permalink
feat: register most Commands
Browse files Browse the repository at this point in the history
  • Loading branch information
e-matteson committed Apr 20, 2024
1 parent 26ef753 commit 083deda
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 7 deletions.
30 changes: 25 additions & 5 deletions scripts/init.rhai
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,31 @@ s::load_language("data/json_lang.ron");

s::open_doc("data/pokemon.json");

let keymap = new_keymap();
keymap.bind_key("h", "Say Hello", || print("hello world!"));
keymap.bind_key("q", "Quit", || s::abort());
keymap.bind_key("o", "Open", || {
let tree_keymap = new_keymap();
tree_keymap.bind_key("h", "Say Hello", || print("hello world!"));
tree_keymap.bind_key("q", "Quit", || s::abort());
tree_keymap.bind_key("o", "Open", || {
open_file_menu(s::current_dir());
});
tree_keymap.bind_key("left", "Prev", || s::tree_nav_prev());
tree_keymap.bind_key("right", "Next", || s::tree_nav_next());
tree_keymap.bind_key("^", "First", || s::tree_nav_first());
tree_keymap.bind_key("$", "Last", || s::tree_nav_last());
tree_keymap.bind_key("h", "Inorder prev", || s::tree_nav_inorder_prev());
tree_keymap.bind_key("l", "Inorder next", || s::tree_nav_inorder_next());
tree_keymap.bind_key("down", "Last child", || s::tree_nav_last_child());
tree_keymap.bind_key("up", "Parent", || s::tree_nav_parent());
tree_keymap.bind_key("enter", "Enter text", || s::tree_nav_enter_text());
tree_keymap.bind_key("m", "Save bookmark", || s::save_bookmark('a'));
tree_keymap.bind_key("'", "Go to bookmark", || s::goto_bookmark('a'));

let text_keymap = new_keymap();
text_keymap.bind_key("esc", "Exit text", || s::text_nav_exit());
text_keymap.bind_key("left", "Left", || s::text_nav_left());
text_keymap.bind_key("right", "Right", || s::text_nav_right());
text_keymap.bind_key("down", "Insert D", || s::text_ed_insert('D'));
text_keymap.bind_key("bksp", "Backspace", || s::text_ed_backspace());
text_keymap.bind_key("del", "Delete", || s::text_ed_delete());

let file_selection_keymap = new_keymap();
file_selection_keymap.bind_key_for_regular_candidates("enter", "Open file", |path| s::open_doc(path));
Expand All @@ -42,6 +61,7 @@ file_selection_keymap.bind_key("bksp", "Backspace", || s::menu_selection_backspa

let layer = new_layer("default");
layer.add_menu_keymap("file_selection", file_selection_keymap);
layer.add_mode_keymap("Tree", keymap);
layer.add_mode_keymap("Tree", tree_keymap);
layer.add_mode_keymap("Text", text_keymap);
s::register_layer(layer);
s::add_global_layer("default");
66 changes: 64 additions & 2 deletions src/runtime.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use crate::engine::{Command, DocDisplayLabel, DocName, Engine, Settings, TextEdCommand};
use crate::engine::{
BookmarkCommand, Command, DocDisplayLabel, DocName, Engine, Settings, TextEdCommand,
TextNavCommand, TreeEdCommand, TreeNavCommand,
};
use crate::frontends::{Event, Frontend, Key};
use crate::keymap::{KeyLookupResult, KeyProg, Keymap, Layer, LayerManager, MenuSelectionCmd};
use crate::style::Style;
Expand Down Expand Up @@ -279,6 +282,10 @@ impl<F: Frontend<Style = Style> + 'static> Runtime<F> {
* Editing *
***********/

pub fn execute(&mut self, cmd: Command) -> Result<(), SynlessError> {
self.engine.execute(cmd)
}

/***********
* Private *
***********/
Expand All @@ -303,7 +310,7 @@ impl<F: Frontend<Style = Style> + 'static> Runtime<F> {
Ok(None)
}
Some(KeyLookupResult::InsertChar(ch)) => {
self.engine.execute(TextEdCommand::Insert(ch).into())?;
self.execute(TextEdCommand::Insert(ch).into())?;
self.display()?;
Ok(None)
}
Expand Down Expand Up @@ -410,6 +417,26 @@ macro_rules! register {
.in_internal_namespace()
.set_into_module($module, closure);
};
($module:expr, $runtime:ident, $command:ident :: $variant:ident as $name:ident) => {
let rt = $runtime.clone();
let closure = move || {
rt.borrow_mut().execute($command::$variant.into())
.map_err(|err| Box::<rhai::EvalAltResult>::from(err))
};
rhai::FuncRegistration::new(stringify!($name))
.in_internal_namespace()
.set_into_module($module, closure);
};
($module:expr, $runtime:ident, $command:ident :: $variant:ident ($( $param:ident : $type:ty ),*) as $name:ident) => {
let rt = $runtime.clone();
let closure = move | $( $param : $type ),* | {
rt.borrow_mut().execute($command::$variant( $( $param ),* ).into())
.map_err(|err| Box::<rhai::EvalAltResult>::from(err))
};
rhai::FuncRegistration::new(stringify!($name))
.in_internal_namespace()
.set_into_module($module, closure);
};
}

impl<F: Frontend<Style = Style> + 'static> Runtime<F> {
Expand Down Expand Up @@ -445,6 +472,41 @@ impl<F: Frontend<Style = Style> + 'static> Runtime<F> {
// Languages
register!(module, rt.load_language(path: &str)?);

// Editing
register!(module, rt, TreeNavCommand::Prev as tree_nav_prev);
register!(module, rt, TreeNavCommand::First as tree_nav_first);
register!(module, rt, TreeNavCommand::Next as tree_nav_next);
register!(module, rt, TreeNavCommand::Last as tree_nav_last);
register!(
module,
rt,
TreeNavCommand::InorderNext as tree_nav_inorder_next
);
register!(
module,
rt,
TreeNavCommand::InorderPrev as tree_nav_inorder_prev
);
register!(module, rt, TreeNavCommand::LastChild as tree_nav_last_child);
register!(module, rt, TreeNavCommand::Parent as tree_nav_parent);
register!(module, rt, TreeNavCommand::EnterText as tree_nav_enter_text);

register!(module, rt, TreeEdCommand::Backspace as tree_ed_backspace);
register!(module, rt, TreeEdCommand::Delete as tree_ed_delete);

register!(module, rt, TextNavCommand::Left as text_nav_left);
register!(module, rt, TextNavCommand::Right as text_nav_right);
register!(module, rt, TextNavCommand::Beginning as text_nav_beginning);
register!(module, rt, TextNavCommand::End as text_nav_end);
register!(module, rt, TextNavCommand::ExitText as text_nav_exit);

register!(module, rt, TextEdCommand::Backspace as text_ed_backspace);
register!(module, rt, TextEdCommand::Delete as text_ed_delete);
register!(module, rt, TextEdCommand::Insert(ch: char) as text_ed_insert);

register!(module, rt, BookmarkCommand::Save(ch: char) as save_bookmark);
register!(module, rt, BookmarkCommand::Goto(ch: char) as goto_bookmark);

// Logging
rhai::FuncRegistration::new("log_trace")
.in_internal_namespace()
Expand Down

0 comments on commit 083deda

Please sign in to comment.