diff --git a/crates/tek/src/tui/phrase_editor.rs b/crates/tek/src/tui/phrase_editor.rs index 02e019f8..d3a001a9 100644 --- a/crates/tek/src/tui/phrase_editor.rs +++ b/crates/tek/src/tui/phrase_editor.rs @@ -40,39 +40,40 @@ impl PhraseEditorModel { fn phrase_length (&self) -> usize { self.phrase().as_ref().map(|p|p.read().unwrap().length).unwrap_or(1) } + const KEYS: [(TuiEvent, &'static dyn Fn(&Self)->PhraseCommand);27] = [ + (kexp!(Ctrl-Alt-Up), &|s: &Self|SetNoteScroll(s.note_point() + 3)), + (kexp!(Ctrl-Alt-Down), &|s: &Self|SetNoteScroll(s.note_point().saturating_sub(3))), + (kexp!(Ctrl-Alt-Left), &|s: &Self|SetTimeScroll(s.time_point().saturating_sub(s.time_zoom().get()))), + (kexp!(Ctrl-Alt-Right), &|s: &Self|SetTimeScroll((s.time_point() + s.time_zoom().get()) % s.phrase_length())), + (kexp!(Ctrl-Up), &|s: &Self|SetNoteScroll(s.note_lo().get() + 1)), + (kexp!(Ctrl-Down), &|s: &Self|SetNoteScroll(s.note_lo().get().saturating_sub(1))), + (kexp!(Ctrl-Left), &|s: &Self|SetTimeScroll(s.time_start().get().saturating_sub(s.note_len()))), + (kexp!(Ctrl-Right), &|s: &Self|SetTimeScroll(s.time_start().get() + s.note_len())), + (kexp!(Alt-Up), &|s: &Self|SetNoteCursor(s.note_point() + 3)), + (kexp!(Alt-Down), &|s: &Self|SetNoteCursor(s.note_point().saturating_sub(3))), + (kexp!(Alt-Left), &|s: &Self|SetTimeCursor(s.time_point().saturating_sub(s.time_zoom().get()))), + (kexp!(Alt-Right), &|s: &Self|SetTimeCursor((s.time_point() + s.time_zoom().get()) % s.phrase_length())), + (kexp!(Up), &|s: &Self|SetNoteCursor(s.note_point() + 1)), + (kexp!(Down), &|s: &Self|SetNoteCursor(s.note_point().saturating_sub(1))), + (kexp!(Left), &|s: &Self|SetTimeCursor(s.time_point().saturating_sub(s.note_len()))), + (kexp!(Right), &|s: &Self|SetTimeCursor((s.time_point() + s.note_len()) % s.phrase_length())), + (kexp!(Char('z')), &|s: &Self|SetTimeLock(!s.time_lock().get())), + (kexp!(Char('-')), &|s: &Self|SetTimeZoom(Note::next(s.time_zoom().get()))), + (kexp!(Char('_')), &|s: &Self|SetTimeZoom(Note::next(s.time_zoom().get()))), + (kexp!(Char('=')), &|s: &Self|SetTimeZoom(Note::prev(s.time_zoom().get()))), + (kexp!(Char('+')), &|s: &Self|SetTimeZoom(Note::prev(s.time_zoom().get()))), + (kexp!(Enter), &|s: &Self|PutNote), + (kexp!(Ctrl-Enter), &|s: &Self|AppendNote), + (kexp!(Char(',')), &|s: &Self|SetNoteLength(Note::prev(s.note_len()))), // TODO: no 3plet + (kexp!(Char('.')), &|s: &Self|SetNoteLength(Note::next(s.note_len()))), + (kexp!(Char('<')), &|s: &Self|SetNoteLength(Note::prev(s.note_len()))), // TODO: 3plet + (kexp!(Char('>')), &|s: &Self|SetNoteLength(Note::next(s.note_len()))), + //key_pat!(Char('`')) -> ToggleDirection, + //// TODO: key_pat!(Char('/')) => // toggle 3plet + //// TODO: key_pat!(Char('?')) => // toggle dotted + ]; fn to_editor_command (&self, from: &TuiInput) -> Option { - event_map!([ - (kexp!(Ctrl-Alt-Up), &|s: &Self|SetNoteScroll(s.note_point() + 3)), - (kexp!(Ctrl-Alt-Down), &|s: &Self|SetNoteScroll(s.note_point().saturating_sub(3))), - (kexp!(Ctrl-Alt-Left), &|s: &Self|SetTimeScroll(s.time_point().saturating_sub(s.time_zoom().get()))), - (kexp!(Ctrl-Alt-Right), &|s: &Self|SetTimeScroll((s.time_point() + s.time_zoom().get()) % s.phrase_length())), - (kexp!(Ctrl-Up), &|s: &Self|SetNoteScroll(s.note_lo().get() + 1)), - (kexp!(Ctrl-Down), &|s: &Self|SetNoteScroll(s.note_lo().get().saturating_sub(1))), - (kexp!(Ctrl-Left), &|s: &Self|SetTimeScroll(s.time_start().get().saturating_sub(s.note_len()))), - (kexp!(Ctrl-Right), &|s: &Self|SetTimeScroll(s.time_start().get() + s.note_len())), - (kexp!(Alt-Up), &|s: &Self|SetNoteCursor(s.note_point() + 3)), - (kexp!(Alt-Down), &|s: &Self|SetNoteCursor(s.note_point().saturating_sub(3))), - (kexp!(Alt-Left), &|s: &Self|SetTimeCursor(s.time_point().saturating_sub(s.time_zoom().get()))), - (kexp!(Alt-Right), &|s: &Self|SetTimeCursor((s.time_point() + s.time_zoom().get()) % s.phrase_length())), - (kexp!(Up), &|s: &Self|SetNoteCursor(s.note_point() + 1)), - (kexp!(Down), &|s: &Self|SetNoteCursor(s.note_point().saturating_sub(1))), - (kexp!(Left), &|s: &Self|SetTimeCursor(s.time_point().saturating_sub(s.note_len()))), - (kexp!(Right), &|s: &Self|SetTimeCursor((s.time_point() + s.note_len()) % s.phrase_length())), - (kexp!(Char('z')), &|s: &Self|SetTimeLock(!s.time_lock().get())), - (kexp!(Char('-')), &|s: &Self|SetTimeZoom(Note::next(s.time_zoom().get()))), - (kexp!(Char('_')), &|s: &Self|SetTimeZoom(Note::next(s.time_zoom().get()))), - (kexp!(Char('=')), &|s: &Self|SetTimeZoom(Note::prev(s.time_zoom().get()))), - (kexp!(Char('+')), &|s: &Self|SetTimeZoom(Note::prev(s.time_zoom().get()))), - (kexp!(Enter), &|s: &Self|PutNote), - (kexp!(Ctrl-Enter), &|s: &Self|AppendNote), - (kexp!(Char(',')), &|s: &Self|SetNoteLength(Note::prev(s.note_len()))), // TODO: no 3plet - (kexp!(Char('.')), &|s: &Self|SetNoteLength(Note::next(s.note_len()))), - (kexp!(Char('<')), &|s: &Self|SetNoteLength(Note::prev(s.note_len()))), // TODO: 3plet - (kexp!(Char('>')), &|s: &Self|SetNoteLength(Note::next(s.note_len()))), - //key_pat!(Char('`')) -> ToggleDirection, - //// TODO: key_pat!(Char('/')) => // toggle 3plet - //// TODO: key_pat!(Char('?')) => // toggle dotted - ]).handle(self, from.event()) + event_map!(Self::KEYS).handle(self, from.event()) } } diff --git a/crates/tek/src/tui/tui_input.rs b/crates/tek/src/tui/tui_input.rs index 821a42cc..7777b0e5 100644 --- a/crates/tek/src/tui/tui_input.rs +++ b/crates/tek/src/tui/tui_input.rs @@ -82,7 +82,7 @@ impl<'a, const N: usize, E: PartialEq, T, U> EventMap<'a, N, E, T, U> { } #[macro_export] macro_rules! kexp { - (Ctrl-Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::CONTROL | KeyModifiers::ALT) }; + (Ctrl-Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::from_bits(0b0000_0110).unwrap()) }; (Ctrl-$code:ident) => { key_event_expr!($code, KeyModifiers::CONTROL) }; (Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::ALT) }; (Shift-$code:ident) => { key_event_expr!($code, KeyModifiers::SHIFT) };