From a9cfaf9767fca5dc830814c4f4e25d5027f9b46e Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 26 Apr 2025 13:48:23 +0300 Subject: [PATCH] extract clip_auto_create; add clip_auto_remove --- crates/app/src/api.rs | 33 +++++--------------------- crates/app/src/model.rs | 38 ++++++++++++++++++++++++++++++ crates/midi/src/clip/clip_model.rs | 7 ++++++ 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/crates/app/src/api.rs b/crates/app/src/api.rs index d95c92f3..a97068b7 100644 --- a/crates/app/src/api.rs +++ b/crates/app/src/api.rs @@ -184,34 +184,13 @@ defcom! { |self, app: Tek| } Edit(value: Option) => { - if let Some(value) = value { - if app.is_editing() != value { - app.editing.store(value, Relaxed); - } + let editing = app.is_editing(); + let value = value.unwrap_or_else(||!app.is_editing()); + app.editing.store(value, Relaxed); + if value { + app.clip_auto_create(); } else { - app.editing.store(!app.is_editing(), Relaxed); - }; - // autocreate: create new clip from pool when entering empty cell - if let Some(ref pool) = app.pool - && app.is_editing() - && let Selection::Clip(t, s) = app.selected - && let Some(scene) = app.scenes.get_mut(s) - && let Some(slot) = scene.clips.get_mut(t) - && slot.is_none() - { - let (index, mut clip) = pool.add_new_clip(); - // autocolor: new clip colors from scene and track color - clip.write().unwrap().color = ItemColor::random_near( - app.tracks[t].color.base.mix( - scene.color.base, - 0.5 - ), - 0.2 - ).into(); - if let Some(ref mut editor) = app.editor { - editor.set_clip(Some(&clip)); - } - *slot = Some(clip); + app.clip_auto_remove(); } None } diff --git a/crates/app/src/model.rs b/crates/app/src/model.rs index 17318f0c..58844874 100644 --- a/crates/app/src/model.rs +++ b/crates/app/src/model.rs @@ -184,6 +184,44 @@ impl Tek { format!("Sc{:3>}", self.scenes().len() + 1).into() } + // Create new clip in pool when entering empty cell + pub fn clip_auto_create (&mut self) { + if let Some(ref pool) = self.pool + && let Selection::Clip(t, s) = self.selected + && let Some(scene) = self.scenes.get_mut(s) + && let Some(slot) = scene.clips.get_mut(t) + && slot.is_none() + { + let (index, mut clip) = pool.add_new_clip(); + // autocolor: new clip colors from scene and track color + clip.write().unwrap().color = ItemColor::random_near( + self.tracks[t].color.base.mix( + scene.color.base, + 0.5 + ), + 0.2 + ).into(); + if let Some(ref mut editor) = self.editor { + editor.set_clip(Some(&clip)); + } + *slot = Some(clip); + } + } + + // Remove clip from arrangement when exiting empty clip editor + pub fn clip_auto_remove (&mut self) { + if let Some(ref pool) = self.pool + && let Selection::Clip(t, s) = self.selected + && let Some(scene) = self.scenes.get_mut(s) + && let Some(slot) = scene.clips.get_mut(t) + && let Some(clip) = slot + { + if clip.read().unwrap().count_midi_messages() == 0 { + *slot = None; + } + } + } + } has_size!(|self: Tek|&self.size); diff --git a/crates/midi/src/clip/clip_model.rs b/crates/midi/src/clip/clip_model.rs index 5c4c8c67..3fb8c5bd 100644 --- a/crates/midi/src/clip/clip_model.rs +++ b/crates/midi/src/clip/clip_model.rs @@ -61,6 +61,13 @@ impl MidiClip { color: color.unwrap_or_else(ItemPalette::random) } } + pub fn count_midi_messages (&self) -> usize { + let mut count = 0; + for tick in self.notes.iter() { + count += tick.len(); + } + count + } pub fn set_length (&mut self, length: usize) { self.length = length; self.notes = vec![Vec::with_capacity(16);length];