use crate::*; /// Handle top-level events in standalone arranger. impl Handle for Arranger { fn handle (&mut self, from: &TuiInput) -> Perhaps { if !self.handle_focused(from)?.unwrap_or(false) { match from.event() { key!(KeyCode::Tab) => { self.focus_next(); }, key!(Shift-KeyCode::Tab) => { self.focus_prev(); }, key!(KeyCode::BackTab) => { self.focus_prev(); }, key!(Shift-KeyCode::BackTab) => { self.focus_prev(); }, key!(KeyCode::Up) => { self.focus_up(); }, key!(KeyCode::Down) => { self.focus_down(); }, key!(KeyCode::Left) => { self.focus_left(); }, key!(KeyCode::Right) => { self.focus_right(); }, key!(KeyCode::Char('e')) => { self.edit_phrase(); }, key!(KeyCode::Char(' ')) => { self.toggle_play(); }, key!(KeyCode::Char('n')) => { self.rename_selected(); }, _ => return Ok(None) } }; Ok(Some(true)) } } impl Arranger { /// Helper for event passthru to focused component fn handle_focused (&mut self, from: &TuiInput) -> Perhaps { match self.focused() { ArrangerFocus::Transport => self.transport.handle(from), ArrangerFocus::PhrasePool => self.phrases.handle(from), ArrangerFocus::PhraseEditor => self.editor.handle(from), ArrangerFocus::Arrangement => self.handle_arrangement(from), } } /// Helper for phrase event passthru when arrangement is focused fn handle_arrangement (&mut self, from: &TuiInput) -> Perhaps { let mut handle_phrase = ||{ let result = self.phrases.handle(from); self.arrangement.phrase_put(); result }; match from.event() { key!(KeyCode::Char('a')) => handle_phrase(), key!(KeyCode::Char('c')) => handle_phrase(), key!(KeyCode::Char('i')) => handle_phrase(), key!(KeyCode::Char('d')) => handle_phrase(), _ => self.arrangement.handle(from) } } } /// Handle events for arrangement. impl Handle for Arrangement { fn handle (&mut self, from: &TuiInput) -> Perhaps { match from.event() { key!(KeyCode::Char('`')) => { self.mode.to_next(); }, key!(KeyCode::Delete) => { self.delete(); }, key!(KeyCode::Enter) => { self.activate(); }, key!(KeyCode::Char('.')) => { self.increment(); }, key!(KeyCode::Char(',')) => { self.decrement(); }, key!(KeyCode::Char('<')) => { self.move_back(); }, key!(KeyCode::Char('>')) => { self.move_forward(); }, key!(KeyCode::Char('s')) => { self.phrase_put(); }, key!(KeyCode::Char('g')) => { self.phrase_get(); }, key!(Ctrl-KeyCode::Char('a')) => { self.scene_add(None, None)?; }, key!(Ctrl-KeyCode::Char('t')) => { self.track_add(None, None)?; }, key!(KeyCode::Char('l')) => { self.toggle_loop() }, key!(KeyCode::Up) => { self.go_up() }, key!(KeyCode::Down) => { self.go_down() }, key!(KeyCode::Left) => { self.go_left() }, key!(KeyCode::Right) => { self.go_right() }, _ => return Ok(None) } Ok(Some(true)) } }