From f71ee5c5213cca4bd8fc3e73cac1cc2815a113ce Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sun, 15 Dec 2024 16:39:49 +0100 Subject: [PATCH] tab toggles pool visibility in sequencer --- crates/tek/src/cli/cli_sequencer.rs | 6 ++-- crates/tek/src/tui/app_sequencer.rs | 54 +++++++++++++++++------------ 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/crates/tek/src/cli/cli_sequencer.rs b/crates/tek/src/cli/cli_sequencer.rs index ec18266e..ff86569d 100644 --- a/crates/tek/src/cli/cli_sequencer.rs +++ b/crates/tek/src/cli/cli_sequencer.rs @@ -20,12 +20,12 @@ pub struct SequencerCli { impl SequencerCli { fn run (&self) -> Usually<()> { Tui::run(JackClient::new("tek_sequencer")?.activate_with(|jack|{ - let mut app = SequencerTui::try_from(jack)?; + let midi_in = jack.read().unwrap().register_port("in", MidiIn::default())?; + let midi_out = jack.read().unwrap().register_port("out", MidiOut::default())?; + let mut app = SequencerTui::try_from(jack)?; //app.editor.view_mode.set_time_zoom(1); // TODO: create from arguments - let midi_in = app.jack.read().unwrap().register_port("in", MidiIn::default())?; app.player.midi_ins.push(midi_in); - let midi_out = app.jack.read().unwrap().register_port("out", MidiOut::default())?; app.player.midi_outs.push(midi_out); if let Some(_) = self.name.as_ref() { // TODO: sequencer.name = Arc::new(RwLock::new(name.clone())); diff --git a/crates/tek/src/tui/app_sequencer.rs b/crates/tek/src/tui/app_sequencer.rs index 7316f348..e9db5496 100644 --- a/crates/tek/src/tui/app_sequencer.rs +++ b/crates/tek/src/tui/app_sequencer.rs @@ -16,17 +16,16 @@ impl TryFrom<&Arc>> for SequencerTui { Some(ItemColor::random().into()) ))); Ok(Self { - jack: jack.clone(), - phrases: PhraseListModel::from(&phrase), - editor: PhraseEditorModel::from(&phrase), - player: PhrasePlayerModel::from((&clock, &phrase)), + _jack: jack.clone(), + phrases: PhraseListModel::from(&phrase), + editor: PhraseEditorModel::from(&phrase), + player: PhrasePlayerModel::from((&clock, &phrase)), clock, - size: Measure::new(), - cursor: (0, 0), - split: 20, - midi_buf: vec![vec![];65536], - note_buf: vec![], - perf: PerfModel::default(), + size: Measure::new(), + midi_buf: vec![vec![];65536], + note_buf: vec![], + perf: PerfModel::default(), + show_pool: true, }) } @@ -34,17 +33,16 @@ impl TryFrom<&Arc>> for SequencerTui { /// Root view for standalone `tek_sequencer`. pub struct SequencerTui { - pub jack: Arc>, - pub clock: ClockModel, - pub phrases: PhraseListModel, - pub player: PhrasePlayerModel, - pub editor: PhraseEditorModel, - pub size: Measure, - pub cursor: (usize, usize), - pub split: u16, - pub note_buf: Vec, - pub midi_buf: Vec>>, - pub perf: PerfModel, + _jack: Arc>, + pub(crate) clock: ClockModel, + pub(crate) phrases: PhraseListModel, + pub(crate) player: PhrasePlayerModel, + pub(crate) editor: PhraseEditorModel, + pub(crate) size: Measure, + pub(crate) show_pool: bool, + pub(crate) note_buf: Vec, + pub(crate) midi_buf: Vec>>, + pub(crate) perf: PerfModel, } #[derive(Clone, Debug)] @@ -53,6 +51,7 @@ pub enum SequencerCommand { Phrases(PhrasesCommand), Editor(PhraseCommand), Enqueue(Option>>), + ShowPool(bool), } impl Command for SequencerCommand { @@ -75,6 +74,10 @@ impl Command for SequencerCommand { state.player.enqueue_next(phrase.as_ref()); None }, + Self::ShowPool(value) => { + state.show_pool = value; + None + } }) } } @@ -88,6 +91,9 @@ impl InputToCommand for SequencerCommand { pub fn to_sequencer_command (state: &SequencerTui, input: &TuiInput) -> Option { Some(match input.event() { + // Toggle visibility of phrase pool column + key_pat!(Tab) => ShowPool(!state.show_pool), + // Enqueue currently edited phrase key_pat!(Char('q')) => Enqueue(Some( state.phrases.phrases[state.phrases.phrase.load(Ordering::Relaxed)].clone() @@ -137,7 +143,7 @@ pub fn to_sequencer_command (state: &SequencerTui, input: &TuiInput) -> Option 60 { + Tui::split_w(false, if !self.show_pool{ + 0 + } else if self.size.w() > 60 { 20 } else if self.size.w() > 40 { 15