mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-09 13:16:44 +01:00
wip(p61,e38)
This commit is contained in:
parent
9d4fcaa32b
commit
76da19d9c6
12 changed files with 172 additions and 141 deletions
|
|
@ -7,7 +7,6 @@ pub trait SequencerControl: TransportControl {}
|
|||
pub trait ArrangerControl: TransportControl {
|
||||
fn selected (&self) -> ArrangerSelection;
|
||||
fn selected_mut (&mut self) -> &mut ArrangerSelection;
|
||||
fn show_phrase (&mut self, phrase: Option<Arc<RwLock<Phrase>>>);
|
||||
fn activate (&mut self);
|
||||
fn selected_phrase (&self) -> Option<Arc<RwLock<Phrase>>>;
|
||||
fn toggle_loop (&mut self);
|
||||
|
|
@ -51,13 +50,10 @@ pub trait PhrasesControl: HasPhrases {
|
|||
}
|
||||
}
|
||||
|
||||
pub trait HasPhrasesModel: HasPhrases {
|
||||
fn phrases_model (&self) -> &PhrasesModel;
|
||||
fn phrases_model_mut (&mut self) -> &mut PhrasesModel;
|
||||
}
|
||||
|
||||
pub trait PhraseControl {
|
||||
fn phrase_entered (&self) -> bool;
|
||||
pub trait PhraseEditorControl {
|
||||
fn edit_phrase (&self, phrase: &Option<Arc<RwLock<Phrase>>>);
|
||||
fn editing_phrase (&self) -> &Option<Arc<RwLock<Phrase>>>;
|
||||
fn phrase_editor_entered (&self) -> bool;
|
||||
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>>;
|
||||
fn note_axis (&self) -> &RwLock<FixedAxis<usize>>;
|
||||
fn note_len (&self) -> usize;
|
||||
|
|
@ -65,7 +61,7 @@ pub trait PhraseControl {
|
|||
fn put_note (&mut self);
|
||||
fn time_cursor_advance (&self) {
|
||||
let point = self.time_axis().read().unwrap().point;
|
||||
let length = self.phrase.as_ref().map(|p|p.read().unwrap().length).unwrap_or(1);
|
||||
let length = self.editing_phrase().as_ref().map(|p|p.read().unwrap().length).unwrap_or(1);
|
||||
let forward = |time|(time + self.note_len()) % length;
|
||||
self.time_axis().write().unwrap().point = point.map(forward);
|
||||
}
|
||||
|
|
@ -86,17 +82,11 @@ impl ArrangerControl for ArrangerTui {
|
|||
fn selected_mut (&mut self) -> &mut ArrangerSelection {
|
||||
&mut self.selected
|
||||
}
|
||||
fn show_phrase (&mut self, phrase: Option<Arc<RwLock<Phrase>>>) {
|
||||
self.editor.show(self.selected_phrase().as_ref());
|
||||
//state.editor.phrase = phrase.clone();
|
||||
//state.focus(ArrangerFocus::PhraseEditor);
|
||||
//state.focus_enter();
|
||||
}
|
||||
fn activate (&mut self) {
|
||||
if let ArrangerSelection::Scene(s) = self.selected {
|
||||
for (t, track) in self.tracks_mut().iter_mut().enumerate() {
|
||||
let clip = self.scenes()[s].clips[t].as_ref();
|
||||
if track.play_phrase.is_some() || clip.is_some() {
|
||||
if track.player.play_phrase.is_some() || clip.is_some() {
|
||||
track.enqueue_next(clip);
|
||||
}
|
||||
}
|
||||
|
|
@ -137,41 +127,48 @@ impl ArrangerControl for ArrangerTui {
|
|||
}
|
||||
}
|
||||
|
||||
impl HasPhrasesModel for ArrangerTui {
|
||||
fn phrases_model (&self) -> &PhrasesModel {
|
||||
&self.phrases
|
||||
}
|
||||
fn phrases_model_mut (&mut self) -> &mut PhrasesModel {
|
||||
&mut self.phrases
|
||||
}
|
||||
}
|
||||
|
||||
impl HasPhrasesModel for SequencerTui {
|
||||
fn phrases_model (&self) -> &PhrasesModel {
|
||||
&self.phrases
|
||||
}
|
||||
fn phrases_model_mut (&mut self) -> &mut PhrasesModel {
|
||||
&mut self.phrases
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: HasPhrasesModel> PhrasesControl for T {
|
||||
impl PhrasesControl for SequencerTui {
|
||||
fn phrase_index (&self) -> usize {
|
||||
self.phrases_model().phrase.load(Ordering::Relaxed)
|
||||
self.phrases.phrase.load(Ordering::Relaxed)
|
||||
}
|
||||
fn set_phrase_index (&self, value: usize) {
|
||||
self.phrases_model().phrase.store(value, Ordering::Relaxed);
|
||||
self.phrases.phrase.store(value, Ordering::Relaxed);
|
||||
}
|
||||
fn phrases_mode (&self) -> &Option<PhrasesMode> {
|
||||
&self.phrases_model().mode
|
||||
&self.phrases.mode
|
||||
}
|
||||
fn phrases_mode_mut (&mut self) -> &mut Option<PhrasesMode> {
|
||||
&mut self.phrases_model_mut().mode
|
||||
&mut self.phrases.mode
|
||||
}
|
||||
}
|
||||
|
||||
impl PhraseControl for SequencerTui {
|
||||
fn phrase_entered (&self) -> bool {
|
||||
impl PhrasesControl for ArrangerTui {
|
||||
fn phrase_index (&self) -> usize {
|
||||
self.phrases.phrase.load(Ordering::Relaxed)
|
||||
}
|
||||
fn set_phrase_index (&self, value: usize) {
|
||||
self.phrases.phrase.store(value, Ordering::Relaxed);
|
||||
}
|
||||
fn phrases_mode (&self) -> &Option<PhrasesMode> {
|
||||
&self.phrases.mode
|
||||
}
|
||||
fn phrases_mode_mut (&mut self) -> &mut Option<PhrasesMode> {
|
||||
&mut self.phrases.mode
|
||||
}
|
||||
}
|
||||
|
||||
impl PhraseEditorControl for SequencerTui {
|
||||
fn edit_phrase (&self, phrase: &Option<Arc<RwLock<Phrase>>>) {
|
||||
//self.editor.show(self.selected_phrase().as_ref());
|
||||
//state.editor.phrase = phrase.clone();
|
||||
//state.focus(ArrangerFocus::PhraseEditor);
|
||||
//state.focus_enter();
|
||||
todo!()
|
||||
}
|
||||
fn editing_phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
todo!()
|
||||
}
|
||||
fn phrase_editor_entered (&self) -> bool {
|
||||
self.entered && self.focused() == SequencerFocus::PhraseEditor
|
||||
}
|
||||
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>> {
|
||||
|
|
@ -191,8 +188,14 @@ impl PhraseControl for SequencerTui {
|
|||
}
|
||||
}
|
||||
|
||||
impl PhraseControl for ArrangerTui {
|
||||
fn phrase_entered (&self) -> bool {
|
||||
impl PhraseEditorControl for ArrangerTui {
|
||||
fn edit_phrase (&self, phrase: &Option<Arc<RwLock<Phrase>>>) {
|
||||
todo!()
|
||||
}
|
||||
fn editing_phrase (&self) -> &Option<Arc<RwLock<Phrase>>> {
|
||||
todo!()
|
||||
}
|
||||
fn phrase_editor_entered (&self) -> bool {
|
||||
self.entered && self.focused() == ArrangerFocus::PhraseEditor
|
||||
}
|
||||
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue