toggle transport background

This commit is contained in:
🪞👃🪞 2024-12-10 15:31:34 +01:00
parent a91b539cd0
commit 74a07d0e75
3 changed files with 36 additions and 21 deletions

View file

@ -119,7 +119,11 @@ render!(|self: ArrangerTui|{
let arranger_focused = self.arranger_focused(); let arranger_focused = self.arranger_focused();
let border = Lozenge(Style::default().bg(TuiTheme::border_bg()).fg(TuiTheme::border_fg(arranger_focused))); let border = Lozenge(Style::default().bg(TuiTheme::border_bg()).fg(TuiTheme::border_fg(arranger_focused)));
col!([ col!([
TransportView::from(self), TransportView::from((self, if let ArrangerFocus::Transport(_) = self.focus.inner() {
true
} else {
false
})),
col!([ col!([
Tui::fixed_y(self.splits[0], lay!([ Tui::fixed_y(self.splits[0], lay!([
border.wrap(Tui::grow_y(1, Layers::new(move |add|{ border.wrap(Tui::grow_y(1, Layers::new(move |add|{

View file

@ -103,7 +103,11 @@ render!(|self: SequencerTui|{
//col_up!([ //col_up!([
//Tui::max_y(2, SequencerStatusBar::from(self)), //Tui::max_y(2, SequencerStatusBar::from(self)),
col!([ col!([
TransportView::from(self), TransportView::from((self, if let SequencerFocus::Transport(_) = self.focus.inner() {
true
} else {
false
})),
row!([ row!([
Tui::fixed_x(20, col!([ Tui::fixed_x(20, col!([
PhraseSelector::play_phrase( PhraseSelector::play_phrase(

View file

@ -1,6 +1,7 @@
use crate::*; use crate::*;
use crate::api::ClockCommand::{SetBpm, SetQuant, SetSync}; use crate::api::ClockCommand::{Play, Pause, SetBpm, SetQuant, SetSync};
use TransportCommand::{Focus, Clock}; use TransportCommand::{Focus, Clock};
use FocusCommand::{Next, Prev};
use KeyCode::{Enter, Left, Right, Char}; use KeyCode::{Enter, Left, Right, Char};
/// Transport clock app. /// Transport clock app.
@ -54,9 +55,11 @@ impl Audio for TransportTui {
} }
} }
render!(|self: TransportTui|TransportView::from(self)); render!(|self: TransportTui|TransportView::from((self, true)));
pub struct TransportView { pub struct TransportView {
focused: bool,
sr: String, sr: String,
bpm: String, bpm: String,
ppq: String, ppq: String,
@ -70,14 +73,15 @@ pub struct TransportView {
current_second: String, current_second: String,
} }
impl<T: HasClock> From<&T> for TransportView { impl<T: HasClock> From<(&T, bool)> for TransportView {
fn from (state: &T) -> Self { fn from ((state, focused): (&T, bool)) -> Self {
let clock = state.clock(); let clock = state.clock();
let sr = format!("{:.1}k", clock.timebase.sr.get() / 1000.0); let sr = format!("{:.1}k", clock.timebase.sr.get() / 1000.0);
let bpm = format!("{:.3}", clock.timebase.bpm.get()); let bpm = format!("{:.3}", clock.timebase.bpm.get());
let ppq = format!("{:.0}", clock.timebase.ppq.get()); let ppq = format!("{:.0}", clock.timebase.ppq.get());
if let Some(started) = clock.started.read().unwrap().as_ref() { if let Some(started) = clock.started.read().unwrap().as_ref() {
Self { Self {
focused,
sr, sr,
bpm, bpm,
ppq, ppq,
@ -89,6 +93,7 @@ impl<T: HasClock> From<&T> for TransportView {
} }
} else { } else {
Self { Self {
focused,
sr, sr,
bpm, bpm,
ppq, ppq,
@ -113,9 +118,11 @@ render!(|self: TransportField<'a>|{
render!(|self: TransportView|{ render!(|self: TransportView|{
let bg = TuiTheme::border_bg(); let bg = TuiTheme::border_bg();
let border_style = Style::default().bg(bg).fg(TuiTheme::border_fg(false)); let border_style = Style::default().bg(bg).fg(TuiTheme::border_fg(false));
lay!([ lay!(move|add|{
Tui::fill_x(Lozenge(border_style)), if self.focused {
Tui::outset_x(1, row!([ add(&Tui::fill_x(Lozenge(border_style)))?;
}
add(&Tui::outset_x(1, row!([
row!([ row!([
TransportField("SR ", self.sr.as_str()), TransportField("SR ", self.sr.as_str()),
" ", " ",
@ -138,8 +145,8 @@ render!(|self: TransportView|{
add(&col!([Tui::fg(Color::Rgb(255, 128, 0), "⏹ STOPPED "), ""])) add(&col!([Tui::fg(Color::Rgb(255, 128, 0), "⏹ STOPPED "), ""]))
} }
}), }),
])) ])))
]) })
}); });
/// Which item of the transport toolbar is focused /// Which item of the transport toolbar is focused
@ -267,17 +274,17 @@ where
T: TransportControl T: TransportControl
{ {
Some(match input.event() { Some(match input.event() {
key!(Left) => Focus(FocusCommand::Prev), key!(Left) => Focus(Prev),
key!(Right) => Focus(FocusCommand::Next), key!(Right) => Focus(Next),
key!(Char(' ')) => Clock(if state.clock().is_stopped() { key!(Char(' ')) => Clock(if state.clock().is_stopped() {
ClockCommand::Play(None) Play(None)
} else { } else {
ClockCommand::Pause(None) Pause(None)
}), }),
key!(Shift-Char(' ')) => Clock(if state.clock().is_stopped() { key!(Shift-Char(' ')) => Clock(if state.clock().is_stopped() {
ClockCommand::Play(Some(0)) Play(Some(0))
} else { } else {
ClockCommand::Pause(Some(0)) Pause(Some(0))
}), }),
_ => match state.transport_focused().unwrap() { _ => match state.transport_focused().unwrap() {
TransportFocus::Bpm => match input.event() { TransportFocus::Bpm => match input.event() {
@ -311,16 +318,16 @@ where
TransportFocus::PlayPause => match input.event() { TransportFocus::PlayPause => match input.event() {
key!(Enter) => Clock( key!(Enter) => Clock(
if state.clock().is_stopped() { if state.clock().is_stopped() {
ClockCommand::Play(None) Play(None)
} else { } else {
ClockCommand::Pause(None) Pause(None)
} }
), ),
key!(Shift-Enter) => Clock( key!(Shift-Enter) => Clock(
if state.clock().is_stopped() { if state.clock().is_stopped() {
ClockCommand::Play(Some(0)) Play(Some(0))
} else { } else {
ClockCommand::Pause(Some(0)) Pause(Some(0))
} }
), ),
_ => return None, _ => return None,