still 91 until happiness :(
Some checks failed
/ build (push) Has been cancelled

This commit is contained in:
🪞👃🪞 2025-09-02 22:39:04 +03:00
parent 34070de5f7
commit fd26b12955
18 changed files with 243 additions and 194 deletions

View file

@ -1,15 +1,17 @@
use crate::*;
impl<'t> DslNs<'t, Arc<str>> for App {
dsl_exprs!(|app| -> Arc<str> {});
dsl_words!(|app| -> Arc<str> {});
fn from_literal <D: Dsl> (&self, dsl: &D) -> Perhaps<Arc<str>> {
impl<'a> DslNs<'a, Arc<str>> for App {
fn from_literal (&self, dsl: impl Dsl) -> Perhaps<Arc<str>> {
Ok(dsl.src()?.map(|x|x.into()))
}
}
impl<'a> DslNsWords<'a, Arc<str>> for App {}
impl<'a> DslNsExprs<'a, Arc<str>> for App {}
impl<'t> DslNs<'t, bool> for App {
dsl_words!(|app| -> bool {
impl<'a> DslNs<'a, bool> for App {}
impl<'a> DslNsExprs<'a, bool> for App {}
impl<'a> DslNsWords<'a, bool> for App {
dsl_words!('a |app| -> bool {
":mode/editor" => app.project.editor.is_some(),
":focused/dialog" => !matches!(app.dialog, Dialog::None),
@ -29,15 +31,16 @@ impl<'t> DslNs<'t, bool> for App {
":focused/mix" => !app.editor_focused() && matches!(app.selection(),
Selection::Mix),
});
//fn from_literal <D: Dsl> (&self, dsl: &D) -> Perhaps<Arc<str>> {
//TODO
//}
}
impl<'t> DslNs<'t, ItemTheme> for App {}
impl<'a> DslNs<'a, ItemTheme> for App {}
impl<'a> DslNsWords<'a, ItemTheme> for App {}
impl<'a> DslNsExprs<'a, ItemTheme> for App {}
impl<'t> DslNs<'t, Dialog> for App {
dsl_words!(|app| -> Dialog {
impl<'a> DslNs<'a, Dialog> for App {}
impl<'a> DslNsExprs<'a, Dialog> for App {}
impl<'a> DslNsWords<'a, Dialog> for App {
dsl_words!('a |app| -> Dialog {
":dialog/none" => Dialog::None,
":dialog/options" => Dialog::Options,
":dialog/device" => Dialog::Device(0),
@ -59,8 +62,10 @@ impl<'t> DslNs<'t, Dialog> for App {
});
}
impl<'t> DslNs<'t, Selection> for App {
dsl_words!(|app| -> Selection {
impl<'a> DslNs<'a, Selection> for App {}
impl<'a> DslNsExprs<'a, Selection> for App {}
impl<'a> DslNsWords<'a, Selection> for App {
dsl_words!('a |app| -> Selection {
":select/scene" => app.selection().select_scene(app.tracks().len()),
":select/scene/next" => app.selection().select_scene_next(app.scenes().len()),
":select/scene/prev" => app.selection().select_scene_prev(),
@ -70,33 +75,42 @@ impl<'t> DslNs<'t, Selection> for App {
});
}
impl<'t> DslNs<'t, Color> for App {
dsl_words!(|app| -> Color {
impl<'a> DslNs<'a, Color> for App {}
impl<'a> DslNsWords<'a, Color> for App {
dsl_words!('a |app| -> Color {
":color/bg" => Color::Rgb(28, 32, 36),
});
dsl_exprs!(|app| -> Color {
"g" (n: u8) => Color::Rgb(n, n, n),
}
impl<'a> DslNsExprs<'a, Color> for App {
dsl_exprs!('a |app| -> Color {
"g" (n: u8) => Color::Rgb(n, n, n),
"rgb" (r: u8, g: u8, b: u8) => Color::Rgb(r, g, b),
});
}
impl<'t> DslNs<'t, Option<u7>> for App {
dsl_words!(|app| -> Option<u7> {
impl<'a> DslNs<'a, Option<u7>> for App {}
impl<'a> DslNsExprs<'a, Option<u7>> for App {}
impl<'a> DslNsWords<'a, Option<u7>> for App {
dsl_words!('a |app| -> Option<u7> {
":editor/pitch" => Some(
(app.editor().as_ref().map(|e|e.get_note_pos()).unwrap() as u8).into()
)
});
}
impl<'t> DslNs<'t, Option<usize>> for App {
dsl_words!(|app| -> Option<usize> {
impl<'a> DslNs<'a, Option<usize>> for App {}
impl<'a> DslNsExprs<'a, Option<usize>> for App {}
impl<'a> DslNsWords<'a, Option<usize>> for App {
dsl_words!('a |app| -> Option<usize> {
":selected/scene" => app.selection().scene(),
":selected/track" => app.selection().track(),
});
}
impl<'t> DslNs<'t, Option<Arc<RwLock<MidiClip>>>> for App {
dsl_words!(|app| -> Option<Arc<RwLock<MidiClip>>> {
impl<'a> DslNs<'a, Option<Arc<RwLock<MidiClip>>>> for App {}
impl<'a> DslNsExprs<'a, Option<Arc<RwLock<MidiClip>>>> for App {}
impl<'a> DslNsWords<'a, Option<Arc<RwLock<MidiClip>>>> for App {
dsl_words!('a |app| -> Option<Arc<RwLock<MidiClip>>> {
":selected/clip" => if let Selection::TrackClip { track, scene } = app.selection() {
app.scenes()[*scene].clips[*track].clone()
} else {
@ -105,18 +119,63 @@ impl<'t> DslNs<'t, Option<Arc<RwLock<MidiClip>>>> for App {
});
}
dsl_ns! { num |app: App|
u8;
u16 => {
impl<'a> DslNs<'a, u8> for App {
fn from_literal (&self, dsl: impl Dsl) -> Perhaps<u8> {
Ok(if let Some(src) = dsl.src()? {
Some(to_number(src)? as u8)
} else {
None
})
}
}
impl<'a> DslNsWords<'a, u8> for App {}
impl<'a> DslNsExprs<'a, u8> for App {}
impl<'a> DslNs<'a, u16> for App {
fn from_literal (&self, dsl: impl Dsl) -> Perhaps<u16> {
Ok(if let Some(src) = dsl.src()? {
Some(to_number(src)? as u16)
} else {
None
})
}
}
impl<'a> DslNsWords<'a, u16> for App {
dsl_words!('a |app| -> u16 {
":w/sidebar" => app.project.w_sidebar(app.editor().is_some()),
":h/sample-detail" => 6.max(app.height() as u16 * 3 / 9),
};
usize => {
});
}
impl<'a> DslNsExprs<'a, u16> for App {}
impl<'a> DslNs<'a, usize> for App {
fn from_literal (&self, dsl: impl Dsl) -> Perhaps<usize> {
Ok(if let Some(src) = dsl.src()? {
Some(to_number(src)? as usize)
} else {
None
})
}
}
impl<'a> DslNsWords<'a, usize> for App {
dsl_words!('a |app| -> usize {
":scene-count" => app.scenes().len(),
":track-count" => app.tracks().len(),
":device-kind" => app.dialog.device_kind().unwrap_or(0),
":device-kind/next" => app.dialog.device_kind_next().unwrap_or(0),
":device-kind/prev" => app.dialog.device_kind_prev().unwrap_or(0),
};
isize;
});
}
impl<'a> DslNsExprs<'a, usize> for App {}
impl<'a> DslNs<'a, isize> for App {
fn from_literal (&self, dsl: impl Dsl) -> Perhaps<isize> {
Ok(if let Some(src) = dsl.src()? {
Some(to_number(src)? as isize)
} else {
None
})
}
}
impl<'a> DslNsWords<'a, isize> for App {}
impl<'a> DslNsExprs<'a, isize> for App {}