diff --git a/crates/tek_core/src/engine/collect.rs b/crates/tek_core/src/engine/collect.rs index f3a6067a..4c95aee7 100644 --- a/crates/tek_core/src/engine/collect.rs +++ b/crates/tek_core/src/engine/collect.rs @@ -13,12 +13,11 @@ impl<'a, E: Engine> Render for Collected<'a, E> { } } } - -impl<'a, E: Engine> Layout for &Collected<'a, E> { +impl<'a, E: Engine> Layout for Collected<'a, E> { fn layout (&self, area: E::Area) -> Perhaps { - match *self { - Collected::Box(inner) => (*inner).layout(area), - Collected::Ref(inner) => (*inner).layout(area), + match self { + Self::Box(inner) => (*inner).layout(area), + Self::Ref(inner) => (*inner).layout(area), } } } diff --git a/crates/tek_core/src/engine/layout.rs b/crates/tek_core/src/engine/layout.rs index 824b138b..39f929a9 100644 --- a/crates/tek_core/src/engine/layout.rs +++ b/crates/tek_core/src/engine/layout.rs @@ -14,6 +14,21 @@ pub fn center_box (area: Rect, w: u16, h: u16) -> Rect { pub trait Layout: Render { fn layout (&self, area: E::Area) -> Perhaps; } + +impl> Layout for &T { + fn layout (&self, area: E::Area) -> Perhaps { + (*self).layout(area) + } +} +impl> Layout for Option { + fn layout (&self, area: E::Area) -> Perhaps { + match self { + Some(layout) => layout.layout(area), + None => Ok(None) + } + } +} + /// Enforce minimum size of drawing area pub enum Min { W(U, L), H(U, L), WH(U, U, L), } /// Enforce maximum size of drawing area diff --git a/crates/tek_core/src/engine/render.rs b/crates/tek_core/src/engine/render.rs index 497ec6cd..4ad9aaff 100644 --- a/crates/tek_core/src/engine/render.rs +++ b/crates/tek_core/src/engine/render.rs @@ -5,6 +5,12 @@ pub trait Render: Send + Sync { fn render (&self, to: &mut E) -> Perhaps; } +impl Render for () { + fn render (&self, to: &mut E) -> Perhaps { + Ok(None) + } +} + /// Options can be rendered optionally. impl Render for Option where R: Render { fn render (&self, to: &mut E) -> Perhaps { diff --git a/crates/tek_core/src/tui.rs b/crates/tek_core/src/tui.rs index 33f8196c..ea41b212 100644 --- a/crates/tek_core/src/tui.rs +++ b/crates/tek_core/src/tui.rs @@ -198,20 +198,6 @@ pub enum TuiEvent { // Jack(JackEvent) } -/// Rendering unit struct to Ratatui returns zero-sized [Area] at render coordinates. -impl Render for () { - fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { - self.layout(to.area()) - } -} - -/// Layout of unit struct in Ratatui is zero-sized [Area] at render coordinates. -impl Layout for () { - fn layout (&self, area: [u16;4]) -> Perhaps<[u16;4]> { - Ok(Some([area.x(), area.y(), 0, 0])) - } -} - impl Area for Rect { fn x (&self) -> u16 { self.x } fn y (&self) -> u16 { self.y } diff --git a/crates/tek_core/src/tui/tui_layout.rs b/crates/tek_core/src/tui/tui_layout.rs index 59606a4a..1612b63a 100644 --- a/crates/tek_core/src/tui/tui_layout.rs +++ b/crates/tek_core/src/tui/tui_layout.rs @@ -1,14 +1,5 @@ use crate::*; -impl> Layout for Option { - fn layout (&self, area: [u16;4]) -> Perhaps<[u16;4]> { - match self { - Some(layout) => layout.layout(area), - None => ().layout(area) - } - } -} - impl<'a> Render for Layers<'a, Tui> { fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { let area = to.area(); diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index 19b3f908..8fcdeee2 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -99,6 +99,11 @@ impl ArrangerViewMode { } } } +impl Layout for Arranger { + fn layout (&self, area: [u16;4]) -> Perhaps<[u16;4]> { + todo!() + } +} /// Render arranger to terminal impl Render for Arranger { fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { diff --git a/crates/tek_sequencer/src/sequencer_view.rs b/crates/tek_sequencer/src/sequencer_view.rs index 669ec239..8fa93404 100644 --- a/crates/tek_sequencer/src/sequencer_view.rs +++ b/crates/tek_sequencer/src/sequencer_view.rs @@ -1,5 +1,10 @@ use crate::*; +impl Layout for Sequencer { + fn layout (&self, area: [u16;4]) -> Perhaps<[u16;4]> { + todo!() + } +} impl<'a> Render for Sequencer { fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { self.horizontal_draw(to)?; diff --git a/crates/tek_sequencer/src/sequencer_view_h.rs b/crates/tek_sequencer/src/sequencer_view_h.rs index 442b3f0b..2126335c 100644 --- a/crates/tek_sequencer/src/sequencer_view_h.rs +++ b/crates/tek_sequencer/src/sequencer_view_h.rs @@ -5,19 +5,16 @@ impl Sequencer { const H_KEYS_OFFSET: usize = 5; pub(crate) fn horizontal_draw <'a> (&self, to: &mut Tui) -> Usually<()> { - let mut area = to.area(); + let area = to.area(); Split::down() .add_ref(&SequenceName(&self)) .add_ref(&SequenceRange) .add_ref(&SequenceLoopRange) .add_ref(&SequenceNoteRange) - .render(to.with_area(area.x(), area.y(), area.h(), 10))?; - area.x = area.x() + 10; - area.width = area.w().saturating_sub(10); - area.height = area.h().min(66); + .render(to.with_area(area.x(), area.y(), 10, area.h()))?; + let area = [area.x() + 10, area.y(), area.w().saturating_sub(10), area.h().min(66)]; Lozenge(Style::default().fg(Nord::BG2)).draw(to.with_rect(area))?; - area.x = area.x() + 1; - area.width = area.w().saturating_sub(1); + let area = [area.x() + 1, area.y(), area.w().saturating_sub(1), area.h()]; Layered::new() .add_ref(&SequenceKeys(&self)) .add_ref(&self.phrase.as_ref().map(|phrase|SequenceTimer(&self, phrase.clone()))) diff --git a/crates/tek_sequencer/src/transport_view.rs b/crates/tek_sequencer/src/transport_view.rs index 8645dc62..896481a2 100644 --- a/crates/tek_sequencer/src/transport_view.rs +++ b/crates/tek_sequencer/src/transport_view.rs @@ -2,22 +2,21 @@ use crate::*; const CORNERS: Corners = Corners(NOT_DIM_GREEN); +impl Layout for TransportToolbar { + fn layout (&self, area: [u16;4]) -> Perhaps<[u16;4]> { + Ok(Some([area.x(), area.y(), area.w(), 2])) + } +} + impl Render for TransportToolbar { fn render (&self, to: &mut Tui) -> Perhaps<[u16;4]> { - let area = to.area(); - let area = [area.x(), area.y(), area.w(), 2]; - let area = Split::right() + Split::right() .add_ref(&self.playing) .add_ref(&self.bpm) .add_ref(&self.quant) .add_ref(&self.sync) .add_ref(&self.clock) - .render(to.with_rect(area))?; - //if self.is_focused() { - //fill_bg(buf, area, COLOR_BG0); - //CORNERS_DIM.draw(buf, area)?; - //} - Ok(area) + .render(to.with_rect(self.layout(to.area())?.unwrap())) } }