rework command/namespace dispatch

This commit is contained in:
i do not exist 2026-08-12 11:32:51 +03:00
parent def7a1b210
commit 406aabde6e
15 changed files with 586 additions and 374 deletions

View file

@ -73,32 +73,32 @@ pub trait HasScene: AsRefOpt<Scene> + AsMutOpt<Scene> {
}
impl<T: HasScene
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Arc<str>>
+ for<'a> Namespace<'a, ItemTheme>
+ Namespace<usize>
+ Namespace<Arc<str>>
+ Namespace<ItemTheme>
> SceneController for T {}
#[tek_proc::commands(SceneCommand)]
pub trait SceneController: HasScene
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Arc<str>>
+ for<'a> Namespace<'a, ItemTheme>
+ Namespace<usize>
+ Namespace<Arc<str>>
+ Namespace<ItemTheme>
{
#[command(SetSize = "scene/size")]
fn scene_set_size (&mut self, size: usize) -> Perhaps<SceneCommand>
where Self: for<'a> Namespace<'a, usize>
where Self: Namespace<usize>
{
todo!()
}
#[command(SetZoom = "scene/zoom")]
fn scene_set_zoom (&mut self, size: usize) -> Perhaps<SceneCommand>
where Self: for<'a> Namespace<'a, usize>
where Self: Namespace<usize>
{
todo!()
}
#[command(SetName = "scene/name")]
fn scene_set_name (&mut self, name: Arc<str>) -> Perhaps<SceneCommand>
where Self: for<'a> Namespace<'a, Arc<str>>
where Self: Namespace<Arc<str>>
{
Ok(self.scene_mut().map(|scene|swap_value(
&mut scene.name,
@ -108,7 +108,7 @@ pub trait SceneController: HasScene
}
#[command(SetColor = "scene/color")]
fn scene_set_color (&mut self, color: ItemTheme) -> Perhaps<SceneCommand>
where Self: for<'a> Namespace<'a, ItemTheme>
where Self: Namespace<ItemTheme>
{
Ok(self.scene_mut().map(|scene|swap_value(
&mut scene.color,
@ -172,16 +172,16 @@ pub trait HasScenes: AsRef<Vec<Scene>> + AsMut<Vec<Scene>> {
}
impl<T: HasScenes
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Option<ItemTheme>>
+ for<'a> Namespace<'a, Option<Arc<str>>>
+ Namespace<usize>
+ Namespace<Option<ItemTheme>>
+ Namespace<Option<Arc<str>>>
> ScenesController for T {}
#[tek_proc::commands(ScenesCommand)]
pub trait ScenesController: HasScenes
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Option<ItemTheme>>
+ for<'a> Namespace<'a, Option<Arc<str>>>
+ Namespace<usize>
+ Namespace<Option<ItemTheme>>
+ Namespace<Option<Arc<str>>>
{
// TODO
}

View file

@ -85,18 +85,18 @@ pub trait HasTrack: AsRefOpt<Track> + AsMutOpt<Track> {
}
impl<T: HasTrack
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Arc<str>>
+ for<'a> Namespace<'a, ItemTheme>
+ for<'a> Namespace<'a, Option<bool>>
+ Namespace<usize>
+ Namespace<Arc<str>>
+ Namespace<ItemTheme>
+ Namespace<Option<bool>>
> TrackController for T {}
#[tek_proc::commands(TrackCommand)]
pub trait TrackController: HasTrack
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Arc<str>>
+ for<'a> Namespace<'a, ItemTheme>
+ for<'a> Namespace<'a, Option<bool>>
+ Namespace<usize>
+ Namespace<Arc<str>>
+ Namespace<ItemTheme>
+ Namespace<Option<bool>>
{
#[command(Stop = "track/stop")]
fn track_stop (&mut self) -> Perhaps<TrackCommand> {
@ -259,27 +259,31 @@ pub trait HasTracks: AsRef<Vec<Track>> + AsMut<Vec<Track>> + HasClock + HasTrack
}
impl<T: HasTracks
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Arc<[Connect]>>
+ for<'a> Namespace<'a, Option<usize>>
+ for<'a> Namespace<'a, Option<Arc<str>>>
+ for<'a> Namespace<'a, Option<ItemTheme>>
+ for<'a> Namespace<'a, Option<Arc<[Connect]>>>
+ for<'a> Namespace<'a, Option<Vec<Option<Arc<RwLock<MidiClip>>>>>>
+ HasScenes
+ HasJack<'static>
+ Namespace<usize>
+ Namespace<Arc<[Connect]>>
+ Namespace<Option<usize>>
+ Namespace<Option<Arc<str>>>
+ Namespace<Option<ItemTheme>>
+ Namespace<Option<Arc<[Connect]>>>
+ Namespace<Option<Vec<Option<Arc<RwLock<MidiClip>>>>>>
> TracksController for T {}
#[tek_proc::commands(TracksCommand)]
pub trait TracksController: HasTracks
+ for<'a> Namespace<'a, usize>
+ for<'a> Namespace<'a, Arc<[Connect]>>
+ for<'a> Namespace<'a, Option<usize>>
+ for<'a> Namespace<'a, Option<Arc<str>>>
+ for<'a> Namespace<'a, Option<ItemTheme>>
+ for<'a> Namespace<'a, Option<Arc<[Connect]>>>
+ for<'a> Namespace<'a, Option<Vec<Option<Arc<RwLock<MidiClip>>>>>>
+ HasScenes
+ HasJack<'static>
+ Namespace<usize>
+ Namespace<Arc<[Connect]>>
+ Namespace<Option<usize>>
+ Namespace<Option<Arc<str>>>
+ Namespace<Option<ItemTheme>>
+ Namespace<Option<Arc<[Connect]>>>
+ Namespace<Option<Vec<Option<Arc<RwLock<MidiClip>>>>>>
{
#[command(Stop = "tracks/stop")]
#[command(Stop = "stop")]
/// Stop all playing clips
fn tracks_stop_all (&mut self) -> Perhaps<TracksCommand> {
for track in self.tracks_mut().iter_mut() {
@ -288,7 +292,7 @@ pub trait TracksController: HasTracks
Ok(None)
}
#[command(Launch = "tracks/launch")]
#[command(Launch = "launch")]
/// Launch multiple clips
fn tracks_launch (
&mut self, clips: Option<Vec<Option<Arc<RwLock<MidiClip>>>>>
@ -304,6 +308,14 @@ pub trait TracksController: HasTracks
}
Ok(None)
}
#[command(Add = "add")]
fn tracks_add (&mut self) -> Perhaps<TracksCommand>
where Self: HasScenes + HasJack<'static>
{
let (index, _) = self.tracks_add_one(None, None, [].into(), [].into())?;
Ok(None)
}
}
impl<