mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
wip: port: make device
This commit is contained in:
parent
447638ee71
commit
cb7e4f7a95
31 changed files with 602 additions and 865 deletions
|
|
@ -4,7 +4,7 @@ use std::path::PathBuf;
|
|||
#[derive(Default, Debug)]
|
||||
pub struct App {
|
||||
/// Must not be dropped for the duration of the process
|
||||
pub jack: Jack,
|
||||
pub jack: Jack<'static>,
|
||||
/// Port handles
|
||||
pub ports: std::collections::BTreeMap<u32, Port<Unowned>>,
|
||||
/// Display size
|
||||
|
|
@ -27,45 +27,33 @@ pub struct App {
|
|||
pub color: ItemTheme,
|
||||
}
|
||||
|
||||
has!(Jack: |self: App|self.jack);
|
||||
has!(Jack<'static>: |self: App|self.jack);
|
||||
has!(Pool: |self: App|self.pool);
|
||||
has!(Option<Dialog>: |self: App|self.dialog);
|
||||
has!(Clock: |self: App|self.project.clock);
|
||||
has!(Option<MidiEditor>: |self: App|self.project.editor);
|
||||
has!(Selection: |self: App|self.project.selection);
|
||||
has!(Vec<MidiInput>: |self: App|self.project.midi_ins);
|
||||
has!(Vec<MidiOutput>: |self: App|self.project.midi_outs);
|
||||
has!(Vec<MidiInput>: |self: App|self.project.midi_ins);
|
||||
has!(Vec<MidiOutput>: |self: App|self.project.midi_outs);
|
||||
has!(Vec<Scene>: |self: App|self.project.scenes);
|
||||
has!(Vec<Track>: |self: App|self.project.tracks);
|
||||
has!(Measure<TuiOut>: |self: App|self.size);
|
||||
maybe_has!(Track: |self: App|
|
||||
maybe_has!(Track: |self: App|
|
||||
{ MaybeHas::<Track>::get(&self.project) };
|
||||
{ MaybeHas::<Track>::get_mut(&mut self.project) });
|
||||
impl HasTrackScroll for App {
|
||||
fn track_scroll (&self) -> usize { self.project.track_scroll() }
|
||||
}
|
||||
maybe_has!(Scene: |self: App|
|
||||
impl HasTrackScroll for App { fn track_scroll (&self) -> usize { self.project.track_scroll() } }
|
||||
maybe_has!(Scene: |self: App|
|
||||
{ MaybeHas::<Scene>::get(&self.project) };
|
||||
{ MaybeHas::<Scene>::get_mut(&mut self.project) });
|
||||
impl HasSceneScroll for App {
|
||||
fn scene_scroll (&self) -> usize { self.project.scene_scroll() }
|
||||
}
|
||||
impl HasSceneScroll for App { fn scene_scroll (&self) -> usize { self.project.scene_scroll() } }
|
||||
has_clips!(|self: App|self.pool.clips);
|
||||
impl HasClipsSize for App {
|
||||
fn clips_size (&self) -> &Measure<TuiOut> { &self.project.inner_size }
|
||||
}
|
||||
from_dsl!(ClockCommand:
|
||||
|state: App, iter|FromDsl::take_from(state.clock(), iter));
|
||||
from_dsl!(MidiEditCommand:
|
||||
|state: App, iter|Ok(state.editor().map(|x|FromDsl::take_from(x, iter)).transpose()?.flatten()));
|
||||
from_dsl!(PoolCommand:
|
||||
|state: App, iter|FromDsl::take_from(&state.pool, iter));
|
||||
from_dsl!(SamplerCommand:
|
||||
|state: App, iter|Ok(state.project.sampler().map(|x|FromDsl::take_from(x, iter)).transpose()?.flatten()));
|
||||
from_dsl!(ArrangementCommand:
|
||||
|state: App, iter|FromDsl::take_from(&state.project, iter));
|
||||
from_dsl!(DialogCommand:
|
||||
|state: App, iter|FromDsl::take_from(&state.dialog, iter));
|
||||
impl HasClipsSize for App { fn clips_size (&self) -> &Measure<TuiOut> { &self.project.inner_size } }
|
||||
from_dsl!(ClockCommand: |state: App, iter|Namespace::take_from(state.clock(), iter));
|
||||
from_dsl!(MidiEditCommand: |state: App, iter|Ok(state.editor().map(|x|Namespace::take_from(x, iter)).transpose()?.flatten()));
|
||||
from_dsl!(PoolCommand: |state: App, iter|Namespace::take_from(&state.pool, iter));
|
||||
from_dsl!(SamplerCommand: |state: App, iter|Ok(state.project.sampler().map(|x|Namespace::take_from(x, iter)).transpose()?.flatten()));
|
||||
from_dsl!(ArrangementCommand: |state: App, iter|Namespace::take_from(&state.project, iter));
|
||||
from_dsl!(DialogCommand: |state: App, iter|Namespace::take_from(&state.dialog, iter));
|
||||
//has_editor!(|self: App|{
|
||||
//editor = self.editor;
|
||||
//editor_w = {
|
||||
|
|
@ -121,7 +109,7 @@ impl App {
|
|||
let midi = self.project.track().expect("no active track").sequencer.midi_outs[0].name();
|
||||
let track = self.track().expect("no active track");
|
||||
let port = format!("{}/Sampler", &track.name);
|
||||
let connect = PortConnect::exact(format!("{name}:{midi}"));
|
||||
let connect = Connect::exact(format!("{name}:{midi}"));
|
||||
let sampler = if let Ok(sampler) = Sampler::new(
|
||||
&self.jack, &port, &[connect], &[&[], &[]], &[&[], &[]]
|
||||
) {
|
||||
|
|
@ -464,7 +452,7 @@ impl Configuration {
|
|||
let cond = cond.unwrap();
|
||||
println!("ok");
|
||||
map.add_layer_if(
|
||||
Box::new(move |state: &App|FromDsl::take_from_or_fail(
|
||||
Box::new(move |state: &App|Namespace::take_from_or_fail(
|
||||
state, &mut exp.clone(),
|
||||
format!("missing input layer conditional")
|
||||
)), keys
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ pub(crate) use ::tengri::tui::ratatui::prelude::Position;
|
|||
impl App {
|
||||
pub fn view (&self) -> impl Content<TuiOut> + '_ {
|
||||
let view: Perhaps<Box<dyn Render<TuiOut>>> =
|
||||
FromDsl::take_from(self, &mut self.config.view.clone());
|
||||
Namespace::take_from(self, &mut self.config.view.clone());
|
||||
Either(view.is_ok(),
|
||||
ThunkRender::new(move|to|if let Some(view) = view.as_ref().unwrap().as_ref() {
|
||||
Content::render(view, to)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue