From aaedede796db153c3d5375631ebe72590357907c Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 12 Sep 2024 15:58:43 +0300 Subject: [PATCH] delegate more control to transport items --- crates/tek_sequencer/src/transport.rs | 126 +++++++++++++++----------- crates/tek_test/src/main.rs | 14 +-- 2 files changed, 81 insertions(+), 59 deletions(-) diff --git a/crates/tek_sequencer/src/transport.rs b/crates/tek_sequencer/src/transport.rs index 15c8d2a4..139d176b 100644 --- a/crates/tek_sequencer/src/transport.rs +++ b/crates/tek_sequencer/src/transport.rs @@ -32,6 +32,7 @@ impl TransportToolbar { Client::new("tek_transport", ClientOptions::NO_START_SERVER)?.0 ); transport.transport = Some(jack.transport()); + transport.playing.transport = Some(jack.transport()); let transport = Arc::new(RwLock::new(transport)); transport.write().unwrap().jack = Some( jack.activate( @@ -51,8 +52,9 @@ impl TransportToolbar { playing: TransportPlayPauseButton { _engine: Default::default(), - value: Some(TransportState::Stopped), - focused: true + transport: None, + value: Some(TransportState::Stopped), + focused: true }, bpm: TransportBPM { _engine: Default::default(), @@ -86,18 +88,7 @@ impl TransportToolbar { } } pub fn toggle_play (&mut self) -> Usually<()> { - let transport = self.transport.as_ref().unwrap(); - self.playing.value = match self.playing.value.expect("1st frame has not been processed yet") { - TransportState::Stopped => { - transport.start()?; - Some(TransportState::Starting) - }, - _ => { - transport.stop()?; - transport.locate(0)?; - Some(TransportState::Stopped) - }, - }; + self.playing.toggle(); Ok(()) } pub fn update (&mut self, scope: &ProcessScope) -> (bool, usize, usize, usize, usize, f64) { @@ -148,6 +139,12 @@ impl TransportToolbar { pub fn usecs (&self) -> usize { self.timebase.frame_to_usec(self.clock.frame as f64) as usize } + pub fn quant (&self) -> usize { + self.quant.value + } + pub fn sync (&self) -> usize { + self.sync.value + } } impl Focus<5, Tui> for TransportToolbar { fn focus (&self) -> usize { @@ -222,8 +219,26 @@ impl Content for TransportToolbar { pub struct TransportPlayPauseButton { pub _engine: PhantomData, - pub value: Option, - pub focused: bool + pub transport: Option, + pub value: Option, + pub focused: bool +} +impl TransportPlayPauseButton { + fn toggle (&mut self) -> Usually<()> { + let transport = self.transport.as_ref().unwrap(); + self.value = match self.value.expect("1st frame has not been processed yet") { + TransportState::Stopped => { + transport.start()?; + Some(TransportState::Starting) + }, + _ => { + transport.stop()?; + transport.locate(0)?; + Some(TransportState::Stopped) + }, + }; + Ok(()) + } } impl Focusable for TransportPlayPauseButton { fn is_focused (&self) -> bool { @@ -233,6 +248,34 @@ impl Focusable for TransportPlayPauseButton { self.focused = focused } } +impl Handle for TransportPlayPauseButton { + fn handle (&mut self, from: &Tui) -> Perhaps { + match from.event() { + key!(KeyCode::Enter) => self.toggle().map(|_|Some(true)), + _ => Ok(None) + } + } +} +impl Content for TransportPlayPauseButton { + type Engine = Tui; + fn content (&self) -> impl Widget { + Layers::new(|add|{ + //add(&self.focused.then_some(CORNERS))?; + add(&Styled(match self.value { + Some(TransportState::Stopped) => Some(GRAY_DIM.bold()), + Some(TransportState::Starting) => Some(GRAY_NOT_DIM_BOLD), + Some(TransportState::Rolling) => Some(WHITE_NOT_DIM_BOLD), + _ => unreachable!(), + }, match self.value { + Some(TransportState::Rolling) => "▶ PLAYING", + Some(TransportState::Starting) => "READY ...", + Some(TransportState::Stopped) => "⏹ STOPPED", + _ => unreachable!(), + }))?; + Ok(()) + }) + } +} /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -253,11 +296,19 @@ impl Handle for TransportBPM { fn handle (&mut self, from: &Tui) -> Perhaps { match from.event() { key!(KeyCode::Char(',')) => { - self.bpm().fetch_sub(1.0, Ordering::Relaxed); + self.value += 1.0; Ok(Some(true)) }, key!(KeyCode::Char('.')) => { - self.bpm().fetch_add(1.0, Ordering::Relaxed); + self.value -= 1.0; + Ok(Some(true)) + }, + key!(KeyCode::Char('<')) => { + self.value += 0.001; + Ok(Some(true)) + }, + key!(KeyCode::Char('>')) => { + self.value -= 0.001; Ok(Some(true)) }, _ => Ok(None) @@ -307,11 +358,11 @@ impl Handle for TransportQuantize { fn handle (&mut self, from: &Tui) -> Perhaps { match from.event() { key!(KeyCode::Char(',')) => { - transport.quant.value = prev_note_length(transport.quant); + self.value = prev_note_length(self.value); Ok(Some(true)) }, key!(KeyCode::Char('.')) => { - transport.quant.value = next_note_length(transport.quant); + self.value = next_note_length(self.value); Ok(Some(true)) }, _ => Ok(None) @@ -360,11 +411,11 @@ impl Handle for TransportSync { fn handle (&mut self, from: &Tui) -> Perhaps { match from.event() { key!(KeyCode::Char(',')) => { - transport.sync.value = prev_note_length(transport.quant); + self.value = prev_note_length(self.value); Ok(Some(true)) }, key!(KeyCode::Char('.')) => { - transport.sync.value = next_note_length(transport.quant); + self.value = next_note_length(self.value); Ok(Some(true)) }, _ => Ok(None) @@ -444,34 +495,3 @@ impl Widget for TransportClock { Ok(Some(area)) } } -impl Handle for TransportPlayPauseButton { - fn handle (&mut self, from: &Tui) -> Perhaps { - match from.event() { - key!(KeyCode::Enter) => { - self.toggle(); - Ok(Some(true)) - } - _ => Ok(None) - } - } -} -impl Content for TransportPlayPauseButton { - type Engine = Tui; - fn content (&self) -> impl Widget { - Layers::new(|add|{ - //add(&self.focused.then_some(CORNERS))?; - add(&Styled(match self.value { - Some(TransportState::Stopped) => Some(GRAY_DIM.bold()), - Some(TransportState::Starting) => Some(GRAY_NOT_DIM_BOLD), - Some(TransportState::Rolling) => Some(WHITE_NOT_DIM_BOLD), - _ => unreachable!(), - }, match self.value { - Some(TransportState::Rolling) => "▶ PLAYING", - Some(TransportState::Starting) => "READY ...", - Some(TransportState::Stopped) => "⏹ STOPPED", - _ => unreachable!(), - }))?; - Ok(()) - }) - } -} diff --git a/crates/tek_test/src/main.rs b/crates/tek_test/src/main.rs index da9bf25f..ea320088 100644 --- a/crates/tek_test/src/main.rs +++ b/crates/tek_test/src/main.rs @@ -17,14 +17,16 @@ impl Demo { index: 0, items: vec![ Box::new(tek_sequencer::TransportPlayPauseButton { - _engine: Default::default(), - value: Some(TransportState::Stopped), - focused: true + _engine: Default::default(), + transport: None, + value: Some(TransportState::Stopped), + focused: true }), Box::new(tek_sequencer::TransportPlayPauseButton { - _engine: Default::default(), - value: Some(TransportState::Rolling), - focused: false + _engine: Default::default(), + transport: None, + value: Some(TransportState::Rolling), + focused: false }), ] }