use crate::*; handle!(TuiIn: |self: Tek, input|if let Some(handler) = self.handler { handler(self, input) } else { 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!("../edn/arranger_keys.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!("../edn/arranger_keys_clip.edn")), Selection::Track(_) => SourceIter(include_str!("../edn/arranger_keys_track.edn")), Selection::Scene(_) => SourceIter(include_str!("../edn/arranger_keys_scene.edn")), Selection::Mix => SourceIter(include_str!("../edn/arranger_keys_mix.edn")), }.command::<_, TekCommand, _>(app, input) { if let Some(undo) = command.execute(app)? { app.history.push(undo); } return Ok(Some(true)) } Ok(None) } pub fn handle_sequencer (app: &mut Tek, input: &TuiIn) -> Perhaps { if let Some(command) = SourceIter(include_str!("../edn/sequencer_keys.edn")) .command::<_, TekCommand, _>(app, input) { if let Some(undo) = command.execute(app)? { app.history.push(undo); } return Ok(Some(true)) } Ok(None) } pub fn handle_groovebox (app: &mut Tek, input: &TuiIn) -> Perhaps { if let Some(command) = SourceIter(include_str!("../edn/groovebox_keys.edn")) .command::<_, TekCommand, _>(app, input) { if let Some(undo) = command.execute(app)? { app.history.push(undo); } return Ok(Some(true)) } Ok(None) } 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!("../edn/sampler_keys.edn")) .command::<_, SamplerCommand, _>(sampler, input) { if let Some(undo) = command.execute(sampler)? { //app.history.push(undo); // TODO UNDO } return Ok(Some(true)) } Ok(None) }