midi: return old values from cursor traits

This commit is contained in:
🪞👃🪞 2025-04-27 17:07:09 +03:00
parent 397e71edee
commit e9c825e865
6 changed files with 76 additions and 92 deletions

View file

@ -160,14 +160,14 @@ impl NoteRange for MidiEditor {
impl NotePoint for MidiEditor {
fn note_len (&self) -> usize { self.mode.note_len() }
fn set_note_len (&self, x: usize) { self.mode.set_note_len(x) }
fn set_note_len (&self, x: usize) -> usize { self.mode.set_note_len(x) }
fn note_pos (&self) -> usize { self.mode.note_pos() }
fn set_note_pos (&self, x: usize) { self.mode.set_note_pos(x) }
fn set_note_pos (&self, x: usize) -> usize { self.mode.set_note_pos(x) }
}
impl TimePoint for MidiEditor {
fn time_pos (&self) -> usize { self.mode.time_pos() }
fn set_time_pos (&self, x: usize) { self.mode.set_time_pos(x) }
fn set_time_pos (&self, x: usize) -> usize { self.mode.set_time_pos(x) }
}
impl MidiViewer for MidiEditor {

View file

@ -7,7 +7,7 @@ pub struct MidiPointModel {
/// Note coordinate of cursor
pub note_pos: Arc<AtomicUsize>,
/// Length of note that will be inserted, in pulses
pub note_len: Arc<AtomicUsize>,
pub note_len: Arc<AtomicUsize>,
}
impl Default for MidiPointModel {
@ -21,30 +21,52 @@ impl Default for MidiPointModel {
}
pub trait NotePoint {
fn note_len (&self) -> usize;
fn set_note_len (&self, x: usize);
fn note_pos (&self) -> usize;
fn set_note_pos (&self, x: usize);
fn note_end (&self) -> usize { self.note_pos() + self.note_len() }
/// Get the current length of the note cursor.
fn note_len (&self) -> usize;
/// Set the length of the note cursor, returning the previous value.
fn set_note_len (&self, x: usize) -> usize;
/// Get the current pitch of the note cursor.
fn note_pos (&self) -> usize;
/// Set the current pitch fo the note cursor, returning the previous value.
fn set_note_pos (&self, x: usize) -> usize;
}
pub trait TimePoint {
fn time_pos (&self) -> usize;
fn set_time_pos (&self, x: usize);
/// Get the current time position of the note cursor.
fn time_pos (&self) -> usize;
/// Set the current time position of the note cursor, returning the previous value.
fn set_time_pos (&self, x: usize) -> usize;
}
pub trait MidiPoint: NotePoint + TimePoint {}
pub trait MidiPoint: NotePoint + TimePoint {
/// Get the current end of the note cursor.
fn note_end (&self) -> usize {
self.time_pos() + self.note_len()
}
}
impl<T: NotePoint + TimePoint> MidiPoint for T {}
impl NotePoint for MidiPointModel {
fn note_len (&self) -> usize { self.note_len.load(Relaxed)}
fn set_note_len (&self, x: usize) { self.note_len.store(x, Relaxed) }
fn note_pos (&self) -> usize { self.note_pos.load(Relaxed).min(127) }
fn set_note_pos (&self, x: usize) { self.note_pos.store(x.min(127), Relaxed) }
fn note_len (&self) -> usize {
self.note_len.load(Relaxed)
}
fn set_note_len (&self, x: usize) -> usize {
self.note_len.swap(x, Relaxed)
}
fn note_pos (&self) -> usize {
self.note_pos.load(Relaxed).min(127)
}
fn set_note_pos (&self, x: usize) -> usize {
self.note_pos.swap(x.min(127), Relaxed)
}
}
impl TimePoint for MidiPointModel {
fn time_pos (&self) -> usize { self.time_pos.load(Relaxed) }
fn set_time_pos (&self, x: usize) { self.time_pos.store(x, Relaxed) }
fn time_pos (&self) -> usize {
self.time_pos.load(Relaxed)
}
fn set_time_pos (&self, x: usize) -> usize {
self.time_pos.swap(x, Relaxed)
}
}

View file

@ -242,14 +242,14 @@ impl NoteRange for PianoHorizontal {
impl NotePoint for PianoHorizontal {
fn note_len (&self) -> usize { self.point.note_len() }
fn set_note_len (&self, x: usize) { self.point.set_note_len(x) }
fn set_note_len (&self, x: usize) -> usize { self.point.set_note_len(x) }
fn note_pos (&self) -> usize { self.point.note_pos() }
fn set_note_pos (&self, x: usize) { self.point.set_note_pos(x) }
fn set_note_pos (&self, x: usize) -> usize { self.point.set_note_pos(x) }
}
impl TimePoint for PianoHorizontal {
fn time_pos (&self) -> usize { self.point.time_pos() }
fn set_time_pos (&self, x: usize) { self.point.set_time_pos(x) }
fn set_time_pos (&self, x: usize) -> usize { self.point.set_time_pos(x) }
}
impl MidiViewer for PianoHorizontal {