diff --git a/crates/app/tek_data.rs b/crates/app/tek_data.rs index 2b27fbb8..2fce4b9c 100644 --- a/crates/app/tek_data.rs +++ b/crates/app/tek_data.rs @@ -3,7 +3,7 @@ use crate::*; impl<'t> DslNs<'t, Arc> for App { dsl_exprs!(|app| -> Arc {}); dsl_words!(|app| -> Arc {}); - fn from_literal (&self, dsl: &D) -> Perhaps> { + fn from_literal (&self, dsl: impl Dsl) -> Perhaps> { Ok(dsl.src()?.map(|x|x.into())) } } diff --git a/crates/app/tek_view.rs b/crates/app/tek_view.rs index 880bdf6f..75af9e5f 100644 --- a/crates/app/tek_view.rs +++ b/crates/app/tek_view.rs @@ -2,19 +2,15 @@ use crate::*; impl Content for App { fn content (&self) -> impl Render + '_ { - Stack::above(move|add|for dsl in self.mode.view.iter() { - add(&Fill::xy(self.view(dsl.as_ref()))); - }) + let mode = self.mode.clone(); + Stack::above(move|add|for dsl in mode.view.iter() { add(&self.view(dsl)) }) } } impl App { - fn view <'t, D: Dsl> (&'t self, index: D) -> TuiBox<'t> { - match index.src() { - Ok(Some(src)) => render_dsl(self, src), - Ok(None) => Box::new(Tui::fg(Color::Rgb(192, 192, 192), "empty view")), - Err(e) => Box::new(format!("{e}")), - } + fn view <'t> (&'t self, dsl: impl Dsl) -> impl Render + 't { + let view: TuiBox<'t> = self.from(dsl).unwrap().unwrap(); + view } pub fn update_clock (&self) { ViewCache::update_clock(&self.project.clock.view_cache, self.clock(), self.size.w() > 80) @@ -23,28 +19,22 @@ impl App { type TuiBox<'t> = Box + 't>; -fn render_dsl <'t> ( - state: &'t impl DslNs<'t, TuiBox<'t>>, - src: &str -) -> TuiBox<'t> { - let err: Option> = match state.from(&src) { - Ok(Some(value)) => return value, Ok(None) => None, Err(e) => Some(e), - }; +fn render_error (err: impl Error, src: &str) -> impl Render { let (fg_1, bg_1) = (Color::Rgb(240, 160, 100), Color::Rgb(48, 0, 0)); let (fg_2, bg_2) = (Color::Rgb(250, 200, 180), Color::Rgb(48, 0, 0)); let (fg_3, bg_3) = (Color::Rgb(250, 200, 120), Color::Rgb(0, 0, 0)); let bg = Color::Rgb(24, 0, 0); - Box::new(col! { + col! { Tui::fg(bg, Fixed::y(1, Fill::x(RepeatH("▄")))), Tui::bg(bg, col! { Fill::x(Bsp::e( Tui::bold(true, Tui::fg_bg(fg_1, bg_1, " Render error: ")), - Tui::fg_bg(fg_2, bg_2, err.map(|e|format!(" {e} "))), + Tui::fg_bg(fg_2, bg_2, format!(" {err} ")), )), Fill::x(Align::x(Tui::fg_bg(fg_3, bg_3, format!(" {src} ")))), }), Tui::fg(bg, Fixed::y(1, Fill::x(RepeatH("▀")))), - }) + } } impl<'t> DslNs<'t, TuiBox<'t>> for App { @@ -169,7 +159,7 @@ impl<'t> DslNs<'t, TuiBox<'t>> for App { Fill::x(Tui::bg(bg, Bsp::e(lb, Bsp::w(rb, "FIXME device name")))) }))) }, }); /// Resolve an expression if known. - fn from_expr (&self, dsl: &D) -> Perhaps> { + fn from_expr (&self, dsl: impl Dsl) -> Perhaps> { if let Some(head) = dsl.expr().head()? { for (key, value) in Self::EXPRS.0.iter() { if head == *key { @@ -180,13 +170,13 @@ impl<'t> DslNs<'t, TuiBox<'t>> for App { return Ok(None) } /// Resolve a symbol if known. - fn from_word (&self, dsl: &D) -> Perhaps> { + fn from_word (&self, dsl: impl Dsl) -> Perhaps> { if let Some(dsl) = dsl.word()? { let views = self.config.views.read().unwrap(); if let Some(view) = views.get(dsl) { let view = view.clone(); std::mem::drop(views); - return Ok(Some(render_dsl(self, view.as_ref()))) + return Ok(Some(self.view(view.as_ref()))) } for (word, get) in Self::WORDS.0 { if dsl == *word { diff --git a/crates/device/src/arranger/arranger_view.rs b/crates/device/src/arranger/arranger_view.rs index 3daf8ed0..826b6ce0 100644 --- a/crates/device/src/arranger/arranger_view.rs +++ b/crates/device/src/arranger/arranger_view.rs @@ -1,33 +1,31 @@ use crate::*; +type Add<'a> = &'a dyn FnMut(&dyn Render); + impl Arrangement { - pub fn view_inputs <'a> (&'a self, _theme: ItemTheme) -> impl Content + 'a { + pub fn view_inputs (&self, _theme: ItemTheme) -> impl Content + '_ { Stack::south(move|add|{ add(&Fixed::y(1, Bsp::e(Fixed::x(20, Align::w(button_3("i", "nput ", format!("{}", self.midi_ins.len()), false))), Bsp::w(Fixed::x(4, button_2("I", "+", false)), - Stack::east(move|add|{ - for (_index, track, _x1, _x2) in self.tracks_with_sizes() { - add(&Tui::bg(track.color.dark.rgb, Align::w(Fixed::x(track.width as u16, row!( - Either(track.sequencer.monitoring, Tui::fg(Green, "mon "), "mon "), - Either(track.sequencer.recording, Tui::fg(Red, "rec "), "rec "), - Either(track.sequencer.overdub, Tui::fg(Yellow, "dub "), "dub "), - ))))) - } + Stack::east(move|add|for (_index, track, _x1, _x2) in self.tracks_with_sizes() { + add(&Tui::bg(track.color.dark.rgb, Align::w(Fixed::x(track.width as u16, row!( + Either(track.sequencer.monitoring, Tui::fg(Green, "mon "), "mon "), + Either(track.sequencer.recording, Tui::fg(Red, "rec "), "rec "), + Either(track.sequencer.overdub, Tui::fg(Yellow, "dub "), "dub "), + ))))) }))))); for (_index, port) in self.midi_ins().iter().enumerate() { add(&Fixed::y(1, Bsp::e( Fixed::x(20, Align::w(Bsp::e(" ● ", Tui::bold(true, Tui::fg(Rgb(255,255,255), port.port_name()))))), Bsp::w(Fixed::x(4, ()), - Stack::east(move|add|{ - for (_index, track, _x1, _x2) in self.tracks_with_sizes() { - add(&Tui::bg(track.color.darker.rgb, Align::w(Fixed::x(track.width as u16, row!( - Either(track.sequencer.monitoring, Tui::fg(Green, " ● "), " · "), - Either(track.sequencer.recording, Tui::fg(Red, " ● "), " · "), - Either(track.sequencer.overdub, Tui::fg(Yellow, " ● "), " · "), - ))))) - } + Stack::east(move|add|for (_index, track, _x1, _x2) in self.tracks_with_sizes() { + add(&Tui::bg(track.color.darker.rgb, Align::w(Fixed::x(track.width as u16, row!( + Either(track.sequencer.monitoring, Tui::fg(Green, " ● "), " · "), + Either(track.sequencer.recording, Tui::fg(Red, " ● "), " · "), + Either(track.sequencer.overdub, Tui::fg(Yellow, " ● "), " · "), + ))))) }))))); } }) diff --git a/deps/tengri b/deps/tengri index b98fccd9..ad2d7c38 160000 --- a/deps/tengri +++ b/deps/tengri @@ -1 +1 @@ -Subproject commit b98fccd98ba13be8eabe29d66621a15d025b2042 +Subproject commit ad2d7c38b12067de84463d87849e1a35614d5425