From 6be71a44138ebb8c5cc63189f680aff9197c56bd Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 19 Dec 2024 14:46:45 +0100 Subject: [PATCH] wip: add note with (Shift-)Enter --- crates/tek/src/tui/app_arranger.rs | 82 ++++++++++++++++----------- crates/tek/src/tui/arranger_clip.rs | 2 +- crates/tek/src/tui/arranger_mode_v.rs | 12 ++-- crates/tek/src/tui/arranger_scene.rs | 4 +- crates/tek/src/tui/arranger_track.rs | 4 +- crates/tek/src/tui/phrase_editor.rs | 5 +- 6 files changed, 65 insertions(+), 44 deletions(-) diff --git a/crates/tek/src/tui/app_arranger.rs b/crates/tek/src/tui/app_arranger.rs index a33d37b9..5eccb290 100644 --- a/crates/tek/src/tui/app_arranger.rs +++ b/crates/tek/src/tui/app_arranger.rs @@ -1,22 +1,23 @@ use crate::*; use ClockCommand::{Play, Pause}; -use KeyCode::{Char, Delete}; +use KeyCode::{Char, Delete, Tab}; /// Root view for standalone `tek_arranger` pub struct ArrangerTui { - jack: Arc>, - pub clock: ClockModel, - pub phrases: PhraseListModel, - pub tracks: Vec, - pub scenes: Vec, - pub splits: [u16;2], - pub selected: ArrangerSelection, - pub mode: ArrangerMode, - pub color: ItemPalette, - pub size: Measure, - pub note_buf: Vec, - pub midi_buf: Vec>>, - pub editor: PhraseEditorModel, - pub perf: PerfModel, + jack: Arc>, + pub clock: ClockModel, + pub phrases: PhraseListModel, + pub tracks: Vec, + pub scenes: Vec, + pub splits: [u16;2], + pub selected: ArrangerSelection, + pub mode: ArrangerMode, + pub color: ItemPalette, + pub size: Measure, + pub note_buf: Vec, + pub midi_buf: Vec>>, + pub editor: PhraseEditorModel, + pub perf: PerfModel, + pub show_pool: bool, } from_jack!(|jack| ArrangerTui { let clock = ClockModel::from(jack); @@ -26,19 +27,20 @@ from_jack!(|jack| ArrangerTui { ))); Self { clock, - phrases: PhraseListModel::from(&phrase), - editor: PhraseEditorModel::from(&phrase), - selected: ArrangerSelection::Clip(0, 0), - scenes: vec![], - tracks: vec![], - color: TuiTheme::bg().into(), - mode: ArrangerMode::V(1), - size: Measure::new(), - splits: [12, 20], - midi_buf: vec![vec![];65536], - note_buf: vec![], - perf: PerfModel::default(), - jack: jack.clone(), + phrases: PhraseListModel::from(&phrase), + editor: PhraseEditorModel::from(&phrase), + selected: ArrangerSelection::Clip(0, 0), + scenes: vec![], + tracks: vec![], + color: TuiTheme::bg().into(), + mode: ArrangerMode::V(1), + size: Measure::new(), + splits: [12, 20], + midi_buf: vec![vec![];65536], + note_buf: vec![], + perf: PerfModel::default(), + show_pool: false, + jack: jack.clone(), } }); render!(|self: ArrangerTui|{ @@ -62,7 +64,11 @@ render!(|self: ArrangerTui|{ let play = Fixed::wh(5, 2, PlayPause(self.clock.is_rolling())); let transport = TransportView::from((self, None, true)); let with_transport = |x|col!([row!(![&play, &transport]), &x]); - let with_pool = |x|Split::left(false, self.splits[1], PhraseListView(&self.phrases), x); + let with_pool = |x|Split::left(false, if self.show_pool { + self.splits[1] + } else { + 0 + }, PhraseListView(&self.phrases), x); with_transport(with_pool(col!([ &self.size, Fill::w(Fixed::h(20, arranger())), @@ -124,6 +130,7 @@ handle!(|self: ArrangerTui, input|ArrangerCommand::execute_with_state(self, Zoom(usize), Phrases(PhrasesCommand), Editor(PhraseCommand), + ShowPool(bool) } input_to_command!(ArrangerCommand: |state:ArrangerTui,input|{ use ArrangerSelection as Selected; @@ -163,11 +170,18 @@ input_to_command!(ArrangerCommand: |state:ArrangerTui,input|{ Selected::Scene(s) => return None, Selected::Clip(t, s) => return None, }, + // Tab: Toggle visibility of phrase pool column + key_pat!(Tab) => + ShowPool(!state.show_pool), _ => match state.selected() { Selected::Mix => to_arranger_mix_command(input), - Selected::Track(t) => to_arranger_track_command(input, t), - Selected::Scene(s) => to_arranger_scene_command(input, s), - Selected::Clip(t, s) => to_arranger_clip_command(input, t, s), + Selected::Track(t) => to_arranger_track_command(input, + t, state.tracks.len()), + Selected::Scene(s) => to_arranger_scene_command(input, + s, state.scenes.len()), + Selected::Clip(t, s) => to_arranger_clip_command(input, + t, state.tracks.len(), + s, state.scenes.len()), }.or_else(||if let Some(command) = PhraseCommand::input_to_command(&state.editor, input) { Some(Editor(command)) } else if let Some(command) = PhrasesCommand::input_to_command(&state.phrases, input) { @@ -213,6 +227,10 @@ command!(|self:ArrangerCommand,state:ArrangerTui|{ state.color = palette; Some(Color(old)) }, + ShowPool(show) => { + state.show_pool = show; + None + }, _ => { todo!() } } }); diff --git a/crates/tek/src/tui/arranger_clip.rs b/crates/tek/src/tui/arranger_clip.rs index 040db3aa..9f61d1f1 100644 --- a/crates/tek/src/tui/arranger_clip.rs +++ b/crates/tek/src/tui/arranger_clip.rs @@ -1,6 +1,6 @@ use crate::*; -pub fn to_arranger_clip_command (input: &TuiInput, t: usize, s: usize) -> Option { +pub fn to_arranger_clip_command (input: &TuiInput, t: usize, len_t: usize, s: usize, len_s: usize) -> Option { use KeyCode::{Char, Up, Down, Left, Right, Delete}; use ArrangerCommand as Cmd; use ArrangerSelection as Select; diff --git a/crates/tek/src/tui/arranger_mode_v.rs b/crates/tek/src/tui/arranger_mode_v.rs index 1c03986e..dc95b787 100644 --- a/crates/tek/src/tui/arranger_mode_v.rs +++ b/crates/tek/src/tui/arranger_mode_v.rs @@ -81,12 +81,16 @@ render!(|self: ArrangerVCursor|render(move|to: &mut TuiOutput|{ let focused = self.focused; let selected = self.selected; let get_track_area = |t: usize| [ - self.scenes_w + area.x() + self.cols[t].1 as u16, area.y(), - self.cols[t].0 as u16, area.h(), + self.scenes_w + area.x() + self.cols[t].1 as u16, + area.y(), + self.cols[t].0 as u16, + area.h(), ]; let get_scene_area = |s: usize| [ - area.x(), self.header_h + area.y() + (self.rows[s].1 / PPQ) as u16, - area.w(), (self.rows[s].0 / PPQ) as u16 + area.x(), + self.header_h + area.y() + (self.rows[s].1 / PPQ) as u16, + area.w(), + (self.rows[s].0 / PPQ) as u16 ]; let get_clip_area = |t: usize, s: usize| [ self.scenes_w + area.x() + self.cols[t].1 as u16, diff --git a/crates/tek/src/tui/arranger_scene.rs b/crates/tek/src/tui/arranger_scene.rs index 61278579..b04ff695 100644 --- a/crates/tek/src/tui/arranger_scene.rs +++ b/crates/tek/src/tui/arranger_scene.rs @@ -73,14 +73,14 @@ pub enum ArrangerSceneCommand { SetZoom(usize), SetColor(usize, ItemPalette), } -pub fn to_arranger_scene_command (input: &TuiInput, s: usize) -> Option { +pub fn to_arranger_scene_command (input: &TuiInput, s: usize, len: usize) -> Option { use KeyCode::{Char, Up, Down, Right, Enter, Delete}; use ArrangerCommand as Cmd; use ArrangerSelection as Select; use ArrangerSceneCommand as Scene; Some(match input.event() { key_pat!(Char('w')) => Cmd::Select(if s > 0 { Select::Scene(s - 1) } else { Select::Mix }), - key_pat!(Char('s')) => Cmd::Select(Select::Scene(s + 1)), + key_pat!(Char('s')) => Cmd::Select(Select::Scene((s + 1) % len)), key_pat!(Char('d')) => Cmd::Select(Select::Clip(0, s)), key_pat!(Char(',')) => Cmd::Scene(Scene::Swap(s, s - 1)), key_pat!(Char('.')) => Cmd::Scene(Scene::Swap(s, s + 1)), diff --git a/crates/tek/src/tui/arranger_track.rs b/crates/tek/src/tui/arranger_track.rs index 79c7fa58..e99950df 100644 --- a/crates/tek/src/tui/arranger_track.rs +++ b/crates/tek/src/tui/arranger_track.rs @@ -86,14 +86,14 @@ impl<'a, T: ArrangerTrackApi, H: HasTracks> Audio for TracksAudio<'a, T, H> { Control::Continue } } -pub fn to_arranger_track_command (input: &TuiInput, t: usize) -> Option { +pub fn to_arranger_track_command (input: &TuiInput, t: usize, len: usize) -> Option { use ArrangerCommand::*; use ArrangerSelection as Selected; use ArrangerTrackCommand as Tracks; Some(match input.event() { key_pat!(Char('s')) => Select(Selected::Clip(t, 0)), key_pat!(Char('a')) => Select(if t > 0 { Selected::Track(t - 1) } else { Selected::Mix }), - key_pat!(Char('d')) => Select(Selected::Track(t + 1)), + key_pat!(Char('d')) => Select(Selected::Track((t + 1) % len)), key_pat!(Char(',')) => Track(Tracks::Swap(t, t - 1)), key_pat!(Char('.')) => Track(Tracks::Swap(t, t + 1)), key_pat!(Char('<')) => Track(Tracks::Swap(t, t - 1)), diff --git a/crates/tek/src/tui/phrase_editor.rs b/crates/tek/src/tui/phrase_editor.rs index cc613232..d78745e7 100644 --- a/crates/tek/src/tui/phrase_editor.rs +++ b/crates/tek/src/tui/phrase_editor.rs @@ -1,5 +1,4 @@ use crate::*; -use Ordering::Relaxed; use KeyCode::{Char, Up, Down, Left, Right}; use PhraseCommand::*; @@ -64,8 +63,8 @@ impl InputToCommand for PhraseCommand { key_pat!(Char('_')) => SetTimeZoom(next_note_length(time_zoom())), key_pat!(Char('=')) => SetTimeZoom(prev_note_length(time_zoom())), key_pat!(Char('+')) => SetTimeZoom(prev_note_length(time_zoom())), - key_pat!(Char('a')) => AppendNote, - key_pat!(Char('s')) => PutNote, + key_pat!(Enter) => PutNote, + key_pat!(Ctrl-Enter) => AppendNote, key_pat!(Char(',')) => SetNoteLength(prev_note_length(note_len())), // TODO: no 3plet key_pat!(Char('.')) => SetNoteLength(next_note_length(note_len())), key_pat!(Char('<')) => SetNoteLength(prev_note_length(note_len())), // TODO: 3plet