wip(p60,e90): impl macros

This commit is contained in:
🪞👃🪞 2024-11-20 20:46:20 +01:00
parent f4a4b08c8a
commit 9d4fcaa32b
17 changed files with 748 additions and 1083 deletions

View file

@ -2,31 +2,95 @@ use crate::*;
pub trait TransportControl: ClockApi {}
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);
fn randomize_color (&mut self);
}
pub trait PhrasesControl: HasPhrases {
fn phrase_index (&self) -> usize;
fn set_phrase_index (&self, index: usize);
fn phrases_mode (&self) -> &Option<PhrasesMode>;
fn phrases_mode_mut (&mut self) -> &mut Option<PhrasesMode>;
fn phrase_rename_begin (&mut self) {
let name = self.phrases()[self.phrase_index()].read().unwrap().name.clone();
*self.phrases_mode_mut() = Some(
PhrasesMode::Rename(self.phrase_index(), name)
)
}
fn phrase_length_begin (&mut self) {
let length = self.phrases()[self.phrase_index()].read().unwrap().length;
*self.phrases_mode_mut() = Some(
PhrasesMode::Length(self.phrase_index(), length, PhraseLengthFocus::Bar)
)
}
fn new_phrase (name: Option<&str>, color: Option<ItemColorTriplet>) -> Arc<RwLock<Phrase>> {
Arc::new(RwLock::new(Phrase::new(
String::from(name.unwrap_or("(new)")), true, 4 * PPQ, None, color
)))
}
fn index_of (&self, phrase: &Phrase) -> Option<usize> {
for i in 0..self.phrases().len() {
if *self.phrases()[i].read().unwrap() == *phrase { return Some(i) }
}
return None
}
fn insert_dup (&mut self) {
let mut phrase = self.phrases()[self.phrase_index()].read().unwrap().duplicate();
phrase.color = ItemColorTriplet::random_near(phrase.color, 0.25);
let index = self.phrase_index() + 1;
self.phrases_mut().insert(index, Arc::new(RwLock::new(phrase)));
self.set_phrase_index(index);
}
}
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;
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>>;
fn note_axis (&self) -> &RwLock<FixedAxis<usize>>;
fn note_len (&self) -> usize;
fn note_len_mut (&mut self) -> &mut usize;
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 forward = |time|(time + self.note_len()) % length;
self.time_axis().write().unwrap().point = point.map(forward);
}
}
impl TransportControl for TransportTui {}
impl TransportControl for SequencerTui {}
impl TransportControl for ArrangerTui {}
pub trait SequencerControl {}
impl SequencerControl for SequencerTui {}
pub trait ArrangerControl {
fn selected (&self) -> ArrangerSelection;
fn show_phrase (&mut self);
fn activate (&mut self);
fn selected_phrase (&self) -> Option<Arc<RwLock<Phrase>>>;
fn toggle_loop (&mut self);
fn randomize_color (&mut self);
}
impl ArrangerControl for ArrangerTui {
fn selected (&self) -> ArrangerSelection {
self.selected
}
fn show_phrase (&mut self) {
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 {
@ -73,99 +137,36 @@ impl ArrangerControl for ArrangerTui {
}
}
pub trait PhrasesControl: HasPhrases {
fn phrase_index (&self) -> usize;
fn phrase_index_mut (&mut self) -> &mut usize;
fn phrases_mode (&self) -> &Option<PhrasesMode>;
fn phrases_mode_mut (&mut self) -> &mut Option<PhrasesMode>;
fn phrase_rename_begin (&mut self) {
let name = self.phrases()[self.phrase_index()].read().unwrap().name.clone();
*self.phrases_mode_mut() = Some(
PhrasesMode::Rename(self.phrase_index(), name)
)
impl HasPhrasesModel for ArrangerTui {
fn phrases_model (&self) -> &PhrasesModel {
&self.phrases
}
fn phrase_length_begin (&mut self) {
let length = self.phrases()[self.phrase_index()].read().unwrap().length;
*self.phrases_mode_mut() = Some(
PhrasesMode::Length(self.phrase_index(), length, PhraseLengthFocus::Bar)
)
}
fn new_phrase (name: Option<&str>, color: Option<ItemColorTriplet>) -> Arc<RwLock<Phrase>> {
Arc::new(RwLock::new(Phrase::new(
String::from(name.unwrap_or("(new)")), true, 4 * PPQ, None, color
)))
}
fn index_of (&self, phrase: &Phrase) -> Option<usize> {
for i in 0..self.phrases().len() {
if *self.phrases()[i].read().unwrap() == *phrase { return Some(i) }
}
return None
}
fn insert_dup (&mut self) {
let mut phrase = self.phrases()[self.phrase_index()].read().unwrap().duplicate();
phrase.color = ItemColorTriplet::random_near(phrase.color, 0.25);
let index = self.phrase_index() + 1;
self.phrases_mut().insert(index, Arc::new(RwLock::new(phrase)));
*self.phrase_index_mut() += 1;
fn phrases_model_mut (&mut self) -> &mut PhrasesModel {
&mut self.phrases
}
}
impl PhrasesControl for SequencerTui {
fn phrase_index (&self) -> usize {
self.view_phrase
impl HasPhrasesModel for SequencerTui {
fn phrases_model (&self) -> &PhrasesModel {
&self.phrases
}
fn phrase_index_mut (&mut self) -> &mut usize {
&mut self.view_phrase
fn phrases_model_mut (&mut self) -> &mut PhrasesModel {
&mut self.phrases
}
}
impl<T: HasPhrasesModel> PhrasesControl for T {
fn phrase_index (&self) -> usize {
self.phrases_model().phrase.load(Ordering::Relaxed)
}
fn set_phrase_index (&self, value: usize) {
self.phrases_model().phrase.store(value, Ordering::Relaxed);
}
fn phrases_mode (&self) -> &Option<PhrasesMode> {
&self.phrases_mode
&self.phrases_model().mode
}
fn phrases_mode_mut (&mut self) -> &mut Option<PhrasesMode> {
&mut self.phrases_mode
}
}
impl PhrasesControl for ArrangerTui {
fn phrase_index (&self) -> usize {
self.phrase
}
fn phrase_index_mut (&mut self) -> &mut usize {
&mut self.phrase
}
fn phrases_mode (&self) -> &Option<PhrasesMode> {
&self.phrases_mode
}
fn phrases_mode_mut (&mut self) -> &mut Option<PhrasesMode> {
&mut self.phrases_mode
}
}
impl PhrasesControl for PhrasesTui {
fn phrase_index (&self) -> usize {
self.phrase
}
fn phrase_index_mut (&mut self) -> &mut usize {
&mut self.phrase
}
fn phrases_mode (&self) -> &Option<PhrasesMode> {
&self.mode
}
fn phrases_mode_mut (&mut self) -> &mut Option<PhrasesMode> {
&mut self.mode
}
}
pub trait PhraseControl {
fn phrase_entered (&self) -> bool;
fn time_axis (&self) -> &RwLock<ScaledAxis<usize>>;
fn note_axis (&self) -> &RwLock<FixedAxis<usize>>;
fn note_len (&self) -> usize;
fn note_len_mut (&mut self) -> &mut usize;
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 forward = |time|(time + self.note_len()) % length;
self.time_axis().write().unwrap().point = point.map(forward);
&mut self.phrases_model_mut().mode
}
}
@ -185,6 +186,9 @@ impl PhraseControl for SequencerTui {
fn note_len_mut (&mut self) -> &mut usize {
todo!()
}
fn put_note (&mut self) {
todo!()
}
}
impl PhraseControl for ArrangerTui {
@ -203,4 +207,7 @@ impl PhraseControl for ArrangerTui {
fn note_len_mut (&mut self) -> &mut usize {
todo!()
}
fn put_note (&mut self) {
todo!()
}
}