mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
66 lines
2.6 KiB
Rust
66 lines
2.6 KiB
Rust
use crate::*;
|
|
|
|
pub trait MidiViewer: HasSize<TuiOut> + MidiRange + MidiPoint + Debug + Send + Sync {
|
|
fn buffer_size (&self, phrase: &MidiClip) -> (usize, usize);
|
|
fn redraw (&self);
|
|
fn phrase (&self) -> &Option<Arc<RwLock<MidiClip>>>;
|
|
fn phrase_mut (&mut self) -> &mut Option<Arc<RwLock<MidiClip>>>;
|
|
fn set_phrase (&mut self, phrase: Option<&Arc<RwLock<MidiClip>>>) {
|
|
*self.phrase_mut() = phrase.cloned();
|
|
self.redraw();
|
|
}
|
|
/// Make sure cursor is within note range
|
|
fn autoscroll (&self) {
|
|
let note_point = self.note_point().min(127);
|
|
let note_lo = self.note_lo().get();
|
|
let note_hi = self.note_hi();
|
|
if note_point < note_lo {
|
|
self.note_lo().set(note_point);
|
|
} else if note_point > note_hi {
|
|
self.note_lo().set((note_lo + note_point).saturating_sub(note_hi));
|
|
}
|
|
}
|
|
/// Make sure time range is within display
|
|
fn autozoom (&self) {
|
|
if self.time_lock().get() {
|
|
let time_len = self.time_len().get();
|
|
let time_axis = self.time_axis().get();
|
|
let time_zoom = self.time_zoom().get();
|
|
loop {
|
|
let time_zoom = self.time_zoom().get();
|
|
let time_area = time_axis * time_zoom;
|
|
if time_area > time_len {
|
|
let next_time_zoom = NoteDuration::prev(time_zoom);
|
|
if next_time_zoom <= 1 {
|
|
break
|
|
}
|
|
let next_time_area = time_axis * next_time_zoom;
|
|
if next_time_area >= time_len {
|
|
self.time_zoom().set(next_time_zoom);
|
|
} else {
|
|
break
|
|
}
|
|
} else if time_area < time_len {
|
|
let prev_time_zoom = NoteDuration::next(time_zoom);
|
|
if prev_time_zoom > 384 {
|
|
break
|
|
}
|
|
let prev_time_area = time_axis * prev_time_zoom;
|
|
if prev_time_area <= time_len {
|
|
self.time_zoom().set(prev_time_zoom);
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if time_zoom != self.time_zoom().get() {
|
|
self.redraw()
|
|
}
|
|
}
|
|
//while time_len.div_ceil(time_zoom) > time_axis {
|
|
//println!("\r{time_len} {time_zoom} {time_axis}");
|
|
//time_zoom = Note::next(time_zoom);
|
|
//}
|
|
//self.time_zoom().set(time_zoom);
|
|
}
|
|
}
|