use expose! macro for MidiPool and MidiEditor

This commit is contained in:
🪞👃🪞 2025-05-04 15:43:51 +03:00
parent 79bf493004
commit 55b6745d4d
2 changed files with 51 additions and 54 deletions

View file

@ -7,6 +7,16 @@ macro_rules! ns { ($C:ty, $s:expr, $a:expr, $W:expr) => { <$C>::try_from_expr($s
macro_rules! cmd { ($cmd:expr) => {{ $cmd; None }}; } macro_rules! cmd { ($cmd:expr) => {{ $cmd; None }}; }
macro_rules! cmd_todo { ($msg:literal) => {{ println!($msg); None }}; } macro_rules! cmd_todo { ($msg:literal) => {{ println!($msg); None }}; }
handle!(TuiIn: |self: Tek, input|Ok(if let Some(command) = self.config.keys.command(self, input) {
let undo = command.execute(self)?;
if let Some(undo) = undo {
self.history.push(undo);
}
Some(true)
} else {
None
}));
expose!([self: Tek] expose!([self: Tek]
([bool] ([bool]
(":mode-editor" self.is_editing()) (":mode-editor" self.is_editing())
@ -49,58 +59,45 @@ expose!([self: Tek]
(":scene-prev" self.selected.scene_prev()) (":scene-prev" self.selected.scene_prev())
(":track-next" self.selected.track_next(self.tracks.len())) (":track-next" self.selected.track_next(self.tracks.len()))
(":track-prev" self.selected.track_prev()))); (":track-prev" self.selected.track_prev())));
provide!(bool: |self: MidiPool| {}); expose!([self: MidiPool]
provide!(MidiClip: |self: MidiPool| { ([bool])
":new-clip" => self.new_clip(), ([PathBuf])
":cloned-clip" => self.cloned_clip(), ([Arc<str>])
}); ([MidiClip]
provide!(PathBuf: |self: MidiPool| {}); (":new-clip" self.new_clip())
provide!(Arc<str>: |self: MidiPool| {}); (":cloned-clip" self.cloned_clip()))
provide!(usize: |self: MidiPool| { ([usize]
":current" => 0, (":current" 0)
":after" => 0, (":after" 0)
":previous" => 0, (":previous" 0)
":next" => 0 (":next" 0))
}); ([ItemColor]
provide!(ItemColor: |self: MidiPool| { (":random-color" ItemColor::random())));
":random-color" => ItemColor::random() expose!([self: MidiEditor]
}); ([bool]
provide!(bool: |self: MidiEditor| { (":true" true)
":true" => true, (":false" false)
":false" => false, (":time-lock" self.time_lock().get())
":time-lock" => self.time_lock().get(), (":time-lock-toggle" !self.time_lock().get()))
":time-lock-toggle" => !self.time_lock().get(), ([usize]
}); (":note-length" self.note_len())
provide!(usize: |self: MidiEditor| { (":note-pos" self.note_pos())
":note-length" => self.note_len(), (":note-pos-next" self.note_pos() + 1)
":note-pos" => self.note_pos(), (":note-pos-prev" self.note_pos().saturating_sub(1))
":note-pos-next" => self.note_pos() + 1, (":note-pos-next-octave" self.note_pos() + 12)
":note-pos-prev" => self.note_pos().saturating_sub(1), (":note-pos-prev-octave" self.note_pos().saturating_sub(12))
":note-pos-next-octave" => self.note_pos() + 12, (":note-len" self.note_len())
":note-pos-prev-octave" => self.note_pos().saturating_sub(12), (":note-len-next" self.note_len() + 1)
":note-len" => self.note_len(), (":note-len-prev" self.note_len().saturating_sub(1))
":note-len-next" => self.note_len() + 1, (":note-range" self.note_axis().get())
":note-len-prev" => self.note_len().saturating_sub(1), (":note-range-prev" self.note_axis().get() + 1)
":note-range" => self.note_axis().get(), (":note-range-next" self.note_axis().get().saturating_sub(1))
":note-range-prev" => self.note_axis().get() + 1, (":time-pos" self.time_pos())
":note-range-next" => self.note_axis().get().saturating_sub(1), (":time-pos-next" self.time_pos() + self.time_zoom().get())
":time-pos" => self.time_pos(), (":time-pos-prev" self.time_pos().saturating_sub(self.time_zoom().get()))
":time-pos-next" => self.time_pos() + self.time_zoom().get(), (":time-zoom" self.time_zoom().get())
":time-pos-prev" => self.time_pos().saturating_sub(self.time_zoom().get()), (":time-zoom-next" self.time_zoom().get() + 1)
":time-zoom" => self.time_zoom().get(), (":time-zoom-prev" self.time_zoom().get().saturating_sub(1).max(1))));
":time-zoom-next" => self.time_zoom().get() + 1,
":time-zoom-prev" => self.time_zoom().get().saturating_sub(1).max(1),
});
handle!(TuiIn: |self: Tek, input|Ok(if let Some(command) = self.config.keys.command(self, input) {
let undo = command.execute(self)?;
if let Some(undo) = undo {
self.history.push(undo);
}
Some(true)
} else {
None
}));
impose!([app: Tek] impose!([app: Tek]
(TekCommand: (TekCommand:

View file

@ -346,8 +346,8 @@ impl<'a> ArrangerView<'a> {
pub(crate) fn devices (&'a self) -> impl Content<TuiOut> + 'a { pub(crate) fn devices (&'a self) -> impl Content<TuiOut> + 'a {
let Self { width_side, width_mid, track_count, track_selected, is_editing, .. } = self; let Self { width_side, width_mid, track_count, track_selected, is_editing, .. } = self;
Tryptich::top(1) Tryptich::top(1)
.left(*width_side, button_3("x", "devices", format!("{}", 0), *is_editing)) .left(*width_side, button_3("z", "devices", format!("{}", 0), *is_editing))
.right(*width_side, button_2("X", "add device", *is_editing)) .right(*width_side, button_2("Z", "add device", *is_editing))
.middle(*width_mid, per_track_top(*width_mid, ||self.tracks_with_sizes_scrolled(), .middle(*width_mid, per_track_top(*width_mid, ||self.tracks_with_sizes_scrolled(),
move|index, track|{ move|index, track|{
wrap(if *track_selected == Some(index) { wrap(if *track_selected == Some(index) {