diff --git a/crates/tek/src/tui/app_sequencer.rs b/crates/tek/src/tui/app_sequencer.rs index 5b692cbb..70df0ecc 100644 --- a/crates/tek/src/tui/app_sequencer.rs +++ b/crates/tek/src/tui/app_sequencer.rs @@ -99,34 +99,33 @@ impl Audio for SequencerTui { } } -render!(|self: SequencerTui|{ - //col_up!([ - //Tui::max_y(2, SequencerStatusBar::from(self)), - col!([ - TransportView::from((self, if let SequencerFocus::Transport(_) = self.focus.inner() { - true - } else { - false - })), - row!([ - Tui::fixed_x(20, col!([ - PhraseSelector::play_phrase( - &self.player, - self.focused() == SequencerFocus::PhrasePlay, - self.entered() - ), - PhraseSelector::next_phrase( - &self.player, - self.focused() == SequencerFocus::PhraseNext, - self.entered() - ), - PhraseListView::from(self) - ])), - PhraseView::from(self) - ]) +render!(|self: SequencerTui|lay!([ + self.size, + col!([ + TransportView::from((self, if let SequencerFocus::Transport(_) = self.focus.inner() { + true + } else { + false + })), + row!([ + Tui::fixed_x(20, col!([ + PhraseSelector::play_phrase( + &self.player, + self.focused() == SequencerFocus::PhrasePlay, + self.entered() + ), + PhraseSelector::next_phrase( + &self.player, + self.focused() == SequencerFocus::PhraseNext, + self.entered() + ), + PhraseListView::from(self) + ])), + PhraseView::from(self) ]) - //]) -}); + ]), + Tui::fill_xy(Tui::at_s(SequencerStatusBar::from(self))), +])); impl HasClock for SequencerTui { fn clock (&self) -> &ClockModel { @@ -308,21 +307,17 @@ impl From<&SequencerTui> for SequencerStatusBar { } render!(|self: SequencerStatusBar|{ - lay!(|add|if self.width > 60 { add(&row!(![ SequencerMode::from(self), SequencerStats::from(self), ])) - } else if self.width > 0 { + } else { add(&col!(![ SequencerMode::from(self), SequencerStats::from(self), ])) - } else { - Ok(()) }) - }); struct SequencerMode { @@ -339,14 +334,15 @@ impl From<&SequencerStatusBar> for SequencerMode { } render!(|self:SequencerMode|{ let orange = Color::Rgb(255,128,0); - let light = Color::Rgb(100,100,100); + let light = Color::Rgb(50,50,50); + let white = Color::Rgb(255,255,255); let yellow = Color::Rgb(255,255,0); let black = Color::Rgb(0,0,0); row!([ Tui::bg(orange, Tui::fg(black, Tui::bold(true, self.mode))), - Tui::bg(light, row!((prefix, hotkey, suffix) in self.help.iter() => { + Tui::bg(light, Tui::fg(white, row!((prefix, hotkey, suffix) in self.help.iter() => { row!([" ", prefix, Tui::fg(yellow, *hotkey), suffix]) - })) + }))) ]) }); @@ -366,7 +362,7 @@ impl<'a> From<&'a SequencerStatusBar> for SequencerStats<'a> { } render!(|self:SequencerStats<'a>|{ let orange = Color::Rgb(255,128,0); - let dark = Color::Rgb(100,100,100); + let dark = Color::Rgb(25,25,25); let cpu = &self.cpu; let res = &self.res; let size = &self.size; diff --git a/crates/tek/src/tui/app_transport.rs b/crates/tek/src/tui/app_transport.rs index cc6b2978..5cae58a5 100644 --- a/crates/tek/src/tui/app_transport.rs +++ b/crates/tek/src/tui/app_transport.rs @@ -123,7 +123,11 @@ render!(|self: TransportView|{ if self.focused { add(&Tui::fill_x(Lozenge(border_style)))?; } - add(&Tui::outset_x(2, row!([ + add(&Tui::outset_x(1, row!([ + TransportField("Beat", "00X+0/0B+00/00P"), + " ", + TransportField("BPM ", self.bpm.as_str()), + " ", col!(|add|{ if self.started { add(&col!([Tui::fg(Color::Rgb(0, 255, 0), "▶ PLAYING "), ""])) @@ -132,17 +136,11 @@ render!(|self: TransportView|{ } }), " ", - row!([ - TransportField("Beat", "00X+0/0B+00/00P"), - " ", - TransportField("BPM ", self.bpm.as_str()), - " ", - TransportField("Second", self.current_second.as_str()), - " ", - TransportField("SR ", self.sr.as_str()), - " ", - TransportField("Sample", self.current_sample.as_str()), - ]), + TransportField("Second", self.current_second.as_str()), + " ", + TransportField("SR ", self.sr.as_str()), + " ", + TransportField("Sample", self.current_sample.as_str()), ]))) }) }); diff --git a/crates/tek/src/tui/phrase_editor.rs b/crates/tek/src/tui/phrase_editor.rs index 0a2c75ae..2fb5d888 100644 --- a/crates/tek/src/tui/phrase_editor.rs +++ b/crates/tek/src/tui/phrase_editor.rs @@ -206,18 +206,20 @@ render!(|self: PhraseView<'a>|{ phrase, view_mode, buffer, note_point, note_len, note_range: (note_lo, note_hi), - note_names: (note_lo_name, note_hi_name), time_start, time_point, //now: _, .. } = self; lay!([ lay!(move|add|{ + if *focused { + add(&Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(TuiTheme::border_fg(true))))?; + } let title_color = if *focused{Color::Rgb(150, 160, 90)}else{Color::Rgb(120, 130, 100)}; - let upper_left = format!("╭{note_hi} {note_hi_name} {}", + let upper_left = format!("{}", phrase.as_ref().map(|p|p.read().unwrap().name.clone()).unwrap_or(String::new()) ); - let lower_left = format!("╰{note_lo} {note_lo_name}"); + let lower_left = format!(""); let mut lower_right = format!(" {} ", size.format()); if *focused && *entered { lower_right = format!("Note: {} ({}) {} {lower_right}", @@ -236,7 +238,11 @@ render!(|self: PhraseView<'a>|{ add(&Tui::fill_xy(Tui::at_se(Tui::pull_x(1, Tui::fg(title_color, lower_right)))))?; Ok(()) }), - Tui::bg(Color::Rgb(40, 50, 30), Tui::fill_x(row!([ + Tui::bg(if self.focused { + TuiTheme::bg() + } else { + Color::Reset + }, Tui::fill_x(row!([ Tui::push_y(1, Tui::fill_y(Widget::new(|to:[u16;2]|Ok(Some(to.clip_w(5))), move|to: &mut TuiOutput|{ Ok(if to.area().h() >= 2 { view_mode.render_keys(to, *note_hi, *note_lo) }) }))), diff --git a/crates/tek/src/tui/phrase_list.rs b/crates/tek/src/tui/phrase_list.rs index 2a89c9f1..a9ecaeea 100644 --- a/crates/tek/src/tui/phrase_list.rs +++ b/crates/tek/src/tui/phrase_list.rs @@ -109,7 +109,7 @@ pub struct PhraseListView<'a> { impl<'a, T: HasPhraseList> From<&'a T> for PhraseListView<'a> { fn from (state: &'a T) -> Self { Self { - title: "Phrases", + title: "Pool:", focused: state.phrases_focused(), entered: state.phrases_entered(), phrases: state.phrases(), @@ -122,15 +122,16 @@ impl<'a, T: HasPhraseList> From<&'a T> for PhraseListView<'a> { // TODO: Display phrases always in order of appearance render!(|self: PhraseListView<'a>|{ let Self { title, focused, entered, phrases, index, mode } = self; - let border_color = if *focused {Color::Rgb(100, 110, 40)} else {Color::Rgb(70, 80, 50)}; + let border_bg = if *entered {Color::Rgb(40, 50, 30)} else {TuiTheme::bg()}; + let border_color = if *entered {Color::Rgb(100, 110, 40)} else {Color::Rgb(70, 80, 50)}; let title_color = if *focused {Color::Rgb(150, 160, 90)} else {Color::Rgb(120, 130, 100)}; - let upper_left = format!("[{}] {title}", if *entered {"■"} else {" "}); + let upper_left = format!("{title}"); let upper_right = format!("({})", phrases.len()); lay!(move|add|{ if *focused { - add(&Lozenge(Style::default().bg(Color::Rgb(40, 50, 30)).fg(border_color)))?; + add(&Lozenge(Style::default().bg(border_bg).fg(border_color)))?; } - add(&Tui::inset_xy(1, 1, Tui::fill_xy(col!(move|add|match mode { + add(&Tui::inset_xy(0, 1, Tui::fill_xy(col!(move|add|match mode { Some(PhrasesMode::Import(_, ref browser)) => { add(browser) },