From f7d9d2e107b4e56b236de8f38c0feb24d8393b6e Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 11 Jan 2025 14:25:51 +0100 Subject: [PATCH] edn arranger --- tek/src/arranger.edn | 3 +++ tek/src/arranger.rs | 48 +++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 21 deletions(-) create mode 100644 tek/src/arranger.edn diff --git a/tek/src/arranger.edn b/tek/src/arranger.edn new file mode 100644 index 00000000..3cf6b1c3 --- /dev/null +++ b/tek/src/arranger.edn @@ -0,0 +1,3 @@ +(bsp/s :toolbar + (fill/x (align/c (bsp/w :pool + (bsp/n :inputs (bsp/s :outputs (bsp/s :tracks :scenes))))))) diff --git a/tek/src/arranger.rs b/tek/src/arranger.rs index 099c6370..781615dd 100644 --- a/tek/src/arranger.rs +++ b/tek/src/arranger.rs @@ -27,35 +27,41 @@ pub struct Arranger { } pub(crate) const HEADER_H: u16 = 0; // 5 pub(crate) const SCENES_W_OFFSET: u16 = 0; -render!(TuiOut: (self: Arranger) => { - let scenes_w = self.sidebar_w(); - let tracks_w = self.tracks_with_sizes().last().unwrap().3 as u16; - let h = self.size.h() as u16; - let ins = 1 + self.midi_ins[0].connect.len() as u16; - let outs = 1 + self.midi_outs[0].connect.len() as u16; - let toolbar = |x|Bsp::s(self.toolbar_view(), x); - let pool = |x|Bsp::w(self.pool_view(), x); - let editing = |x|Bsp::n(Bsp::e(self.editor.clip_status(), self.editor.edit_status()), x); - let playing = |x|x;//Bsp::s(self.play_row(tracks_w), Fill::y(x)); - let next = |x|x;//Bsp::s(self.next_row(tracks_w), Fill::y(x)); - let tracks = |x|Bsp::s(self.track_row(tracks_w), Fill::y(Align::c(x))); - let outputs = |x|Bsp::s(self.output_row(tracks_w), Fill::y(x)); - let scenes = |x|Bsp::s(self.scene_row(tracks_w), x); - let inputs = |x|Bsp::n(self.input_row(tracks_w), Fill::y(x)); - self.size.of(toolbar(Fill::xy(Align::c( - editing(pool(inputs(outputs(playing(next(tracks(scenes(Fill::xy(""))))))))) - )))) -}); +render!(TuiOut: (self: Arranger) => self.size.of(EdnView::from_source(self, Self::EDN))); +impl EdnViewData for &Arranger { + fn get_content <'a> (&'a self, item: EdnItem<&'a str>) -> RenderBox<'a, TuiOut> { + use EdnItem::*; + let scenes_w = self.sidebar_w(); + let tracks_w = self.tracks_with_sizes().last().unwrap().3 as u16; + match item { + Nil => Box::new(()), + Exp(items) => Box::new(EdnView::from_items(*self, items.as_slice())), + Sym(":editor") => (&self.editor).boxed(), + Sym(":pool") => self.pool().boxed(), + Sym(":status") => self.status().boxed(), + Sym(":toolbar") => self.toolbar().boxed(), + Sym(":tracks") => self.track_row(tracks_w).boxed(), + Sym(":scenes") => self.scene_row(tracks_w).boxed(), + Sym(":inputs") => self.input_row(tracks_w).boxed(), + Sym(":outputs") => self.output_row(tracks_w).boxed(), + _ => panic!("no content for {item:?}") + } + } +} impl Arranger { + const EDN: &'static str = include_str!("arranger.edn"); pub const LEFT_SEP: char = '▎'; pub const TRACK_MIN_WIDTH: usize = 4; - fn toolbar_view (&self) -> impl Content + use<'_> { + fn toolbar (&self) -> impl Content + use<'_> { Fill::x(Fixed::y(2, Align::x(TransportView::new(true, &self.clock)))) } - fn pool_view (&self) -> impl Content + use<'_> { + fn pool (&self) -> impl Content + use<'_> { Align::e(Fixed::x(self.sidebar_w(), PoolView(self.compact, &self.pool))) } + fn status (&self) -> impl Content + use<'_> { + Bsp::e(self.editor.clip_status(), self.editor.edit_status()) + } fn is_editing (&self) -> bool { !self.pool.visible }