From dcd0de7710bc84adb158e0af3798ea16cc6c2f8d Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 27 Apr 2025 18:26:03 +0300 Subject: [PATCH] refactor stacked keymaps --- config/keys_arranger.edn | 5 -- .../{keys_arranger_clip.edn => keys_clip.edn} | 0 config/keys_global.edn | 5 ++ config/keys_groovebox.edn | 6 -- .../{keys_arranger_mix.edn => keys_mix.edn} | 0 ...keys_arranger_scene.edn => keys_scene.edn} | 0 config/keys_sequencer.edn | 2 - ...keys_arranger_track.edn => keys_track.edn} | 0 crates/app/src/keys.rs | 83 ++++++------------- 9 files changed, 31 insertions(+), 70 deletions(-) rename config/{keys_arranger_clip.edn => keys_clip.edn} (100%) create mode 100644 config/keys_global.edn rename config/{keys_arranger_mix.edn => keys_mix.edn} (100%) rename config/{keys_arranger_scene.edn => keys_scene.edn} (100%) rename config/{keys_arranger_track.edn => keys_track.edn} (100%) diff --git a/config/keys_arranger.edn b/config/keys_arranger.edn index fcb88e93..76c99881 100644 --- a/config/keys_arranger.edn +++ b/config/keys_arranger.edn @@ -1,8 +1,3 @@ -(@esc menu) -(@f1 help) - -(@u undo 1) -(@shift-u redo 1) (@space clock toggle) (@shift-space clock toggle 0) (@t select :track 0) diff --git a/config/keys_arranger_clip.edn b/config/keys_clip.edn similarity index 100% rename from config/keys_arranger_clip.edn rename to config/keys_clip.edn diff --git a/config/keys_global.edn b/config/keys_global.edn new file mode 100644 index 00000000..cd9fc7e6 --- /dev/null +++ b/config/keys_global.edn @@ -0,0 +1,5 @@ +(@esc menu) +(@f1 help) + +(@u undo 1) +(@shift-u redo 1) diff --git a/config/keys_groovebox.edn b/config/keys_groovebox.edn index 751b1762..9058d778 100644 --- a/config/keys_groovebox.edn +++ b/config/keys_groovebox.edn @@ -1,9 +1,3 @@ -(@esc menu) -(@f1 help) - -(@u undo 1) -(@shift-u redo 1) - (@space clock toggle) (@shift-space clock toggle 0) diff --git a/config/keys_arranger_mix.edn b/config/keys_mix.edn similarity index 100% rename from config/keys_arranger_mix.edn rename to config/keys_mix.edn diff --git a/config/keys_arranger_scene.edn b/config/keys_scene.edn similarity index 100% rename from config/keys_arranger_scene.edn rename to config/keys_scene.edn diff --git a/config/keys_sequencer.edn b/config/keys_sequencer.edn index 462e7ff4..39b19380 100644 --- a/config/keys_sequencer.edn +++ b/config/keys_sequencer.edn @@ -1,5 +1,3 @@ -(@u undo 1) -(@shift-u redo 1) (@space clock toggle) (@shift-space clock toggle 0) (@c color) diff --git a/config/keys_arranger_track.edn b/config/keys_track.edn similarity index 100% rename from config/keys_arranger_track.edn rename to config/keys_track.edn diff --git a/crates/app/src/keys.rs b/crates/app/src/keys.rs index bbab075d..2bdbcaf1 100644 --- a/crates/app/src/keys.rs +++ b/crates/app/src/keys.rs @@ -6,74 +6,43 @@ handle!(TuiIn: |self: Tek, input|if let Some(handler) = self.handler { Ok(None) }); -pub fn handle_arranger (app: &mut Tek, input: &TuiIn) -> Perhaps { - // If editing, editor keys take priority - if app.is_editing() { - if app.editor.handle(input)? == Some(true) { - return Ok(Some(true)) - } - } - // Handle from root keymap - if let Some(command) = SourceIter(include_str!("../../../config/keys_arranger.edn")) - .command::<_, TekCommand, _>(app, input) - { - if let Some(undo) = command.execute(app)? { app.history.push(undo); } - return Ok(Some(true)) - } - // Handle from selection-dependent keymaps - if let Some(command) = match app.selected() { - Selection::Clip(_, _) => SourceIter(include_str!("../../../config/keys_arranger_clip.edn")), - Selection::Track(_) => SourceIter(include_str!("../../../config/keys_arranger_track.edn")), - Selection::Scene(_) => SourceIter(include_str!("../../../config/keys_arranger_scene.edn")), - Selection::Mix => SourceIter(include_str!("../../../config/keys_arranger_mix.edn")), - }.command::<_, TekCommand, _>(app, input) { +fn layer (app: &mut Tek, input: &TuiIn, keymap: &str) -> Usually { + if let Some(command) = SourceIter(keymap).command::<_, TekCommand, _>(app, input) { if let Some(undo) = command.execute(app)? { app.history.push(undo); } - return Ok(Some(true)) + return Ok(true) } - Ok(None) + return Ok(false) +} + +pub fn handle_arranger (app: &mut Tek, input: &TuiIn) -> Perhaps { + Ok((app.is_editing() && app.editor.handle(input)? == Some(true) || + layer(app, input, include_str!("../../../config/keys_global.edn"))? || + layer(app, input, include_str!("../../../config/keys_arranger.edn"))? || + app.selected.is_clip() && layer(app, input, include_str!("../../../config/keys_clip.edn"))? || + app.selected.is_track() && layer(app, input, include_str!("../../../config/keys_track.edn"))? || + app.selected.is_scene() && layer(app, input, include_str!("../../../config/keys_scene.edn"))? || + app.selected.is_mix() && layer(app, input, include_str!("../../../config/keys_mix.edn"))? + ).then_some(true)) } pub fn handle_sequencer (app: &mut Tek, input: &TuiIn) -> Perhaps { - if app.editor.handle(input)? == Some(true) { - return Ok(Some(true)) - } - if let Some(command) = SourceIter(include_str!("../../../config/keys_sequencer.edn")) - .command::<_, TekCommand, _>(app, input) - { - if let Some(undo) = command.execute(app)? { - app.history.push(undo); - } - return Ok(Some(true)) - } - Ok(None) + Ok((app.editor.handle(input)? == Some(true) || + layer(app, input, include_str!("../../../config/keys_global.edn"))? || + layer(app, input, include_str!("../../../config/keys_sequencer.edn"))? + ).then_some(true)) } pub fn handle_groovebox (app: &mut Tek, input: &TuiIn) -> Perhaps { - if app.editor.handle(input)? == Some(true) { - return Ok(Some(true)) - } - if let Some(command) = SourceIter(include_str!("../../../config/keys_groovebox.edn")) - .command::<_, TekCommand, _>(app, input) - { - if let Some(undo) = command.execute(app)? { - app.history.push(undo); - } - return Ok(Some(true)) - } - Ok(None) + Ok((app.editor.handle(input)? == Some(true) || + layer(app, input, include_str!("../../../config/keys_global.edn"))? || + layer(app, input, include_str!("../../../config/keys_groovebox.edn"))? + ).then_some(true)) } pub fn handle_sampler (app: &mut Tek, input: &TuiIn) -> Perhaps { - let sampler = app.tracks[0].sampler_mut(0).expect("no sampler"); - if let Some(command) = SourceIter(include_str!("../../../config/keys_sampler.edn")) - .command::<_, SamplerCommand, _>(sampler, input) - { - if let Some(undo) = command.execute(sampler)? { - //app.history.push(undo); // TODO UNDO - } - return Ok(Some(true)) - } - Ok(None) + Ok((layer(app, input, include_str!("../../../config/keys_global.edn"))? || + layer(app, input, include_str!("../../../config/keys_sampler.edn"))? + ).then_some(true)) }