mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
wip: refactor pt.21: 48 errors
This commit is contained in:
parent
2188bccd63
commit
b8708d6b2d
15 changed files with 313 additions and 355 deletions
|
|
@ -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>>> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue