mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 19:56:42 +01:00
74 lines
3.5 KiB
Rust
74 lines
3.5 KiB
Rust
use crate::*;
|
|
/// Handle top-level events in standalone arranger.
|
|
impl Handle<Tui> for Arranger<Tui> {
|
|
fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> {
|
|
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<Tui> {
|
|
/// Helper for event passthru to focused component
|
|
fn handle_focused (&mut self, from: &TuiInput) -> Perhaps<bool> {
|
|
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<bool> {
|
|
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<Tui> for Arrangement<Tui> {
|
|
fn handle (&mut self, from: &TuiInput) -> Perhaps<bool> {
|
|
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))
|
|
}
|
|
}
|