Skip to content

Commit

Permalink
feat: add character-based node selection menu
Browse files Browse the repository at this point in the history
  • Loading branch information
e-matteson committed Apr 23, 2024
1 parent 6267c4d commit 4dc32ae
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 5 deletions.
3 changes: 2 additions & 1 deletion data/json_lang.ron
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ LanguageSpec(
ConstructSpec(
name: "ObjectPair",
arity: Fixed([SortSpec(["Key"]), SortSpec(["value"])]),
key: None,
// TODO: Remove key binding for Json.ObjectPair in favor of automatic insertion
key: Some('p'),
),
ConstructSpec(
name: "Object",
Expand Down
29 changes: 25 additions & 4 deletions scripts/init.rhai
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ fn make_candidate_keymap() {
keymap
}

fn make_node_selection_keymap(language_name) {
fn make_candidate_node_selection_keymap(language_name) {
let keymap = make_candidate_keymap();
for construct in s::language_constructs(s::get_language(language_name)) {
keymap.add_regular_candidate(s::construct_name(construct), construct);
Expand All @@ -18,6 +18,20 @@ fn make_node_selection_keymap(language_name) {
keymap
}

fn make_char_node_selection_keymap(language_name) {
let keymap = new_keymap();
for construct in s::language_constructs(s::get_language(language_name)) {
let key = s::construct_key(construct);
if key != "" {
let construct_copy = construct;
let prog = || construct_copy;
keymap.bind_key(key, s::construct_name(construct), prog);
}
}
keymap.bind_key("esc", "Exit menu", || s::escape());
keymap
}

fn open_file_menu(dir) {
let contents = s::list_files_and_dirs(dir);
let keymap = new_keymap();
Expand Down Expand Up @@ -77,8 +91,14 @@ tree_keymap.bind_key("r", "Redo", || s::redo());
tree_keymap.bind_key("m", "Save bookmark", || s::save_bookmark('a'));
tree_keymap.bind_key("'", "Go to bookmark", || s::goto_bookmark('a'));

tree_keymap.bind_key("i", "Insert", || {
s::open_menu("node_selection");
tree_keymap.bind_key("I", "Insert", || {
s::open_menu("candidate_node_selection");
let construct = s::block();
s::insert_node(construct);
});

tree_keymap.bind_key("i", "Quick insert", || {
s::open_menu("char_node_selection");
let construct = s::block();
s::insert_node(construct);
});
Expand Down Expand Up @@ -106,7 +126,8 @@ layer.add_mode_keymap("Text", text_keymap);

layer.add_menu_keymap("file_selection", file_selection_keymap);
// TODO: use local layers
layer.add_menu_keymap("node_selection", make_node_selection_keymap("json"));
layer.add_menu_keymap("candidate_node_selection", make_candidate_node_selection_keymap("json"));
layer.add_menu_keymap("char_node_selection", make_char_node_selection_keymap("json"));

s::register_layer(layer);
s::add_global_layer("default");
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const MAIN_PATH: &str = "scripts/main.rhai";
fn make_engine() -> rhai::Engine {
let mut engine = rhai::Engine::new();
engine.set_fail_on_invalid_map_property(true);
engine.set_max_expr_depths(64, 32);
engine.on_print(|msg| log!(Info, "{msg}"));
engine.on_debug(|msg, src, pos| {
let src = src.unwrap_or("unknown");
Expand Down
8 changes: 8 additions & 0 deletions src/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,13 @@ impl<F: Frontend<Style = Style> + 'static> Runtime<F> {
construct.name(self.engine.raw_storage()).to_owned()
}

pub fn construct_key(&self, construct: Construct) -> String {
construct
.key(self.engine.raw_storage())
.map(|c| c.to_string())
.unwrap_or_default()
}

/***********
* Editing *
***********/
Expand Down Expand Up @@ -506,6 +513,7 @@ impl<F: Frontend<Style = Style> + 'static> Runtime<F> {
register!(module, rt.get_language(language_name: &str)?);
register!(module, rt.language_constructs(language: Language));
register!(module, rt.construct_name(construct: Construct));
register!(module, rt.construct_key(construct: Construct));

// Editing: Tree Nav
register!(module, rt, TreeNavCommand::Prev as tree_nav_prev);
Expand Down

0 comments on commit 4dc32ae

Please sign in to comment.