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_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]
([bool]
(":mode-editor" self.is_editing())
@ -49,58 +59,45 @@ expose!([self: Tek]
(":scene-prev" self.selected.scene_prev())
(":track-next" self.selected.track_next(self.tracks.len()))
(":track-prev" self.selected.track_prev())));
provide!(bool: |self: MidiPool| {});
provide!(MidiClip: |self: MidiPool| {
":new-clip" => self.new_clip(),
":cloned-clip" => self.cloned_clip(),
});
provide!(PathBuf: |self: MidiPool| {});
provide!(Arc<str>: |self: MidiPool| {});
provide!(usize: |self: MidiPool| {
":current" => 0,
":after" => 0,
":previous" => 0,
":next" => 0
});
provide!(ItemColor: |self: MidiPool| {
":random-color" => ItemColor::random()
});
provide!(bool: |self: MidiEditor| {
":true" => true,
":false" => false,
":time-lock" => self.time_lock().get(),
":time-lock-toggle" => !self.time_lock().get(),
});
provide!(usize: |self: MidiEditor| {
":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),
});
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: 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:

View file

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