use crate::*; pub trait MidiViewer: HasSize + MidiRange + MidiPoint + Debug + Send + Sync { fn buffer_size (&self, phrase: &MidiClip) -> (usize, usize); fn redraw (&self); fn phrase (&self) -> &Option>>; fn phrase_mut (&mut self) -> &mut Option>>; fn set_phrase (&mut self, phrase: Option<&Arc>>) { *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); } }