diff --git a/src/groovebox.rs b/src/groovebox.rs index a1f24c71..f8a6753a 100644 --- a/src/groovebox.rs +++ b/src/groovebox.rs @@ -12,7 +12,7 @@ pub struct Groovebox { pub player: MidiPlayer, pub pool: PoolModel, pub editor: MidiEditorModel, - pub sampler: crate::sampler::Sampler, + pub sampler: Sampler, pub size: Measure, pub status: bool, @@ -120,52 +120,48 @@ render!(|self:Groovebox|{ let color = self.player.play_phrase().as_ref() .and_then(|(_,p)|p.as_ref().map(|p|p.read().unwrap().color)) .clone(); + let transport = Fixed::h(3, row!([ + PlayPause(self.clock().is_rolling()), + TransportView::new(self, color, true), + ])); + let selector = Push::x(sampler_w, Fixed::h(1, row!(![ + PhraseSelector::play_phrase(&self.player), + PhraseSelector::next_phrase(&self.player), + ]))); + let pool = move|x|Split::w(false, pool_w, Pull::y(1, Fill::h(Align::e(PoolView(&self.pool)))), x); + let sampler = move|x|Split::e(false, sampler_w, Fill::wh(col!([ + Meters(self.sampler.input_meter.as_ref()), + GrooveboxSamples(self) + ])), x); + let status = EditStatus(&self.sampler, &self.editor, note_pt, pool(sampler(&self.editor))); Fill::wh(lay!([ &self.size, Fill::wh(Align::s(Fixed::h(2, GrooveboxStatus::from(self)))), - Shrink::y(2, col!([ - Fixed::h(3, row!([ - PlayPause(self.clock().is_rolling()), - TransportView::new(self, color, true), - ])), - Push::x(sampler_w, Fixed::h(1, row!([ - PhraseSelector::play_phrase(&self.player), - PhraseSelector::next_phrase(&self.player), - ]))), - row!([ - Split::n(false, 9, - col!([ - row!(|add|{ - if let Some(sample) = &self.sampler.mapped[note_pt] { - add(&format!("Sample {}", sample.read().unwrap().end))?; - } - add(&MidiEditStatus(&self.editor))?; - Ok(()) - }), - lay!([ - Outer(Style::default().fg(TuiTheme::g(128))), - Fill::w(Fixed::h(8, if let Some((_, sample)) = &self.sampler.recording { - SampleViewer(Some(sample.clone())) - } else if let Some(sample) = &self.sampler.mapped[note_pt] { - SampleViewer(Some(sample.clone())) - } else { - SampleViewer(None) - })), - ]), - ]), - Split::w(false, pool_w, - Pull::y(1, Fill::h(Align::e(PoolView(&self.pool)))), - Split::e(false, sampler_w, Fill::wh(col!([ - Meters(self.sampler.input_meter.as_ref()), - GrooveboxSamples(self), - ])), Fill::h(&self.editor)) - ) - ), - ]), - ])) + Shrink::y(2, col!(![transport, selector, status])) ])) }); +struct EditStatus<'a, T: Render>(&'a Sampler, &'a MidiEditor, usize, T); +render!(|self: EditStatus<'a, T: Render>|Split::n(false, 9, col!(![ + row!(|add|{ + if let Some(sample) = &self.0.mapped[self.2] { + add(&format!("Sample {}", sample.read().unwrap().end))?; + } + add(&MidiEditStatus(&self.1))?; + Ok(()) + }), + lay!([ + Outer(Style::default().fg(TuiTheme::g(128))), + Fill::w(Fixed::h(8, if let Some((_, sample)) = &self.0.recording { + SampleViewer(Some(sample.clone())) + } else if let Some(sample) = &self.0.mapped[self.2] { + SampleViewer(Some(sample.clone())) + } else { + SampleViewer(None) + })), + ]), +]), self.3)); + struct GrooveboxSamples<'a>(&'a Groovebox); render!(|self: GrooveboxSamples<'a>|{ let note_lo = self.0.editor.note_lo().load(Relaxed);