From 654aa0f041c7c546b66b6b3dadb4f824ebd5894a Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 22 Aug 2024 05:14:34 +0300 Subject: [PATCH] sequencer: despaghettify --- crates/tek_sequencer/src/arranger.rs | 78 --------- crates/tek_sequencer/src/lib.rs | 4 +- crates/tek_sequencer/src/phrase.rs | 53 ++++++ crates/tek_sequencer/src/scene.rs | 71 +++++--- ...{sequencer_render.rs => sequencer_view.rs} | 119 +------------ crates/tek_sequencer/src/sequencer_view_h.rs | 161 ++++++++++++++++++ crates/tek_sequencer/src/sequencer_view_v.rs | 0 7 files changed, 268 insertions(+), 218 deletions(-) rename crates/tek_sequencer/src/{sequencer_render.rs => sequencer_view.rs} (53%) create mode 100644 crates/tek_sequencer/src/sequencer_view_h.rs create mode 100644 crates/tek_sequencer/src/sequencer_view_v.rs diff --git a/crates/tek_sequencer/src/arranger.rs b/crates/tek_sequencer/src/arranger.rs index f0509a44..e2acc077 100644 --- a/crates/tek_sequencer/src/arranger.rs +++ b/crates/tek_sequencer/src/arranger.rs @@ -16,7 +16,6 @@ pub struct Arranger { /// Display mode of arranger pub mode: ArrangerViewMode, - pub focused: bool, pub entered: bool, pub focus_sequencer: bool, @@ -68,83 +67,6 @@ impl Arranger { //self.sequencer.show(phrase) Ok(()) } - pub fn phrase (&self) -> Option<&Arc>> { - let track_id = self.selected.track()?; - self.tracks.get(track_id)?.phrases.get((*self.scene()?.clips.get(track_id)?)?) - } - pub fn phrase_next (&mut self) { - let track_index = self.selected.track(); - let scene_index = self.selected.scene(); - track_index - .and_then(|index|self.tracks.get_mut(index).map(|track|(index, track))) - .and_then(|(track_index, track)|{ - let phrases = track.phrases.len(); - scene_index - .and_then(|index|self.scenes.get_mut(index)) - .and_then(|scene|{ - if let Some(phrase_index) = scene.clips[track_index] { - if phrase_index >= phrases - 1 { - scene.clips[track_index] = None; - } else { - scene.clips[track_index] = Some(phrase_index + 1); - } - } else if phrases > 0 { - scene.clips[track_index] = Some(0); - } - Some(()) - }) - }); - } - pub fn phrase_prev (&mut self) { - let track_index = self.selected.track(); - let scene_index = self.selected.scene(); - track_index - .and_then(|index|self.tracks.get_mut(index).map(|track|(index, track))) - .and_then(|(track_index, track)|{ - let phrases = track.phrases.len(); - scene_index - .and_then(|index|self.scenes.get_mut(index)) - .and_then(|scene|{ - if let Some(phrase_index) = scene.clips[track_index] { - scene.clips[track_index] = if phrase_index == 0 { - None - } else { - Some(phrase_index - 1) - }; - } else if phrases > 0 { - scene.clips[track_index] = Some(phrases - 1); - } - Some(()) - }) - }); - } - pub fn scene (&self) -> Option<&Scene> { - self.selected.scene().map(|s|self.scenes.get(s)).flatten() - } - pub fn scene_mut (&mut self) -> Option<&mut Scene> { - self.selected.scene().map(|s|self.scenes.get_mut(s)).flatten() - } - pub fn scene_next (&mut self) { - self.selected.scene_next(self.scenes.len() - 1) - } - pub fn scene_prev (&mut self) { - self.selected.scene_prev() - } - pub fn scene_add (&mut self, name: Option<&str>) -> Usually<&mut Scene> { - let clips = vec![None;self.tracks.len()]; - self.scenes.push(match name { - Some(name) => Scene::new(name, clips), - None => Scene::new(&self.scene_default_name(), clips), - }); - let index = self.scenes.len() - 1; - Ok(&mut self.scenes[index]) - } - pub fn scene_del (&mut self) { - unimplemented!("Arranger::scene_del"); - } - pub fn scene_default_name (&self) -> String { - format!("Scene {}", self.scenes.len() + 1) - } pub fn rename_selected (&mut self) { self.modal = Some(Box::new(ArrangerRenameModal::new( self.selected, diff --git a/crates/tek_sequencer/src/lib.rs b/crates/tek_sequencer/src/lib.rs index 26831841..219d38cf 100644 --- a/crates/tek_sequencer/src/lib.rs +++ b/crates/tek_sequencer/src/lib.rs @@ -20,7 +20,7 @@ submod! { sequencer sequencer_cli sequencer_handle - sequencer_render + sequencer_view transport transport_focus transport_handle @@ -30,4 +30,6 @@ submod! { pubmod! { arranger_view_h arranger_view_v + sequencer_view_h + sequencer_view_v } diff --git a/crates/tek_sequencer/src/phrase.rs b/crates/tek_sequencer/src/phrase.rs index 2aff4403..f7bbc852 100644 --- a/crates/tek_sequencer/src/phrase.rs +++ b/crates/tek_sequencer/src/phrase.rs @@ -145,3 +145,56 @@ impl Phrase { phrase }} } + +impl Arranger { + pub fn phrase (&self) -> Option<&Arc>> { + let track_id = self.selected.track()?; + self.tracks.get(track_id)?.phrases.get((*self.scene()?.clips.get(track_id)?)?) + } + pub fn phrase_next (&mut self) { + let track_index = self.selected.track(); + let scene_index = self.selected.scene(); + track_index + .and_then(|index|self.tracks.get_mut(index).map(|track|(index, track))) + .and_then(|(track_index, track)|{ + let phrases = track.phrases.len(); + scene_index + .and_then(|index|self.scenes.get_mut(index)) + .and_then(|scene|{ + if let Some(phrase_index) = scene.clips[track_index] { + if phrase_index >= phrases - 1 { + scene.clips[track_index] = None; + } else { + scene.clips[track_index] = Some(phrase_index + 1); + } + } else if phrases > 0 { + scene.clips[track_index] = Some(0); + } + Some(()) + }) + }); + } + pub fn phrase_prev (&mut self) { + let track_index = self.selected.track(); + let scene_index = self.selected.scene(); + track_index + .and_then(|index|self.tracks.get_mut(index).map(|track|(index, track))) + .and_then(|(track_index, track)|{ + let phrases = track.phrases.len(); + scene_index + .and_then(|index|self.scenes.get_mut(index)) + .and_then(|scene|{ + if let Some(phrase_index) = scene.clips[track_index] { + scene.clips[track_index] = if phrase_index == 0 { + None + } else { + Some(phrase_index - 1) + }; + } else if phrases > 0 { + scene.clips[track_index] = Some(phrases - 1); + } + Some(()) + }) + }); + } +} diff --git a/crates/tek_sequencer/src/scene.rs b/crates/tek_sequencer/src/scene.rs index 568ce878..bb832324 100644 --- a/crates/tek_sequencer/src/scene.rs +++ b/crates/tek_sequencer/src/scene.rs @@ -8,6 +8,29 @@ pub struct Scene { } impl Scene { + pub fn from_edn <'a, 'e> (args: &[Edn<'e>]) -> Usually { + let mut name = None; + let mut clips = vec![]; + edn!(edn in args { + Edn::Map(map) => { + let key = map.get(&Edn::Key(":name")); + if let Some(Edn::Str(n)) = key { + name = Some(*n); + } else { + panic!("unexpected key in scene '{name:?}': {key:?}") + } + }, + Edn::Symbol("_") => { + clips.push(None); + }, + Edn::Int(i) => { + clips.push(Some(*i as usize)); + }, + _ => panic!("unexpected in scene '{name:?}': {edn:?}") + }); + let scene = Self::new(name.unwrap_or(""), clips); + Ok(scene) + } pub fn new (name: impl AsRef, clips: impl AsRef<[Option]>) -> Self { let name = name.as_ref().into(); let clips = clips.as_ref().iter().map(|x|x.clone()).collect(); @@ -47,28 +70,32 @@ pub fn scene_ppqs (tracks: &[Sequencer], scenes: &[Scene]) -> Vec<(usize, usize) scenes } -impl Scene { - pub fn from_edn <'a, 'e> (args: &[Edn<'e>]) -> Usually { - let mut name = None; - let mut clips = vec![]; - edn!(edn in args { - Edn::Map(map) => { - let key = map.get(&Edn::Key(":name")); - if let Some(Edn::Str(n)) = key { - name = Some(*n); - } else { - panic!("unexpected key in scene '{name:?}': {key:?}") - } - }, - Edn::Symbol("_") => { - clips.push(None); - }, - Edn::Int(i) => { - clips.push(Some(*i as usize)); - }, - _ => panic!("unexpected in scene '{name:?}': {edn:?}") +impl Arranger { + pub fn scene (&self) -> Option<&Scene> { + self.selected.scene().map(|s|self.scenes.get(s)).flatten() + } + pub fn scene_mut (&mut self) -> Option<&mut Scene> { + self.selected.scene().map(|s|self.scenes.get_mut(s)).flatten() + } + pub fn scene_next (&mut self) { + self.selected.scene_next(self.scenes.len() - 1) + } + pub fn scene_prev (&mut self) { + self.selected.scene_prev() + } + pub fn scene_add (&mut self, name: Option<&str>) -> Usually<&mut Scene> { + let clips = vec![None;self.tracks.len()]; + self.scenes.push(match name { + Some(name) => Scene::new(name, clips), + None => Scene::new(&self.scene_default_name(), clips), }); - let scene = Self::new(name.unwrap_or(""), clips); - Ok(scene) + let index = self.scenes.len() - 1; + Ok(&mut self.scenes[index]) + } + pub fn scene_del (&mut self) { + unimplemented!("Arranger::scene_del"); + } + pub fn scene_default_name (&self) -> String { + format!("Scene {}", self.scenes.len() + 1) } } diff --git a/crates/tek_sequencer/src/sequencer_render.rs b/crates/tek_sequencer/src/sequencer_view.rs similarity index 53% rename from crates/tek_sequencer/src/sequencer_render.rs rename to crates/tek_sequencer/src/sequencer_view.rs index dc9d4049..28c77725 100644 --- a/crates/tek_sequencer/src/sequencer_render.rs +++ b/crates/tek_sequencer/src/sequencer_view.rs @@ -25,7 +25,7 @@ impl Sequencer { Ok(()) } - fn style_focus (&self) -> Option