wip: refactoring groovebox render

This commit is contained in:
🪞👃🪞 2024-12-30 15:28:46 +01:00
parent 304ce35cbb
commit 8cbe621b07

View file

@ -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<Tui>,
pub status: bool,
@ -120,52 +120,48 @@ render!(<Tui>|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<Tui>>(&'a Sampler, &'a MidiEditor, usize, T);
render!(<Tui>|self: EditStatus<'a, T: Render<Tui>>|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!(<Tui>|self: GrooveboxSamples<'a>|{
let note_lo = self.0.editor.note_lo().load(Relaxed);