refactor(transport): make widgets focusable

This commit is contained in:
🪞👃🪞 2024-09-01 20:29:15 +03:00
parent 2106a7c044
commit b8ac83b019
9 changed files with 204 additions and 132 deletions

View file

@ -1,51 +1,55 @@
use crate::*;
handle!{
TransportToolbar |self, e| {
handle_keymap(self, e, KEYMAP_TRANSPORT)
handle!(TransportToolbar |self, e| {
match e {
AppEvent::Input(Event::Key(KeyEvent { code: KeyCode::Right, .. })) => {
self.focus_next();
Ok(true)
},
AppEvent::Input(Event::Key(KeyEvent { code: KeyCode::Left, .. })) => {
self.focus_prev();
Ok(true)
},
AppEvent::Input(Event::Key(KeyEvent { code: KeyCode::Char(' '), .. })) => {
self.toggle_play();
Ok(true)
},
_ => self.focused_mut().handle(e)
}
}
/// Key bindings for transport toolbar.
pub const KEYMAP_TRANSPORT: &'static [KeyBinding<TransportToolbar>] = keymap!(TransportToolbar {
[Left, NONE, "transport_prev", "select previous control", |transport: &mut TransportToolbar| Ok({
transport.selected.prev();
true
})],
[Right, NONE, "transport_next", "select next control", |transport: &mut TransportToolbar| Ok({
transport.selected.next();
true
})],
[Char('.'), NONE, "transport_increment", "increment value at cursor", |transport: &mut TransportToolbar| {
match transport.selected {
TransportFocus::BPM => {
transport.timebase.bpm.fetch_add(1.0, Ordering::Relaxed);
},
TransportFocus::Quant => {
transport.quant = next_note_length(transport.quant)
},
TransportFocus::Sync => {
transport.sync = next_note_length(transport.sync)
},
};
Ok(true)
}],
[Char(','), NONE, "transport_decrement", "decrement value at cursor", |transport: &mut TransportToolbar| {
match transport.selected {
TransportFocus::BPM => {
transport.timebase.bpm.fetch_sub(1.0, Ordering::Relaxed);
},
TransportFocus::Quant => {
transport.quant = prev_note_length(transport.quant);
},
TransportFocus::Sync => {
transport.sync = prev_note_length(transport.sync);
},
};
Ok(true)
}],
[Char(' '), NONE, "transport_play_toggle", "play or pause", |transport: &mut TransportToolbar| {
transport.toggle_play()?;
Ok(true)
}],
});
handle!(TransportPlayPauseButton |self, _e| Ok(false));
handle!(TransportBPM |self, _e| {
//TransportFocus::BPM => {
//transport.timebase.bpm.fetch_add(1.0, Ordering::Relaxed);
//},
//TransportFocus::BPM => {
//transport.timebase.bpm.fetch_sub(1.0, Ordering::Relaxed);
//},
Ok(false)
});
handle!(TransportQuantize |self, _e| {
//TransportFocus::Quant => {
//transport.quant.value = next_note_length(transport.quant)
//},
//TransportFocus::Quant => {
//transport.quant.value = prev_note_length(transport.quant);
//},
Ok(false)
});
handle!(TransportSync |self, _e| {
//TransportFocus::Sync => {
//transport.sync.value = next_note_length(transport.sync)
//},
//TransportFocus::Sync => {
//transport.sync.value = prev_note_length(transport.sync);
//},
Ok(false)
});
handle!(TransportClock |self, _e| {
Ok(false)
});