wip: general overhaul of core and ports
Some checks are pending
/ build (push) Waiting to run

This commit is contained in:
🪞👃🪞 2025-05-20 22:05:09 +03:00
parent 573534a9a6
commit 447638ee71
30 changed files with 824 additions and 548 deletions

View file

@ -112,10 +112,3 @@ impl AppCommand {
//Ok(None)
//}
}
dsl!(ClockCommand: |self: App, iter|self.clock().take(iter));
dsl!(MidiEditCommand: |self: App, iter|Ok(self.editor().map(|x|x.take(iter)).transpose()?.flatten()));
dsl!(PoolCommand: |self: App, iter|self.pool.take(iter));
dsl!(SamplerCommand: |self: App, iter|Ok(self.project.sampler().map(|x|x.take(iter)).transpose()?.flatten()));
dsl!(ArrangementCommand: |self: App, iter|self.project.take(iter));
dsl!(DialogCommand: |self: App, iter|Dsl::take(&self.dialog, iter));

View file

@ -33,8 +33,8 @@ 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<JackMidiIn>: |self: App|self.project.midi_ins);
has!(Vec<JackMidiOut>: |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);
@ -54,6 +54,18 @@ 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));
//has_editor!(|self: App|{
//editor = self.editor;
//editor_w = {
@ -332,7 +344,7 @@ pub struct Configuration {
/// View definition
pub view: TokenIter<'static>,
// Input keymap
pub keys: InputMap<App, AppCommand, TuiIn, TokenIter<'static>>,
pub keys: InputMap<'static, App, AppCommand, TuiIn, TokenIter<'static>>,
}
impl Configuration {
@ -406,7 +418,7 @@ impl Configuration {
}
fn parse_keys (base: &impl AsRef<Path>, iter: Option<TokenIter<'static>>)
-> Usually<InputMap<App, AppCommand, TuiIn, TokenIter<'static>>>
-> Usually<InputMap<'static, App, AppCommand, TuiIn, TokenIter<'static>>>
{
if iter.is_none() {
return Err(format!("missing keys definition").into())
@ -452,7 +464,7 @@ impl Configuration {
let cond = cond.unwrap();
println!("ok");
map.add_layer_if(
Box::new(move |state: &App|Dsl::take_or_fail(
Box::new(move |state: &App|FromDsl::take_from_or_fail(
state, &mut exp.clone(),
format!("missing input layer conditional")
)), keys

View file

@ -4,22 +4,30 @@ pub(crate) use ::tengri::tui::ratatui::prelude::Position;
impl App {
pub fn view (&self) -> impl Content<TuiOut> + '_ {
let view: Perhaps<RenderBox<TuiOut>> =
let view: Perhaps<Box<dyn Render<TuiOut>>> =
FromDsl::take_from(self, &mut self.config.view.clone());
self.size.of(lay! {
When(matches!(&view, Ok(None)), Fill::y(Bsp::s(
Fixed::y(1, "no view"),
Fill::y(format!("{:?}", &self.config.view)),
))),
When(matches!(&view, Err(_)), Fill::y(Bsp::s(
Fixed::y(1, "view error"),
Fill::y(Bsp::s(
view.as_ref().err().map(|e|format!("{e}")),
format!("{:?}", &self.config.view),
))
))),
When(matches!(&view, Ok(Some(_))), Fill::y(view)),
})
Either(view.is_ok(),
ThunkRender::new(move|to|if let Some(view) = view.as_ref().unwrap().as_ref() {
Content::render(view, to)
}),
"error?!")
//Fill::xy(self.size.of(col! {
//Tui::bg(Rgb(72,72,0), When(matches!(&view, Err(_)), Bsp::s(
//Fixed::y(1, "view error"),
//Bsp::s(
//view.as_ref().err().map(|e|format!("{e}")),
//format!("{}", &self.config.view.0.0))))),
//When(matches!(&view, Ok(None)), Bsp::s(
//Tui::bg(Rgb(96,48,0),
//Fixed::y(1, Fill::x(Align::w("no view returned, as defined by:")))),
//Tui::bg(Rgb(72,32,0),
//Fill::x(Stack::south(|add: &mut dyn FnMut(&dyn Render<TuiOut>)|{
//for line in self.config.view.0.0.split('\n') {
//add(&Fill::x(Align::w(line)));
//}
//}))))),
//When(matches!(&view, Ok(Some(_))), &view.unwrap().unwrap()),
//}))
}
}