diff --git a/crates/tek/src/tui/app_arranger.rs b/crates/tek/src/tui/app_arranger.rs index 61d86e7b..958edcb4 100644 --- a/crates/tek/src/tui/app_arranger.rs +++ b/crates/tek/src/tui/app_arranger.rs @@ -216,6 +216,18 @@ input_to_command!(ArrangerCommand: |state: ArrangerTui, input|{ Selected::Scene(s) => return None, Selected::Clip(t, s) => return None, }, + key_pat!(Char('g')) => match state.selected() { + Selected::Mix => return None, + Selected::Track(t) => return None, + Selected::Scene(s) => return None, + Selected::Clip(t, s) => return None, + }, + key_pat!(Char('p')) => match state.selected() { + Selected::Mix => return None, + Selected::Track(t) => return None, + Selected::Scene(s) => return None, + Selected::Clip(t, s) => return None, + }, // Tab: Toggle visibility of phrase pool column key_pat!(Tab) => ShowPool(!state.show_pool), diff --git a/crates/tek/src/tui/phrase_editor.rs b/crates/tek/src/tui/phrase_editor.rs index d3a001a9..53354dae 100644 --- a/crates/tek/src/tui/phrase_editor.rs +++ b/crates/tek/src/tui/phrase_editor.rs @@ -223,48 +223,3 @@ impl std::fmt::Debug for PhraseEditorModel { .finish() } } - -pub struct PhraseEditStatus<'a>(pub &'a PhraseEditorModel); -render!(|self:PhraseEditStatus<'a>|row!(|add|{ - let (color, name, length, looped) = if let Some(phrase) = self.0.phrase().as_ref().map(|p|p.read().unwrap()) { - (phrase.color, phrase.name.clone(), phrase.length, phrase.looped) - } else { - (ItemPalette::from(TuiTheme::g(64)), String::new(), 0, false) - }; - let bg = color.base.rgb; - let fg = color.lightest.rgb; - let field = move|x, y|row!([ - Tui::fg_bg(color.lightest.rgb, Color::Reset, Tui::bold(true, x)), - Tui::fg_bg(color.lighter.rgb, Color::Reset, Tui::bold(true, "│")), - &y - ]); - add(&Fill::w(Tui::fg_bg(fg, bg, row!(|add|{ - add(&Fixed::wh(26, 3, col!(![ - field(" Edit", format!("{name}")), - field(" Length", format!("{length}")), - field(" Loop", format!("{looped}")), - ])))?; - add(&Fixed::wh(25, 3, col!(![ - field(" Time", format!("{}", - self.0.time_point())), - field(" View", format!("{}-{} ({}*{})", - self.0.time_start().get(), - self.0.time_end(), - self.0.time_axis().get(), - self.0.time_zoom().get())) - ])))?; - add(&Fixed::wh(25, 3, col!(![ - field(" Note", format!("{:4} ({:3}) {:4}", - to_note_name(self.0.note_point()), - self.0.note_point(), - self.0.note_len())), - field(" View", format!("{}-{} ({})", - to_note_name(self.0.note_lo().get()), - to_note_name(self.0.note_hi()), - self.0.note_axis().get())) - ])))?; - add(&Fixed::wh(16, 3, col!(![ - row!(!["TimeLock ", Tui::bold(true, format!("{}", self.0.time_lock().get()))])])))?; - Ok(()) - })))) -})); diff --git a/crates/tek/src/tui/status_bar.rs b/crates/tek/src/tui/status_bar.rs index 903252c2..bb1fcadb 100644 --- a/crates/tek/src/tui/status_bar.rs +++ b/crates/tek/src/tui/status_bar.rs @@ -1,26 +1,33 @@ use crate::*; -pub trait Bar: Render { - type State: Send + Sync; - fn hotkey_fg () -> Color where Self: Sized; - fn update (&mut self, state: &Self::State) where Self: Sized; - fn command (commands: &[[impl Render;3]]) - -> impl Render + '_ - where - Self: Sized - { - let hotkey_fg = Self::hotkey_fg(); - row!([a, b, c] in commands.iter() => { - row!([a, Tui::fg(hotkey_fg, Tui::bold(true, b)), c]) - }) - } - - fn with <'a> (state: &'a Self::State, content: impl Render) -> impl Render - where Self: Sized, &'a Self::State: Into - { - Bsp::n(state.into(), content) - } -} +pub struct PhraseEditStatus<'a>(pub &'a PhraseEditorModel); +render!(|self:PhraseEditStatus<'a>|{ + let (color, name, length, looped) = if let Some(phrase) = self.0.phrase().as_ref().map(|p|p.read().unwrap()) { + (phrase.color, phrase.name.clone(), phrase.length, phrase.looped) + } else { + (ItemPalette::from(TuiTheme::g(64)), String::new(), 0, false) + }; + let bg = color.darkest.rgb; + let fg = color.lightest.rgb; + let field = move|x, y|row!([ + Tui::fg_bg(color.lighter.rgb, color.darker.rgb, Tui::bold(true, x)), + Tui::fg_bg(color.light.rgb, color.darker.rgb, Tui::bold(true, "│")), + Fill::w(Tui::fg_bg(color.lightest.rgb, color.dark.rgb, &y)), + ]); + Fill::w(Tui::fg_bg(fg, bg, row!([ + Fixed::wh(26, 3, col!(![ + field(" Edit", format!("{name}")), + field(" Length", format!("{length}")), + field(" Loop", format!("{looped}"))])), + Fixed::wh(30, 3, col!(![ + field(" Time", format!("{}/{}-{} ({}*{}) {}", + self.0.time_point(), self.0.time_start().get(), self.0.time_end(), + self.0.time_axis().get(), self.0.time_zoom().get(), + if self.0.time_lock().get() { "[lock]" } else { " " })), + field(" Note", format!("{} ({}) {} | {}-{} ({})", + to_note_name(self.0.note_point()), self.0.note_point(), self.0.note_len(), + to_note_name(self.0.note_lo().get()), to_note_name(self.0.note_hi()), + self.0.note_axis().get()))]))])))}); /// Status bar for sequencer app #[derive(Clone)] @@ -60,27 +67,18 @@ impl SequencerStatus { ]); Tui::fg_bg(TuiTheme::g(255), TuiTheme::g(50), row!([ single("SPACE", "play/pause"), - double(("▲▼▶◀", "cursor"), ("C-✣", "scroll"), ), - double(("a", "append"), ("s", "set note"),), - double((",.", "length"), ("<>", "triplet"), ), - double(("[]", "phrase"), ("{}", "order"), ), - double(("q", "enqueue"), ("e", "edit"), ), - double(("c", "color"), ("", ""),), + double(("▲▼▶◀", "cursor"), ("Ctrl", "scroll"), ), + double(("a", "append"), ("s", "set note"),), + double((",.", "length"), ("<>", "triplet"), ), + double(("[]", "phrase"), ("{}", "order"), ), + double(("q", "enqueue"), ("e", "edit"), ), + double(("c", "color"), ("", ""),), ])) } fn stats <'a> (&'a self) -> impl Render + use<'a> { row!([&self.cpu, &self.res, &self.size]) } } -impl Bar for SequencerStatus { - type State = SequencerTui; - fn hotkey_fg () -> Color { - TuiTheme::HOTKEY_FG - } - fn update (&mut self, _: &SequencerTui) { - todo!() - } -} /// Status bar for arranger app #[derive(Clone)] @@ -133,12 +131,3 @@ impl ArrangerStatus { row!([&self.cpu, &self.res, &self.size]) } } -impl Bar for ArrangerStatus { - type State = ArrangerTui; - fn hotkey_fg () -> Color { - TuiTheme::HOTKEY_FG - } - fn update (&mut self, _: &ArrangerTui) { - todo!() - } -}