wip: refactor pt.21: 48 errors

This commit is contained in:
🪞👃🪞 2024-11-13 17:43:46 +01:00
parent 2188bccd63
commit b8708d6b2d
15 changed files with 313 additions and 355 deletions

View file

@ -9,8 +9,9 @@ pub type ArrangerApp = AppContainer<
ArrangerStatusBar
>;
impl ArrangerApp {
pub fn run <'a> (jack: &Arc<RwLock<JackClient>>) -> Usually<Self> {
impl TryFrom<&Arc<RwLock<JackClient>>> for ArrangerApp {
type Error = Box<dyn std::error::Error>;
fn try_from (jack: &Arc<RwLock<JackClient>>) -> Usually<Self> {
let clock = Arc::new(Clock::from(Instant::default()));
let transport = Arc::new(RwLock::new(tek_api::Transport {
@ -20,30 +21,22 @@ impl ArrangerApp {
clock: clock.clone()
}));
let phrases = Arc::new(RwLock::new(PhrasePool {
phrases: vec![]
}));
let phrases = Arc::new(RwLock::new(PhrasePool { phrases: vec![] }));
let player = Arc::new(RwLock::new(MIDIPlayer::new(jack, &clock, "preview")?));
let arrangement = Arc::new(RwLock::new(Arrangement {
jack: jack.clone(),
clock: clock.clone(),
name: Arc::new(RwLock::new(String::new())),
phrases: phrases.read().unwrap().phrases.clone(), // FIXME
tracks: vec![],
scenes: vec![],
}));
let sequencer = Arc::new(RwLock::new(SequencerModel {
transport: transport.clone(),
phrases: phrases.clone(),
player: player.clone(),
}));
let model = Arc::new(RwLock::new(ArrangerModel {
arrangement: arrangement.clone(),
sequencer: sequencer.clone(),
let model = Arc::new(RwLock::new(Arranger {
arrangement: Arc::new(RwLock::new(ArrangerModel {
jack: jack.clone(),
clock: clock.clone(),
name: Arc::new(RwLock::new(String::new())),
phrases: phrases.clone(), // FIXME
tracks: vec![],
scenes: vec![],
})),
sequencer: Arc::new(RwLock::new(SequencerModel {
transport: transport.clone(),
phrases: phrases.clone(),
player: Arc::new(RwLock::new(MIDIPlayer::new(jack, &clock, "preview")?)),
})),
transport: transport.clone(),
phrases: phrases.clone(),
}));
@ -51,28 +44,28 @@ impl ArrangerApp {
Ok(Self::new(
&model,
ArrangerView::from(&model),
ArrangerAudio(arrangement.clone()),
ArrangerAudio(model.clone()),
None,
None
))
}
}
pub struct ArrangerModel {
pub arrangement: Arc<RwLock<Arrangement>>,
pub struct Arranger {
pub arrangement: Arc<RwLock<ArrangerModel>>,
pub sequencer: Arc<RwLock<SequencerModel>>,
pub transport: Arc<RwLock<tek_api::Transport>>,
pub phrases: Arc<RwLock<PhrasePool>>,
}
impl<E: Engine> From<&Arc<RwLock<ArrangerModel>>> for ArrangerView<E> {
fn from (model: &Arc<RwLock<ArrangerModel>>) -> Self {
impl<E: Engine> From<&Arc<RwLock<Arranger>>> for ArrangerView<E> {
fn from (model: &Arc<RwLock<Arranger>>) -> Self {
let mut view = Self {
model: model.clone(),
sequencer: SequencerView::from(&model.read().unwrap().sequencer),
split: 20,
selected: ArrangementEditorFocus::Clip(0, 0),
mode: ArrangementEditorMode::Vertical(2),
selected: ArrangerFocus::Clip(0, 0),
mode: ArrangerMode::Vertical(2),
color: Color::Rgb(28, 35, 25).into(),
size: Measure::new(),
focused: false,
@ -85,15 +78,15 @@ impl<E: Engine> From<&Arc<RwLock<ArrangerModel>>> for ArrangerView<E> {
/// Root level object for standalone `tek_arranger`
pub struct ArrangerView<E: Engine> {
pub model: Arc<RwLock<ArrangerModel>>,
pub model: Arc<RwLock<Arranger>>,
/// Sequencer component
pub sequencer: SequencerView<E>,
/// Height of arrangement
pub split: u16,
/// Currently selected element.
pub selected: ArrangementEditorFocus,
pub selected: ArrangerFocus,
/// Display mode of arranger
pub mode: ArrangementEditorMode,
pub mode: ArrangerMode,
/// Background color of arrangement
pub color: ItemColor,
/// Whether the arranger is currently focused
@ -106,7 +99,7 @@ pub struct ArrangerView<E: Engine> {
/// Display mode of arranger
#[derive(Clone, PartialEq)]
pub enum ArrangementEditorMode {
pub enum ArrangerMode {
/// Tracks are rows
Horizontal,
/// Tracks are columns
@ -114,7 +107,7 @@ pub enum ArrangementEditorMode {
}
/// Arranger display mode can be cycled
impl ArrangementEditorMode {
impl ArrangerMode {
/// Cycle arranger display mode
pub fn to_next (&mut self) {
*self = match self {
@ -130,7 +123,7 @@ impl ArrangementEditorMode {
impl<E: Engine> Audio for ArrangerView<E> {
#[inline] fn process (&mut self, _: &Client, _: &ProcessScope) -> Control {
// FIXME: one of these per playing track
if let ArrangementEditorFocus::Clip(t, s) = self.selected {
if let ArrangerFocus::Clip(t, s) = self.selected {
let phrase = self.model.scenes.get(s).map(|scene|scene.clips.get(t));
if let Some(Some(Some(phrase))) = phrase {
if let Some(track) = self.model.tracks.get(t) {
@ -164,9 +157,9 @@ impl Content for ArrangerView<Tui> {
lay!(
Layers::new(move |add|{
match self.mode {
ArrangementEditorMode::Horizontal =>
ArrangerMode::Horizontal =>
add(&arranger_content_horizontal(self))?,
ArrangementEditorMode::Vertical(factor) =>
ArrangerMode::Vertical(factor) =>
add(&arranger_content_vertical(self, factor))?
};
add(&self.size)
@ -176,7 +169,7 @@ impl Content for ArrangerView<Tui> {
.bg(TuiTheme::border_bg())
.fg(TuiTheme::border_fg(self.focused)))),
widget(&self.size),
widget(&format!("[{}] Arrangement", if self.entered {
widget(&format!("[{}] Arranger", if self.entered {
""
} else {
" "
@ -206,7 +199,7 @@ impl<E: Engine> ArrangerView<E> {
pub fn activate (&mut self) {
let arrangement = self.model.read().unwrap().arrangement.read().unwrap();
match self.selected {
ArrangementEditorFocus::Scene(s) => {
ArrangerFocus::Scene(s) => {
for (t, track) in self.model.tracks.iter_mut().enumerate() {
let player = &mut track.player;
let clip = self.model.scenes[s].clips[t].as_ref();
@ -220,7 +213,7 @@ impl<E: Engine> ArrangerView<E> {
//self.transport.toggle_play()
//}
},
ArrangementEditorFocus::Clip(t, s) => {
ArrangerFocus::Clip(t, s) => {
let clip = self.model.scenes[s].clips[t].as_ref();
self.model.tracks[t].player.enqueue_next(clip);
},
@ -238,8 +231,8 @@ impl<E: Engine> ArrangerView<E> {
let arrangement = self.model.read().unwrap().arrangement.read().unwrap();
let selected = self.selected;
(self.model.scenes.len() == 0 && (selected.is_mix() || selected.is_track())) || match selected {
ArrangementEditorFocus::Scene(s) => s == self.model.scenes.len() - 1,
ArrangementEditorFocus::Clip(_, s) => s == self.model.scenes.len() - 1,
ArrangerFocus::Scene(s) => s == self.model.scenes.len() - 1,
ArrangerFocus::Clip(_, s) => s == self.model.scenes.len() - 1,
_ => false
}
}
@ -253,26 +246,26 @@ impl<E: Engine> ArrangerView<E> {
pub fn randomize_color (&mut self) {
let arrangement = self.model.read().unwrap().arrangement.read().unwrap();
match self.selected {
ArrangementEditorFocus::Mix => {
ArrangerFocus::Mix => {
self.color = ItemColor::random_dark()
},
ArrangementEditorFocus::Track(t) => {
ArrangerFocus::Track(t) => {
self.model.tracks[t].color = ItemColor::random()
},
ArrangementEditorFocus::Scene(s) => {
ArrangerFocus::Scene(s) => {
self.model.scenes[s].color = ItemColor::random()
},
ArrangementEditorFocus::Clip(t, s) => {
ArrangerFocus::Clip(t, s) => {
if let Some(phrase) = &self.model.scenes[s].clips[t] {
phrase.write().unwrap().color = ItemColorTriplet::random();
}
}
}
}
pub fn selected_scene (&self) -> Option<&ArrangementScene> {
pub fn selected_scene (&self) -> Option<&ArrangerScene> {
self.selected.scene().map(|s|self.model.scenes.get(s)).flatten()
}
pub fn selected_scene_mut (&mut self) -> Option<&mut ArrangementScene> {
pub fn selected_scene_mut (&mut self) -> Option<&mut ArrangerScene> {
self.selected.scene().map(|s|self.model.scenes.get_mut(s)).flatten()
}
pub fn selected_phrase (&self) -> Option<Arc<RwLock<Phrase>>> {