wip: refactor command definitions

This commit is contained in:
🪞👃🪞 2025-05-05 23:13:47 +03:00
parent 1b926b0338
commit 9f9de3fafb
9 changed files with 489 additions and 343 deletions

View file

@ -17,180 +17,188 @@ handle!(TuiIn: |self: Tek, input|Ok(if let Some(command) = self.config.keys.comm
None
}));
expose!([self: Tek]
([bool]
(":mode-editor" self.is_editing())
(":mode-message" matches!(self.dialog, Some(Dialog::Message(..))))
(":mode-device-add" matches!(self.dialog, Some(Dialog::Device(..))))
(":mode-clip" !self.is_editing() && self.selected.is_clip())
(":mode-track" !self.is_editing() && self.selected.is_track())
(":mode-scene" !self.is_editing() && self.selected.is_scene())
(":mode-mix" !self.is_editing() && self.selected.is_mix())
(":mode-pool-import" matches!(
self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(),
Some(PoolMode::Import(..))))
(":mode-pool-export" matches!(
self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(),
Some(PoolMode::Export(..))))
(":mode-pool-rename" matches!(
self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(),
Some(PoolMode::Rename(..))))
(":mode-pool-length" matches!(
self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(),
Some(PoolMode::Length(..)))))
([isize])
([Color])
([Arc<RwLock<MidiClip>>])
([u7]
(":pitch" (self.editor().map(|e|e.note_pos()).unwrap() as u8).into()))
([u16]
(":w-sidebar" self.w_sidebar()))
([usize]
(":scene-last" self.scenes.len())
(":track-last" self.tracks.len())
(":device-kind" if let Some(Dialog::Device(index)) = self.dialog {
#[tengri_proc::expose]
impl Tek {
fn focus_editor (&self) -> bool {
self.is_editing()
}
fn focus_message (&self) -> bool {
matches!(self.dialog, Some(Dialog::Message(..)))
}
fn focus_device_add (&self) -> bool {
matches!(self.dialog, Some(Dialog::Device(..)))
}
fn focus_clip (&self) -> bool {
!self.is_editing() && self.selected.is_clip()
}
fn focus_track (&self) -> bool {
!self.is_editing() && self.selected.is_track()
}
fn focus_scene (&self) -> bool {
!self.is_editing() && self.selected.is_scene()
}
fn focus_mix (&self) -> bool {
!self.is_editing() && self.selected.is_mix()
}
fn focus_pool_import (&self) -> bool {
matches!(self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(), Some(PoolMode::Import(..)))
}
fn focus_pool_export (&self) -> bool {
matches!(self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(), Some(PoolMode::Export(..)))
}
fn focus_pool_rename (&self) -> bool {
matches!(self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(), Some(PoolMode::Rename(..)))
}
fn focus_pool_length (&self) -> bool {
matches!(self.pool.as_ref().map(|p|p.mode.as_ref()).flatten(), Some(PoolMode::Length(..)))
}
fn editor_pitch (&self) -> Option<u7> {
(self.editor().map(|e|e.note_pos()).unwrap() as u8).into()
}
fn w_sidebar (&self) -> Option<u7> {
self.w_sidebar()
}
fn scene_count (&self) -> Option<usize> {
self.scenes.len()
}
fn scene_selected (&self) -> Option<usize> {
self.selected.scene()
}
fn scene_select_next (&self) -> Selection {
self.selected.scene_next(self.scenes.len())
}
fn scene_select_prev (&self) -> Selection {
self.selected.scene_prev()
}
fn track_count (&self) -> Option<usize> {
self.tracks.len()
}
fn track_selected (&self) -> Option<usize> {
self.selected.track()
}
fn track_select_next (&self) -> Selection {
self.selected.track_next(self.tracks.len())
}
fn track_select_prev (&self) -> Selection {
self.selected.track_prev()
}
fn clip_selected (&self) -> Option<Arc<RwLock<MidiClip>>> {
match self.selected {
Selection::TrackClip { track, scene } => self.scenes[scene].clips[track].clone(),
_ => None
}
}
fn device_kind (&self) -> usize {
if let Some(Dialog::Device(index)) = self.dialog {
index
} else {
0
})
(":device-kind-prev" if let Some(Dialog::Device(index)) = self.dialog {
}
}
fn device_kind_prev (&self) -> usize {
if let Some(Dialog::Device(index)) = self.dialog {
index.overflowing_sub(1).0.min(self.device_kinds().len().saturating_sub(1))
} else {
0
})
(":device-kind-next" if let Some(Dialog::Device(index)) = self.dialog {
}
}
fn device_kind_next (&self) -> usize {
if let Some(Dialog::Device(index)) = self.dialog {
(index + 1) % self.device_kinds().len()
} else {
0
}))
([Option<usize>]
(":scene" self.selected.scene())
(":track" self.selected.track()))
([MaybeClip]
(":clip" match self.selected {
Selection::TrackClip { track, scene } => self.scenes[scene].clips[track].clone(),
_ => None
}))
([Selection]
(":scene-next" self.selected.scene_next(self.scenes.len()))
(":scene-prev" self.selected.scene_prev())
(":track-next" self.selected.track_next(self.tracks.len()))
(":track-prev" self.selected.track_prev())));
expose!([self: MidiPool]
([bool])
([PathBuf])
([Arc<str>])
([MidiClip]
(":new-clip" self.new_clip())
(":cloned-clip" self.cloned_clip()))
([usize]
(":current" 0)
(":after" 0)
(":previous" 0)
(":next" 0))
([ItemColor]
(":random-color" ItemColor::random())));
expose!([self: MidiEditor]
([bool]
(":true" true)
(":false" false)
(":time-lock" self.time_lock().get())
(":time-lock-toggle" !self.time_lock().get()))
([usize]
(":note-length" self.note_len())
(":note-pos" self.note_pos())
(":note-pos-next" self.note_pos() + 1)
(":note-pos-prev" self.note_pos().saturating_sub(1))
(":note-pos-next-octave" self.note_pos() + 12)
(":note-pos-prev-octave" self.note_pos().saturating_sub(12))
(":note-len" self.note_len())
(":note-len-next" self.note_len() + 1)
(":note-len-prev" self.note_len().saturating_sub(1))
(":note-range" self.note_axis().get())
(":note-range-prev" self.note_axis().get() + 1)
(":note-range-next" self.note_axis().get().saturating_sub(1))
(":time-pos" self.time_pos())
(":time-pos-next" self.time_pos() + self.time_zoom().get())
(":time-pos-prev" self.time_pos().saturating_sub(self.time_zoom().get()))
(":time-zoom" self.time_zoom().get())
(":time-zoom-next" self.time_zoom().get() + 1)
(":time-zoom-prev" self.time_zoom().get().saturating_sub(1).max(1))));
}
}
}
impose!([app: Tek]
(TekCommand:
("menu" [] Some(Self::ToggleMenu))
("help" [] Some(Self::ToggleHelp))
("stop" [] Some(Self::StopAll))
("undo" [d: usize] Some(Self::History(-(d.unwrap_or(0) as isize))))
("redo" [d: usize] Some(Self::History(d.unwrap_or(0) as isize)))
("zoom" [z: usize] Some(Self::Zoom(z)))
("edit" [] Some(Self::Edit(None)))
("edit" [c: bool] Some(Self::Edit(c)))
("color" [] Some(Self::Color(ItemTheme::random())))
("color" [c: Color] Some(Self::Color(c.map(ItemTheme::from).expect("no color"))))
("enqueue" [c: Arc<RwLock<MidiClip>>] Some(Self::Enqueue(c)))
("launch" [] Some(Self::Launch))
("select" [t: Selection] Some(t.map(Self::Select).expect("no selection")))
("clock" [,..a] ns!(ClockCommand, app.clock(), a, Self::Clock))
("scene" [,..a] ns!(SceneCommand, app, a, Self::Scene))
("track" [,..a] ns!(TrackCommand, app, a, Self::Track))
("input" [,..a] ns!(InputCommand, app, a, Self::Input))
("output" [,..a] ns!(OutputCommand, app, a, Self::Output))
("clip" [,..a] ns!(ClipCommand, app, a, Self::Clip))
("device" [,..a] ns!(DeviceCommand, app, a, Self::Device))
("message" [,..a] ns!(MessageCommand, app, a, Self::Message))
("pool" [,..a] app.pool.as_ref().map(|p|ns!(PoolCommand, p, a, Self::Pool)).flatten())
("editor" [,..a] app.editor().map(|e|ns!(MidiEditCommand, e, a, Self::Editor)).flatten())
("sampler" [,..a] app.sampler().map(|s|ns!(SamplerCommand, s, a, Self::Sampler)).flatten())
("select" [t: usize, s: usize] Some(match (t.expect("no track"), s.expect("no scene")) {
(0, 0) => Self::Select(Selection::Mix),
(t, 0) => Self::Select(Selection::Track(t)),
(0, s) => Self::Select(Selection::Scene(s)),
(t, s) => Self::Select(Selection::TrackClip { track: t, scene: s }) })))
#[tengri_proc::expose]
impl MidiPool {
fn clip_new (&self) -> MidiClip {
self.new_clip()
}
fn clip_cloned (&self) -> MidiClip {
self.cloned_clip()
}
fn clip_index_current (&self) -> usize {
0
}
fn clip_index_after (&self) -> usize {
0
}
fn clip_index_previous (&self) -> usize {
0
}
fn clip_index_next (&self) -> usize {
0
}
fn color_random (&self) -> ItemColor {
ItemColor::random()
}
}
(ClipCommand:
("edit" [a: MaybeClip] Some(Self::Edit(a.unwrap())))
("color" [a: usize, b: usize] Some(Self::SetColor(a.unwrap(), b.unwrap(), ItemTheme::random())))
("enqueue" [a: usize, b: usize] Some(Self::Enqueue(a.unwrap(), b.unwrap())))
("get" [a: usize, b: usize] Some(Self::Get(a.unwrap(), b.unwrap())))
("loop" [a: usize, b: usize, c: bool] Some(Self::SetLoop(a.unwrap(), b.unwrap(), c.unwrap())))
("put" [a: usize, b: usize, c: MaybeClip] Some(Self::Put(a.unwrap(), b.unwrap(), c.unwrap())))
("delete" [a: usize, b: usize] Some(Self::Put(a.unwrap(), b.unwrap(), None))))
(InputCommand:
("add" [] Some(Self::Add)))
(OutputCommand:
("add" [] Some(Self::Add)))
(DeviceCommand:
("picker" [] Some(Self::Picker))
("pick" [index: usize] Some(Self::Pick(index.unwrap())))
("add" [index: usize] Some(Self::Add(index.unwrap()))))
(MessageCommand:
("dismiss" [] Some(Self::Dismiss)))
(SceneCommand:
("add" [] Some(Self::Add))
("delete" [a: Option<usize>] Some(Self::Del(a.flatten().unwrap())))
("zoom" [a: usize] Some(Self::SetZoom(a.unwrap())))
("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemTheme::G[128])))
("enqueue" [a: usize] Some(Self::Enqueue(a.unwrap())))
("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap()))))
(TrackCommand:
("add" [] Some(Self::Add))
("size" [a: usize] Some(Self::SetSize(a.unwrap())))
("zoom" [a: usize] Some(Self::SetZoom(a.unwrap())))
("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemTheme::random())))
("delete" [a: Option<usize>] Some(Self::Del(a.flatten().unwrap())))
("stop" [a: usize] Some(Self::Stop(a.unwrap())))
("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap())))
("play" [] Some(Self::TogglePlay))
("solo" [] Some(Self::ToggleSolo))
("rec" [] Some(Self::ToggleRec))
("mon" [] Some(Self::ToggleMon))));
#[tengri_proc::expose]
impl MidiEditor {
fn time_lock (&self) -> bool {
self.time_lock().get()
}
fn time_lock_toggle (&self) -> bool {
!self.time_lock().get()
}
fn note_length (&self) -> usize {
self.note_len()
}
fn note_pos (&self) -> usize {
self.note_pos()
}
fn note_pos_next (&self) -> usize {
self.note_pos() + 1
}
fn note_pos_next_octave (&self) -> usize {
self.note_pos() + 12
}
fn note_pos_prev (&self) -> usize {
self.note_pos().saturating_sub(1)
}
fn note_pos_prev_octave (&self) -> usize {
self.note_pos().saturating_sub(12)
}
fn note_len (&self) -> usize {
self.note_len()
}
fn note_len_next (&self) -> usize {
self.note_len() + 1
}
fn note_len_prev (&self) -> usize {
self.note_len().saturating_sub(1)
}
fn note_range (&self) -> usize {
self.note_axis()
}
fn note_range_next (&self) -> usize {
self.note_axis() + 1
}
fn note_range_prev (&self) -> usize {
self.note_axis().saturating_sub(1)
}
fn time_pos (&self) -> usize {
self.time_pos()
}
fn time_pos_next (&self) -> usize {
self.time_pos() + self.time_zoom().get()
}
fn time_pos_prev (&self) -> usize {
self.time_pos().saturating_sub(self.time_zoom().get())
}
fn time_zoom (&self) -> usize {
self.time_zoom()
}
fn time_zoom_next (&self) -> usize {
self.time_zoom() + 1
}
fn time_zoom_prev (&self) -> usize {
self.time_zoom().get().saturating_sub(1).max(1)
}
}
//#[tengri_proc::input(TuiIn)]
//impl Tek {
@ -204,77 +212,154 @@ impose!([app: Tek]
//}
//}
defcom!([self, app: Tek]
#[tengri_proc::command(Tek)]
impl TekCommand {
//(Sampler [cmd: SamplerCommand] app.sampler_mut().map(|s|cmd.delegate(s, Self::Sampler)).transpose()?.flatten())
//(Scene [cmd: SceneCommand] cmd.delegate(app, Self::Scene)?)
//(Track [cmd: TrackCommand] cmd.delegate(app, Self::Track)?)
//(Output [cmd: OutputCommand] cmd.delegate(app, Self::Output)?)
//(Input [cmd: InputCommand] cmd.delegate(app, Self::Input)?)
//(Clip [cmd: ClipCommand] cmd.delegate(app, Self::Clip)?)
//(Clock [cmd: ClockCommand] cmd.delegate(app, Self::Clock)?)
//(Device [cmd: DeviceCommand] cmd.delegate(app, Self::Device)?)
//(Message [cmd: MessageCommand] cmd.delegate(app, Self::Message)?)
//(Editor [cmd: MidiEditCommand] delegate_to_editor(app, cmd)?)
//(Pool [cmd: PoolCommand] delegate_to_pool(app, cmd)?)
//(ToggleHelp [] cmd!(app.toggle_dialog(Some(Dialog::Help))))
//(ToggleMenu [] cmd!(app.toggle_dialog(Some(Dialog::Menu))))
//(Color [p: ItemTheme] app.set_color(Some(p)).map(Self::Color))
//(Enqueue [c: MaybeClip] cmd_todo!("\n\rtodo: enqueue {c:?}"))
//(History [d: isize] cmd_todo!("\n\rtodo: history {d:?}"))
//(Zoom [z: Option<usize>] cmd_todo!("\n\rtodo: zoom {z:?}"))
//(Edit [value: Option<bool>] cmd!(app.toggle_editor(value)))
//(Launch [] cmd!(app.launch()))
//(Select [s: Selection] cmd!(app.select(s)))
//(StopAll [] cmd!(app.stop_all())))
//("menu" [] Some(Self::ToggleMenu))
//("help" [] Some(Self::ToggleHelp))
//("stop" [] Some(Self::StopAll))
//("undo" [d: usize] Some(Self::History(-(d.unwrap_or(0) as isize))))
//("redo" [d: usize] Some(Self::History(d.unwrap_or(0) as isize)))
//("zoom" [z: usize] Some(Self::Zoom(z)))
//("edit" [] Some(Self::Edit(None)))
//("edit" [c: bool] Some(Self::Edit(c)))
//("color" [] Some(Self::Color(ItemTheme::random())))
//("color" [c: Color] Some(Self::Color(c.map(ItemTheme::from).expect("no color"))))
//("enqueue" [c: Arc<RwLock<MidiClip>>] Some(Self::Enqueue(c)))
//("launch" [] Some(Self::Launch))
//("select" [t: Selection] Some(t.map(Self::Select).expect("no selection")))
//("clock" [,..a] ns!(ClockCommand, app.clock(), a, Self::Clock))
//("scene" [,..a] ns!(SceneCommand, app, a, Self::Scene))
//("track" [,..a] ns!(TrackCommand, app, a, Self::Track))
//("input" [,..a] ns!(InputCommand, app, a, Self::Input))
//("output" [,..a] ns!(OutputCommand, app, a, Self::Output))
//("clip" [,..a] ns!(ClipCommand, app, a, Self::Clip))
//("device" [,..a] ns!(DeviceCommand, app, a, Self::Device))
//("message" [,..a] ns!(MessageCommand, app, a, Self::Message))
//("pool" [,..a] app.pool.as_ref().map(|p|ns!(PoolCommand, p, a, Self::Pool)).flatten())
//("editor" [,..a] app.editor().map(|e|ns!(MidiEditCommand, e, a, Self::Editor)).flatten())
//("sampler" [,..a] app.sampler().map(|s|ns!(SamplerCommand, s, a, Self::Sampler)).flatten())
//("select" [t: usize, s: usize] Some(match (t.expect("no track"), s.expect("no scene")) {
//(0, 0) => Self::Select(Selection::Mix),
//(t, 0) => Self::Select(Selection::Track(t)),
//(0, s) => Self::Select(Selection::Scene(s)),
//(t, s) => Self::Select(Selection::TrackClip { track: t, scene: s }) })))
}
(TekCommand
(Sampler [cmd: SamplerCommand] app.sampler_mut().map(|s|cmd.delegate(s, Self::Sampler)).transpose()?.flatten())
(Scene [cmd: SceneCommand] cmd.delegate(app, Self::Scene)?)
(Track [cmd: TrackCommand] cmd.delegate(app, Self::Track)?)
(Output [cmd: OutputCommand] cmd.delegate(app, Self::Output)?)
(Input [cmd: InputCommand] cmd.delegate(app, Self::Input)?)
(Clip [cmd: ClipCommand] cmd.delegate(app, Self::Clip)?)
(Clock [cmd: ClockCommand] cmd.delegate(app, Self::Clock)?)
(Device [cmd: DeviceCommand] cmd.delegate(app, Self::Device)?)
(Message [cmd: MessageCommand] cmd.delegate(app, Self::Message)?)
(Editor [cmd: MidiEditCommand] delegate_to_editor(app, cmd)?)
(Pool [cmd: PoolCommand] delegate_to_pool(app, cmd)?)
(ToggleHelp [] cmd!(app.toggle_dialog(Some(Dialog::Help))))
(ToggleMenu [] cmd!(app.toggle_dialog(Some(Dialog::Menu))))
(Color [p: ItemTheme] app.set_color(Some(p)).map(Self::Color))
(Enqueue [c: MaybeClip] cmd_todo!("\n\rtodo: enqueue {c:?}"))
(History [d: isize] cmd_todo!("\n\rtodo: history {d:?}"))
(Zoom [z: Option<usize>] cmd_todo!("\n\rtodo: zoom {z:?}"))
(Edit [value: Option<bool>] cmd!(app.toggle_editor(value)))
(Launch [] cmd!(app.launch()))
(Select [s: Selection] cmd!(app.select(s)))
(StopAll [] cmd!(app.stop_all())))
#[tengri_proc::command(Tek)]
impl InputCommand {
fn add (&self, state: &mut tek) -> option<self> {
state.midi_in_add()?;
none
}
}
(InputCommand
(Add [] cmd!(app.midi_in_add()?)))
#[tengri_proc::command(Tek)]
impl OutputCommand {
fn add (&self, state: &mut tek) -> option<self> {
state.midi_out_add()?;
none
}
}
(OutputCommand
(Add [] cmd!(app.midi_out_add()?)))
#[tengri_proc::command(Tek)]
impl DeviceCommand {
//(Picker [] cmd!(app.device_picker_show()))
//(Pick [i: usize] cmd!(app.device_pick(i)))
//(Add [i: usize] cmd!(app.device_add(i))))
//("picker" [] Some(Self::Picker))
//("pick" [index: usize] Some(Self::Pick(index.unwrap())))
//("add" [index: usize] Some(Self::Add(index.unwrap()))))
}
(DeviceCommand
(Picker [] cmd!(app.device_picker_show()))
(Pick [i: usize] cmd!(app.device_pick(i)))
(Add [i: usize] cmd!(app.device_add(i))))
#[tengri_proc::command(Tek)]
impl MessageCommand {
//(Dismiss [] cmd!(app.message_dismiss())))
//("dismiss" [] Some(Self::Dismiss)))
}
(MessageCommand
(Dismiss [] cmd!(app.message_dismiss())))
#[tengri_proc::command(Tek)]
impl TrackCommand {
//(TogglePlay [] Some(Self::TogglePlay))
//(ToggleSolo [] Some(Self::ToggleSolo))
//(SetSize [t: usize] cmd_todo!("\n\rtodo: {self:?}"))
//(SetZoom [z: usize] cmd_todo!("\n\rtodo: {self:?}"))
//(Swap [a: usize, b: usize] cmd_todo!("\n\rtodo: {self:?}"))
//(Del [index: usize] cmd!(app.track_del(index)))
//(Stop [index: usize] cmd!(app.tracks[index].player.enqueue_next(None)))
//(Add [] Some(Self::Del(app.track_add_focus()?)))
//(SetColor [i: usize, c: ItemTheme] Some(Self::SetColor(i, app.track_set_color(i, c))))
//(ToggleRec [] { app.track_toggle_record(); Some(Self::ToggleRec) })
//(ToggleMon [] { app.track_toggle_monitor(); Some(Self::ToggleMon) }))
//("add" [] Some(Self::Add))
//("size" [a: usize] Some(Self::SetSize(a.unwrap())))
//("zoom" [a: usize] Some(Self::SetZoom(a.unwrap())))
//("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemTheme::random())))
//("delete" [a: Option<usize>] Some(Self::Del(a.flatten().unwrap())))
//("stop" [a: usize] Some(Self::Stop(a.unwrap())))
//("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap())))
//("play" [] Some(Self::TogglePlay))
//("solo" [] Some(Self::ToggleSolo))
//("rec" [] Some(Self::ToggleRec))
//("mon" [] Some(Self::ToggleMon))));
}
(TrackCommand
(TogglePlay [] Some(Self::TogglePlay))
(ToggleSolo [] Some(Self::ToggleSolo))
(SetSize [t: usize] cmd_todo!("\n\rtodo: {self:?}"))
(SetZoom [z: usize] cmd_todo!("\n\rtodo: {self:?}"))
(Swap [a: usize, b: usize] cmd_todo!("\n\rtodo: {self:?}"))
(Del [index: usize] cmd!(app.track_del(index)))
(Stop [index: usize] cmd!(app.tracks[index].player.enqueue_next(None)))
(Add [] Some(Self::Del(app.track_add_focus()?)))
(SetColor [i: usize, c: ItemTheme] Some(Self::SetColor(i, app.track_set_color(i, c))))
(ToggleRec [] { app.track_toggle_record(); Some(Self::ToggleRec) })
(ToggleMon [] { app.track_toggle_monitor(); Some(Self::ToggleMon) }))
#[tengri_proc::command(Tek)]
impl SceneCommand {
//(Swap [a: usize, b: usize] cmd_todo!("\n\rtodo: {self:?}"))
//(SetSize [index: usize] cmd_todo!("\n\rtodo: {self:?}"))
//(SetZoom [zoom: usize] cmd_todo!("\n\rtodo: {self:?}"))
//(Enqueue [scene: usize] cmd!(app.scene_enqueue(scene)))
//(Del [index: usize] cmd!(app.scene_del(index)))
//(Add [] Some(Self::Del(app.scene_add_focus()?)))
//(SetColor [i: usize, c: ItemTheme] Some(Self::SetColor(i, app.scene_set_color(i, c)))))
//("add" [] Some(Self::Add))
//("delete" [a: Option<usize>] Some(Self::Del(a.flatten().unwrap())))
//("zoom" [a: usize] Some(Self::SetZoom(a.unwrap())))
//("color" [a: usize] Some(Self::SetColor(a.unwrap(), ItemTheme::G[128])))
//("enqueue" [a: usize] Some(Self::Enqueue(a.unwrap())))
//("swap" [a: usize, b: usize] Some(Self::Swap(a.unwrap(), b.unwrap()))))
}
(SceneCommand
(Swap [a: usize, b: usize] cmd_todo!("\n\rtodo: {self:?}"))
(SetSize [index: usize] cmd_todo!("\n\rtodo: {self:?}"))
(SetZoom [zoom: usize] cmd_todo!("\n\rtodo: {self:?}"))
(Enqueue [scene: usize] cmd!(app.scene_enqueue(scene)))
(Del [index: usize] cmd!(app.scene_del(index)))
(Add [] Some(Self::Del(app.scene_add_focus()?)))
(SetColor [i: usize, c: ItemTheme] Some(Self::SetColor(i, app.scene_set_color(i, c)))))
(ClipCommand
(Get [a: usize, b: usize] cmd_todo!("\n\rtodo: clip: get: {a} {b}"))
(Edit [clip: MaybeClip] cmd_todo!("\n\rtodo: clip: edit: {clip:?}"))
(SetLoop [t: usize, s: usize, l: bool] cmd_todo!("\n\rtodo: {self:?}"))
(Put [t: usize, s: usize, c: MaybeClip]
Some(Self::Put(t, s, app.clip_put(t, s, c))))
(Enqueue [t: usize, s: usize]
cmd!(app.tracks[t].player.enqueue_next(app.scenes[s].clips[t].as_ref())))
(SetColor [t: usize, s: usize, c: ItemTheme]
app.clip_set_color(t, s, c).map(|o|Self::SetColor(t, s, o)))));
#[tengri_proc::command(Tek)]
impl ClipCommand {
//(Get [a: usize, b: usize] cmd_todo!("\n\rtodo: clip: get: {a} {b}"))
//(Edit [clip: MaybeClip] cmd_todo!("\n\rtodo: clip: edit: {clip:?}"))
//(SetLoop [t: usize, s: usize, l: bool] cmd_todo!("\n\rtodo: {self:?}"))
//(Put [t: usize, s: usize, c: MaybeClip]
//Some(Self::Put(t, s, app.clip_put(t, s, c))))
//(Enqueue [t: usize, s: usize]
//cmd!(app.tracks[t].player.enqueue_next(app.scenes[s].clips[t].as_ref())))
//(SetColor [t: usize, s: usize, c: ItemTheme]
//app.clip_set_color(t, s, c).map(|o|Self::SetColor(t, s, o)))));
//("edit" [a: MaybeClip] Some(Self::Edit(a.unwrap())))
//("color" [a: usize, b: usize] Some(Self::SetColor(a.unwrap(), b.unwrap(), ItemTheme::random())))
//("enqueue" [a: usize, b: usize] Some(Self::Enqueue(a.unwrap(), b.unwrap())))
//("get" [a: usize, b: usize] Some(Self::Get(a.unwrap(), b.unwrap())))
//("loop" [a: usize, b: usize, c: bool] Some(Self::SetLoop(a.unwrap(), b.unwrap(), c.unwrap())))
//("put" [a: usize, b: usize, c: MaybeClip] Some(Self::Put(a.unwrap(), b.unwrap(), c.unwrap())))
//("delete" [a: usize, b: usize] Some(Self::Put(a.unwrap(), b.unwrap(), None))))
}
fn delegate_to_editor (app: &mut Tek, cmd: MidiEditCommand) -> Perhaps<TekCommand> {
Ok(app.editor.as_mut().map(|editor|cmd.delegate(editor, TekCommand::Editor))

View file

@ -76,13 +76,14 @@ impl Tek {
)))
))
}
}
impl Tek {
fn view_dialog_menu (&self) -> impl Content<TuiOut> {
let options = ||["Projects", "Settings", "Help", "Quit"].iter();
let option = |a,i|Tui::fg(Rgb(255,255,255), format!("{}", a));
Bsp::s(Tui::bold(true, "tek!"), Bsp::s("", Map::south(1, options, option)))
}
fn view_dialog_help (&self) -> impl Content<TuiOut> + use<'_> {
let bindings = ||self.config.keys.layers.iter()
.filter_map(|a|(a.0)(self).then_some(a.1))