diff --git a/crates/tek/src/api/player.rs b/crates/tek/src/api/player.rs index 6e72dc98..ff11e44f 100644 --- a/crates/tek/src/api/player.rs +++ b/crates/tek/src/api/player.rs @@ -5,6 +5,15 @@ pub trait HasPlayer { fn player_mut (&mut self) -> &mut impl MidiPlayerApi; } +#[macro_export] macro_rules! has_player { + (|$self:ident:$Struct:ident$(<$($L:lifetime),*$($T:ident$(:$U:path)?),*>)?|$cb:expr) => { + impl $(<$($L),*$($T $(: $U)?),*>)? HasPlayer for $Struct $(<$($L),*$($T),*>)? { + fn player (&$self) -> &impl MidiPlayerApi { &$cb } + fn player_mut (&mut $self) -> &mut impl MidiPlayerApi { &mut$cb } + } + } +} + /// Contains state for playing a phrase pub struct PhrasePlayerModel { /// State of clock and playhead diff --git a/crates/tek/src/tui/app_arranger.rs b/crates/tek/src/tui/app_arranger.rs index 91681037..35da9a0b 100644 --- a/crates/tek/src/tui/app_arranger.rs +++ b/crates/tek/src/tui/app_arranger.rs @@ -415,6 +415,8 @@ render!(|self: ArrangerTui|{ has_clock!(|self:ArrangerTui|&self.clock); has_clock!(|self:ArrangerTrack|self.player.clock()); has_phrases!(|self:ArrangerTui|self.phrases.phrases); +has_editor!(|self:ArrangerTui|self.editor); +has_player!(|self:ArrangerTrack|self.player); impl HasPhraseList for ArrangerTui { fn phrases_focused (&self) -> bool { @@ -431,18 +433,6 @@ impl HasPhraseList for ArrangerTui { } } -impl HasEditor for ArrangerTui { - fn editor (&self) -> &PhraseEditorModel { - &self.editor - } - fn editor_focused (&self) -> bool { - self.focused() == ArrangerFocus::PhraseEditor - } - fn editor_entered (&self) -> bool { - self.entered() && self.editor_focused() - } -} - /// Sections in the arranger app that may be focused #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum ArrangerFocus { @@ -1236,15 +1226,6 @@ pub struct ArrangerTrack { pub(crate) player: PhrasePlayerModel, } -impl HasPlayer for ArrangerTrack { - fn player (&self) -> &impl MidiPlayerApi { - &self.player - } - fn player_mut (&mut self) -> &mut impl MidiPlayerApi { - &mut self.player - } -} - impl ArrangerTrackApi for ArrangerTrack { /// Name of track fn name (&self) -> &Arc> { diff --git a/crates/tek/src/tui/app_sequencer.rs b/crates/tek/src/tui/app_sequencer.rs index eb146915..44cbe082 100644 --- a/crates/tek/src/tui/app_sequencer.rs +++ b/crates/tek/src/tui/app_sequencer.rs @@ -283,6 +283,7 @@ impl TransportControl for SequencerTui { has_clock!(|self:SequencerTui|&self.clock); has_phrases!(|self:SequencerTui|self.phrases.phrases); +has_editor!(|self:SequencerTui|self.editor); impl HasPhraseList for SequencerTui { fn phrases_focused (&self) -> bool { @@ -299,18 +300,6 @@ impl HasPhraseList for SequencerTui { } } -impl HasEditor for SequencerTui { - fn editor (&self) -> &PhraseEditorModel { - &self.editor - } - fn editor_focused (&self) -> bool { - false - } - fn editor_entered (&self) -> bool { - true - } -} - impl HasFocus for SequencerTui { type Item = SequencerFocus; /// Get the currently focused item. diff --git a/crates/tek/src/tui/phrase_editor.rs b/crates/tek/src/tui/phrase_editor.rs index fc579483..92efbcc5 100644 --- a/crates/tek/src/tui/phrase_editor.rs +++ b/crates/tek/src/tui/phrase_editor.rs @@ -5,8 +5,14 @@ use PhraseCommand::*; pub trait HasEditor { fn editor (&self) -> &PhraseEditorModel; - fn editor_focused (&self) -> bool; - fn editor_entered (&self) -> bool; +} + +#[macro_export] macro_rules! has_editor { + (|$self:ident:$Struct:ident$(<$($L:lifetime),*$($T:ident$(:$U:path)?),*>)?|$cb:expr) => { + impl $(<$($L),*$($T $(: $U)?),*>)? HasEditor for $Struct $(<$($L),*$($T),*>)? { + fn editor (&$self) -> &PhraseEditorModel { &$cb } + } + } } #[derive(Clone, Debug)]