diff --git a/tek/src/keys_scene.edn b/tek/src/keys_scene.edn index 0f47e75b..5553ae2e 100644 --- a/tek/src/keys_scene.edn +++ b/tek/src/keys_scene.edn @@ -1,6 +1,6 @@ -(@up select 0 :scene-prev) -(@down select 0 :scene-next) -(@right select 1 :scene) +(@up select :track :scene-prev) +(@down select :track :scene-next) +(@right select :track-next :scene) (@q scene launch) (@c scene color) diff --git a/tek/src/keys_track.edn b/tek/src/keys_track.edn index 71436c7c..28cff8d1 100644 --- a/tek/src/keys_track.edn +++ b/tek/src/keys_track.edn @@ -1,6 +1,6 @@ -(@left select :track-prev 0) -(@right select :track-next 0) -(@down select :track down) +(@left select :track-prev :scene) +(@right select :track-next :scene) +(@down select :track :scene-next) (@q track launch) (@c track color) diff --git a/tek/src/lib.rs b/tek/src/lib.rs index 164bad0c..0b614172 100644 --- a/tek/src/lib.rs +++ b/tek/src/lib.rs @@ -160,12 +160,12 @@ has_editor!(|self: Tek|{ is_editing = self.editing.load(Relaxed); }); edn_provide!(# usize: |self: Tek| { - ":scene" => 0, - ":scene-next" => 0, - ":scene-prev" => 0, - ":track" => 0, - ":track-next" => 0, - ":track-prev" => 0, + ":scene" => self.selected.scene().unwrap_or(0), + ":scene-next" => self.selected.scene().unwrap_or(0) + 1, + ":scene-prev" => self.selected.scene().unwrap_or(0).saturating_sub(1), + ":track" => self.selected.track().unwrap_or(0), + ":track-next" => self.selected.track().unwrap_or(0) + 1, + ":track-prev" => self.selected.track().unwrap_or(0).saturating_sub(1), }); edn_view!(TuiOut: |self: Tek| self.size.of(EdnView::from_source(self, self.edn.as_ref())); { bool {}; @@ -273,11 +273,6 @@ impl Tek { // TODO: enable sync master/follow //let sync_clock = |jack: &Arc>, app|{ //if cli.sync_lead { - //jack.read().unwrap().client().register_timebase_callback(false, |mut state|{ - //app.clock().playhead.update_from_sample(state.position.frame() as f64); - //state.position.bbt = Some(app.clock().bbt()); - //state.position - //}) //} else if cli.sync_follow { //jack.read().unwrap().client().register_timebase_callback(false, |state|{ //app.clock().playhead.update_from_sample(state.position.frame() as f64); @@ -295,6 +290,20 @@ impl Tek { ..Default::default() }) } + fn sync_lead (&self, enable: bool) -> Usually<()> { + if enable { + self.jack.read().unwrap().client().register_timebase_callback(false, |mut state|{ + let clock = self.clock(); + clock.playhead.update_from_sample(state.position.frame() as f64); + state.position.bbt = Some(clock.bbt()); + state.position + })?; + } + Ok(()) + } + fn sync_follow (&self) { + // TODO + } fn compact (&self) -> bool { self.compact } fn is_editing (&self) -> bool { self.editing.load(Relaxed) } fn editor (&self) -> impl Content + '_ { &self.editor } @@ -412,16 +421,6 @@ impl Tek { clip.write().unwrap().toggle_loop() } } - //fn randomize_color (&mut self) { - //match self.selected { - //Selection::Mix => { self.color = ItemPalette::random() }, - //Selection::Track(t) => { self.tracks[t].color = ItemPalette::random() }, - //Selection::Scene(s) => { self.scenes[s].color = ItemPalette::random() }, - //Selection::Clip(t, s) => if let Some(clip) = &self.scenes[s].clips[t] { - //clip.write().unwrap().color = ItemPalette::random(); - //} - //} - //} fn track_add ( &mut self, name: Option<&str>, @@ -620,9 +619,9 @@ edn_command!(TekCommand: |app: Tek| { ("enqueue" [c: Arc>] Self::Enqueue(c)) ("select" [t: usize, s: usize] match (t.expect("no track"), s.expect("no scene")) { (0, 0) => Self::Select(Selection::Mix), - (t, 0) => Self::Select(Selection::Track(t - 1)), - (0, s) => Self::Select(Selection::Scene(s - 1)), - (t, s) => Self::Select(Selection::Clip(t - 1, s - 1)), + (t, 0) => Self::Select(Selection::Track(t)), + (0, s) => Self::Select(Selection::Scene(s)), + (t, s) => Self::Select(Selection::Clip(t, s)), }) ("clip" [a, ..b] Self::Clip(ClipCommand::from_edn(app, &a.to_ref(), b) @@ -739,7 +738,7 @@ impl HasSelection for Tek { fn selected (&self) -> &Selection { &self.selected } fn selected_mut (&mut self) -> &mut Selection { &mut self.selected } } -pub trait HasSelection { +trait HasSelection { fn selected (&self) -> &Selection; fn selected_mut (&mut self) -> &mut Selection; } @@ -801,7 +800,7 @@ impl HasTracks for Tek { fn tracks (&self) -> &Vec { &self.tracks } fn tracks_mut (&mut self) -> &mut Vec { &mut self.tracks } } -pub trait HasTracks: HasSelection + HasClock + HasJack + HasEditor + Send + Sync { +trait HasTracks: HasSelection + HasClock + HasJack + HasEditor + Send + Sync { fn midi_ins (&self) -> &Vec>; fn midi_outs (&self) -> &Vec>; fn tracks (&self) -> &Vec; @@ -990,7 +989,7 @@ impl HasScenes for Tek { fn scenes (&self) -> &Vec { &self.scenes } fn scenes_mut (&mut self) -> &mut Vec { &mut self.scenes } } -pub trait HasScenes: HasSelection + HasEditor + Send + Sync { +trait HasScenes: HasSelection + HasEditor + Send + Sync { fn scenes (&self) -> &Vec; fn scenes_mut (&mut self) -> &mut Vec; fn scene_longest (&self) -> usize {