phosphor_app/state/
undo.rs1use super::TrackState;
7use phosphor_core::clip::NoteSnapshot;
8
9#[derive(Debug, Clone)]
11pub enum UndoAction {
12 DeleteNotes {
14 track_idx: usize,
15 clip_idx: usize,
16 notes: Vec<NoteSnapshot>,
17 },
18 PasteNotes {
20 track_idx: usize,
21 clip_idx: usize,
22 notes: Vec<NoteSnapshot>,
23 },
24 DrawNote {
26 track_idx: usize,
27 clip_idx: usize,
28 note: NoteSnapshot,
29 },
30 RemoveNote {
32 track_idx: usize,
33 clip_idx: usize,
34 note: NoteSnapshot,
35 },
36 DeleteClip {
38 track_idx: usize,
39 clip_idx: usize,
40 clip: super::Clip,
41 },
42 MoveNotes {
45 track_idx: usize,
46 clip_idx: usize,
47 before: Vec<(usize, NoteSnapshot)>,
49 },
50 ModifyClip {
53 track_idx: usize,
54 clip_idx: usize,
55 prev_start: i64,
56 prev_length: i64,
57 prev_notes: Vec<NoteSnapshot>,
58 prev_hidden: Vec<(i64, i64, u8, u8)>,
59 },
60 AddClip {
62 track_idx: usize,
63 clip_idx: usize,
64 },
65 DeleteTrack {
67 track_idx: usize,
68 track: TrackState,
69 mixer_id: usize,
70 },
71}
72
73#[derive(Debug)]
75pub struct UndoStack {
76 undo: Vec<UndoAction>,
77 redo: Vec<UndoAction>,
78 max_size: usize,
79}
80
81impl Default for UndoStack {
82 fn default() -> Self { Self::new() }
83}
84
85impl UndoStack {
86 pub fn new() -> Self {
87 Self { undo: Vec::new(), redo: Vec::new(), max_size: 100 }
88 }
89
90 pub fn push(&mut self, action: UndoAction) {
92 self.undo.push(action);
93 self.redo.clear();
94 if self.undo.len() > self.max_size {
95 self.undo.remove(0);
96 }
97 }
98
99 pub fn push_undo_only(&mut self, action: UndoAction) {
101 self.undo.push(action);
102 if self.undo.len() > self.max_size {
103 self.undo.remove(0);
104 }
105 }
106
107 pub fn pop_undo(&mut self) -> Option<UndoAction> {
109 self.undo.pop()
110 }
111
112 pub fn push_redo(&mut self, action: UndoAction) {
114 self.redo.push(action);
115 }
116
117 pub fn pop_redo(&mut self) -> Option<UndoAction> {
119 self.redo.pop()
120 }
121
122 pub fn can_undo(&self) -> bool { !self.undo.is_empty() }
123 pub fn can_redo(&self) -> bool { !self.redo.is_empty() }
124}