From aa910540c0d44eac17d711a1b35ff7ecc9ba6356 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Tue, 31 Dec 2024 17:01:24 +0100 Subject: [PATCH] remove uses of Split, implement Bsp::area --- layout/src/collection.rs | 4 +- layout/src/direction.rs | 83 ++++++++++++++++++++++++---------------- src/arranger.rs | 6 +-- src/groovebox.rs | 37 ++++++++++-------- src/sequencer.rs | 6 +-- 5 files changed, 79 insertions(+), 57 deletions(-) diff --git a/layout/src/collection.rs b/layout/src/collection.rs index 6fe8baa7..5d48b6d3 100644 --- a/layout/src/collection.rs +++ b/layout/src/collection.rs @@ -1,6 +1,6 @@ //! Groupings of elements. -mod split; pub use self::split::*; +//mod split; pub use self::split::*; //mod stack; pub use self::stack::*; use crate::*; @@ -82,7 +82,7 @@ impl, B: Content> Content for Either { } } -pub trait Render { +trait Render { fn area (&self, to: E::Area) -> E::Area; fn render (&self, to: &mut E::Output); } diff --git a/layout/src/direction.rs b/layout/src/direction.rs index 88802d9f..2ea19120 100644 --- a/layout/src/direction.rs +++ b/layout/src/direction.rs @@ -120,39 +120,58 @@ impl, Y: Content> Default for Bsp { } impl, Y: Content> Content for Bsp { - fn render (&self, to: &mut E::Output) { - let _n = E::Size::zero(); - let _s = to.wh(); + fn area (&self, outer: E::Area) -> E::Area { match self { - Self::Null(_) => {}, - //Self::S(p, a, b) => { - //let s_a = a.min_size(s)?.unwrap_or(n); - //let _ = b.min_size(s)?.unwrap_or(n); - //let h = s_a.h().into(); - //to.render_in(to.area().clip_h(h).into(), a); - //to.render_in(to.area().shrink_y(h).push_y(h).into(), b); - //}, - //Self::E(p, a, b) => { - //let s_a = a.min_size(s)?.unwrap_or(n); - //let _ = b.min_size(s)?.unwrap_or(n); - //let w = s_a.w().into(); - //to.render_in(to.area().clip_w(w).into(), a); - //to.render_in(to.area().push_x(w).shrink_x(w).into(), b); - //}, - //Self::W(p, a, b) => { - //let s_a = a.min_size(s)?.unwrap_or(n); - //let _ = b.min_size(s)?.unwrap_or(n); - //let w = (to.area().w() - s_a.w()).into(); - //to.render_in(to.area().push_x(w).into(), a); - //to.render_in(to.area().shrink_x(w).into(), b); - //}, - //Self::N(p, a, b) => { - //let s_a = a.min_size(s)?.unwrap_or(n); - //let _ = b.min_size(s)?.unwrap_or(n); - //let h = to.area().h() - s_a.h(); - //to.render_in(to.area().push_y(h).into(), a); - //to.render_in(to.area().shrink_y(h).into(), b); - //}, + Self::Null(_) => [0.into(), 0.into(), 0.into(), 0.into()].into(), + Self::N(_, a, b) | Self::S(_, a, b) => { + let a = a.area(outer); + let b = b.area(outer); + [a.x().min(b.x()), a.y().min(b.y()), a.w().max(b.w()), a.h() + b.h()].into() + }, + Self::E(_, a, b) | Self::W(_, a, b) => { + let a = a.area(outer); + let b = b.area(outer); + [a.x().min(b.x()), a.y().min(b.y()), a.w() + b.w(), a.h().max(b.h())].into() + }, + Self::A(a, b) | Self::B(a, b) => { + let a = a.area(outer); + let b = b.area(outer); + [a.x().min(b.x()), a.y().min(b.y()), a.w().max(b.w()), a.h().max(b.h())].into() + } + } + } + fn render (&self, to: &mut E::Output) { + let n = E::Area::zero(); + let area = to.area(); + match self { + Self::S(p, a, b) => { + let s_a = a.area(area); + let _ = b.area(area); + let h = s_a.h().into(); + to.place(to.area().clip_h(h).into(), a); + to.place(to.area().shrink_y(h).push_y(h).into(), b); + }, + Self::E(p, a, b) => { + let s_a = a.area(area); + let _ = b.area(area); + let w = s_a.w().into(); + to.place(to.area().clip_w(w).into(), a); + to.place(to.area().push_x(w).shrink_x(w).into(), b); + }, + Self::W(p, a, b) => { + let s_a = a.area(area); + let _ = b.area(area); + let w = (to.area().w() - s_a.w()).into(); + to.place(to.area().push_x(w).into(), a); + to.place(to.area().shrink_x(w).into(), b); + }, + Self::N(p, a, b) => { + let s_a = a.area(area); + let _ = b.area(area); + let h = to.area().h() - s_a.h(); + to.place(to.area().push_y(h).into(), a); + to.place(to.area().shrink_y(h).into(), b); + }, _ => todo!() } } diff --git a/src/arranger.rs b/src/arranger.rs index 262d9767..d3dd38c7 100644 --- a/src/arranger.rs +++ b/src/arranger.rs @@ -103,10 +103,10 @@ render!(Tui: (self: ArrangerTui) => { let play = PlayPause(self.clock.is_rolling()); let transport = TransportView::new(self, Some(ItemPalette::from(TuiTheme::g(96))), true); let pool_size = if self.phrases.visible { self.splits[1] } else { 0 }; - let with_pool = |x|Split::w(false, pool_size, PoolView(&self.phrases), x); + let with_pool = |x|Bsp::w(Fixed::x(pool_size, PoolView(&self.phrases)), x); let status = ArrangerStatus::from(self); - let with_editbar = |x|Split::n(false, 1, MidiEditStatus(&self.editor), x); - let with_status = |x|Split::n(false, 2, status, x); + let with_editbar = |x|Bsp::n(Fixed::y(1, MidiEditStatus(&self.editor)), x); + let with_status = |x|Bsp::n(Fixed::y(2, status), x); let with_size = |x|lay!(&self.size, x); let arranger = ||{ let color = self.color; diff --git a/src/groovebox.rs b/src/groovebox.rs index 42198f94..904a2b85 100644 --- a/src/groovebox.rs +++ b/src/groovebox.rs @@ -128,29 +128,32 @@ render!(Tui: (self: Groovebox) => { PhraseSelector::play_phrase(&self.player), PhraseSelector::next_phrase(&self.player), ))); - let pool = move|x|Split::w(false, pool_w, - Pull::y(1, Fill::y(Align::e(PoolView(&self.pool)))), + let pool = move|x|Bsp::w( + Fixed::x(pool_w, Pull::y(1, Fill::y(Align::e(PoolView(&self.pool))))), + x); + let sampler = move|x|Bsp::e( + Fixed::x(sampler_w, Fill::xy(col!( + Meters(self.sampler.input_meter.as_ref()), + GrooveboxSamples(self)))), x); - let sampler = move|x|Split::e(false, sampler_w, Fill::xy(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::xy(lay!( - &self.size, - Fill::xy(Align::s(Fixed::y(2, GrooveboxStatus::from(self)))), - Shrink::y(2, col!( - transport, - selector, - status - )) - )) + lay!("kyp", "nymka") + //status + //Fill::xy(lay!( + //&self.size, + //Fill::xy(Align::s(Fixed::y(2, GrooveboxStatus::from(self)))), + //Shrink::y(2, col!( + //transport, + //selector, + //status + //)) + //)) }); struct EditStatus<'a, T: Content>(&'a Sampler, &'a MidiEditor, usize, T); impl<'a, T: Content> Content for EditStatus<'a, T> { fn content (&self) -> impl Content { - Split::n(false, 9, col!( + Bsp::n(Fixed::y(9, col!( row!( self.0.mapped[self.2].as_ref().map(|sample|format!( "Sample {}-{}", @@ -169,7 +172,7 @@ impl<'a, T: Content> Content for EditStatus<'a, T> { SampleViewer(None) })), ), - ), &self.3) + )), &self.3) } } diff --git a/src/sequencer.rs b/src/sequencer.rs index 727ea4bb..8fbe0897 100644 --- a/src/sequencer.rs +++ b/src/sequencer.rs @@ -45,10 +45,10 @@ render!(Tui: (self: SequencerTui) => { let phrase_w = if w > 60 { 20 } else if w > 40 { 15 } else { 10 }; let pool_w = if self.phrases.visible { phrase_w } else { 0 }; let pool = Pull::y(1, Fill::y(Align::e(PoolView(&self.phrases)))); - let with_pool = move|x|Split::w(false, pool_w, pool, x); + let with_pool = move|x|Bsp::w(Fixed::x(pool_w, pool), x); let status = SequencerStatus::from(self); - let with_status = |x|Split::n(false, if self.status { 2 } else { 0 }, status, x); - let with_editbar = |x|Split::n(false, 1, MidiEditStatus(&self.editor), x); + let with_status = |x|Bsp::n(Fixed::x(if self.status { 2 } else { 0 }, status), x); + let with_editbar = |x|Bsp::n(Fixed::x(1, MidiEditStatus(&self.editor)), x); let with_size = |x|lay!(self.size.clone(), x); let editor = with_editbar(with_pool(Fill::xy(&self.editor)));