diff --git a/tek/src/keys_track.edn b/tek/src/keys_track.edn index 2c35664d..37257ab4 100644 --- a/tek/src/keys_track.edn +++ b/tek/src/keys_track.edn @@ -4,6 +4,8 @@ (@d select :track-next :scene) (@down select :track :scene-next) (@s select :track :scene-next) +(@up select :track :scene-last) +(@w select :track :scene-last) (@q track launch :track) (@c track color :track) diff --git a/tek/src/model.rs b/tek/src/model.rs index 16c22771..8affcf3a 100644 --- a/tek/src/model.rs +++ b/tek/src/model.rs @@ -59,9 +59,11 @@ provide_bool!(bool: |self: Tek| {}); provide_num!(isize: |self: Tek| {}); provide_num!(usize: |self: Tek| { ":scene" => self.selected.scene().unwrap_or(0), + ":scene-last" => self.scenes.len(), ":scene-next" => (self.selected.scene().unwrap_or(0) + 1).min(self.scenes.len()), ":scene-prev" => self.selected.scene().unwrap_or(0).saturating_sub(1), ":track" => self.selected.track().unwrap_or(0), + ":track-last" => self.tracks.len(), ":track-next" => (self.selected.track().unwrap_or(0) + 1).min(self.tracks.len()), ":track-prev" => self.selected.track().unwrap_or(0).saturating_sub(1) }); impl Tek { diff --git a/tek/src/view.rs b/tek/src/view.rs index 24893743..63806b46 100644 --- a/tek/src/view.rs +++ b/tek/src/view.rs @@ -217,13 +217,20 @@ impl Tek { ))); let rec = false; let mon = false; - let cells: ThunkBox<_> = per_track!(self.size.w();|self, track, _t|Bsp::s(Tui::bold(true, row!( - Tui::fg_bg(if rec { White } else { track.color.light.rgb }, track.color.dark.rgb, "Recrd"), - Tui::fg_bg(if mon { White } else { track.color.light.rgb }, track.color.dark.rgb, "Monit"), - )), row!( - Tui::fg_bg(if rec { White } else { track.color.light.rgb }, track.color.darker.rgb, "R▞▞▞▞"), - Tui::fg_bg(if mon { White } else { track.color.light.rgb }, track.color.darker.rgb, "M▞▞▞▞"), - ))); + let cells: ThunkBox<_> = per_track!(self.size.w();|self, track, t|{ + let bg = if self.selected().track() == Some(t+1) { track.color.light.rgb } else { track.color.base.rgb }; + let bg2 = if t > 0 { self.tracks()[t - 1].color.base.rgb } else { Reset }; + Bsp::s( + Self::wrap(bg, bg2, fg, Tui::bold(true, row!( + Tui::fg_bg(if rec { White } else { track.color.darkest.rgb }, bg, "Recrd"), + Tui::fg_bg(if mon { White } else { track.color.darkest.rgb }, bg, "Monit"), + ))), + Self::wrap(bg, bg2, fg, row!( + Tui::fg_bg(if rec { White } else { track.color.darkest.rgb }, bg, "P▞▞▞▞"), + Tui::fg_bg(if mon { White } else { track.color.darkest.rgb }, bg, "S▞▞▞▞"), + )) + ) + }); self.view_row(w, h as u16, header, cells) } fn view_outputs (&self) -> impl Content + use<'_> { @@ -242,17 +249,27 @@ impl Tek { Tui::fg_bg(fg, bg, connect.info())))))))); let mute = false; let solo = false; - let cells: ThunkBox<_> = per_track!(self.size.w();|self, track, _t|Bsp::s(Tui::bold(true, row!( - Tui::fg_bg(if mute { White } else { track.color.light.rgb }, track.color.dark.rgb, "Play "), - Tui::fg_bg(if solo { White } else { track.color.light.rgb }, track.color.dark.rgb, "Solo "), - )), row!( - Tui::fg_bg(if mute { White } else { track.color.light.rgb }, track.color.darker.rgb, "P▞▞▞▞"), - Tui::fg_bg(if solo { White } else { track.color.light.rgb }, track.color.darker.rgb, "S▞▞▞▞"), - ))); + let cells: ThunkBox<_> = per_track!(self.size.w();|self, track, t|{ + let bg = if self.selected().track() == Some(t+1) { track.color.light.rgb } else { track.color.base.rgb }; + let bg2 = if t > 0 { self.tracks()[t - 1].color.base.rgb } else { Reset }; + Bsp::s( + Self::wrap(bg, bg2, fg, Tui::bold(true, row!( + Tui::fg_bg(if mute { White } else { track.color.darkest.rgb }, bg, "Play "), + Tui::fg_bg(if solo { White } else { track.color.darkest.rgb }, bg, "Solo "), + ))), + Self::wrap(bg, bg2, fg, row!( + Tui::fg_bg(if mute { White } else { track.color.darkest.rgb }, bg, "P▞▞▞▞"), + Tui::fg_bg(if solo { White } else { track.color.darkest.rgb }, bg, "S▞▞▞▞"), + )) + ) + }); self.view_row(self.w(), h as u16, header, cells) } + fn wrap (bg: Color, bg2: Color, fg: Color, content: impl Content) -> impl Content { + Bsp::e(Tui::fg_bg(bg, bg2, "▐"), Bsp::w(Tui::fg_bg(bg, Reset, "▌"), Tui::fg_bg(fg, bg, content))) + } fn view_tracks (&self) -> impl Content + use<'_> { - let h = 1; + let height = 1; let header: ThunkBox<_> = (move||Tui::bg(Tui::g(32), Fill::x(Align::w(self.view_track_add()))).boxed()).into(); let content: ThunkBox<_> = per_track!(self.size.w();|self, track, t|{ @@ -262,14 +279,10 @@ impl Tek { let bg = if active { track.color.light.rgb } else { track.color.base.rgb }; let bg2 = if t > 0 { self.tracks()[t - 1].color.base.rgb } else { Reset }; let bfg = if active { Rgb(255,255,255) } else { Rgb(0,0,0) }; - Outer(active, Style::default().fg(bfg).bg(bg)).enclose(Bsp::e( - Tui::fg_bg(bg, bg2, "▐"), - Bsp::w( - Tui::fg_bg(bg, Reset, "▌"), - Tui::fg_bg(fg, bg, Tui::bold(true, Fill::x(Align::nw(name)))), - ))) + Outer(active, Style::default().fg(bfg).bg(bg)) + .enclose(Self::wrap(bg, bg2, fg, Tui::bold(true, Fill::x(Align::nw(name))))) }); - self.view_row(self.w(), 1, header, content) + self.view_row(self.w(), height, header, content) } fn view_track_add (&self) -> impl Content + use<'_> { let data = (self.selected.track().unwrap_or(0), self.tracks().len());