use super::TrackState;
use phosphor_core::clip::NoteSnapshot;
#[derive(Debug, Clone)]
pub enum UndoAction {
DeleteNotes {
track_idx: usize,
clip_idx: usize,
notes: Vec<NoteSnapshot>,
},
PasteNotes {
track_idx: usize,
clip_idx: usize,
notes: Vec<NoteSnapshot>,
},
DrawNote {
track_idx: usize,
clip_idx: usize,
note: NoteSnapshot,
},
RemoveNote {
track_idx: usize,
clip_idx: usize,
note: NoteSnapshot,
},
DeleteClip {
track_idx: usize,
clip_idx: usize,
clip: super::Clip,
},
DeleteTrack {
track_idx: usize,
track: TrackState,
mixer_id: usize,
},
}
#[derive(Debug)]
pub struct UndoStack {
undo: Vec<UndoAction>,
redo: Vec<UndoAction>,
max_size: usize,
}
impl Default for UndoStack {
fn default() -> Self { Self::new() }
}
impl UndoStack {
pub fn new() -> Self {
Self { undo: Vec::new(), redo: Vec::new(), max_size: 100 }
}
pub fn push(&mut self, action: UndoAction) {
self.undo.push(action);
self.redo.clear();
if self.undo.len() > self.max_size {
self.undo.remove(0);
}
}
pub fn push_undo_only(&mut self, action: UndoAction) {
self.undo.push(action);
if self.undo.len() > self.max_size {
self.undo.remove(0);
}
}
pub fn pop_undo(&mut self) -> Option<UndoAction> {
self.undo.pop()
}
pub fn push_redo(&mut self, action: UndoAction) {
self.redo.push(action);
}
pub fn pop_redo(&mut self) -> Option<UndoAction> {
self.redo.pop()
}
pub fn can_undo(&self) -> bool { !self.undo.is_empty() }
pub fn can_redo(&self) -> bool { !self.redo.is_empty() }
}