1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
/**********************************************************************
Audacity: A Digital Audio Editor
UndoManager.cpp
Dominic Mazzoni
**********************************************************************/
#include "UndoManager.h"
#include "Track.h"
#include "WaveTrack.h" // temp
UndoManager::UndoManager()
{
current = -1;
}
UndoManager::~UndoManager()
{
ClearStates();
}
void UndoManager::ClearStates()
{
for (int i = stack.Count() - 1; i >= 0; i--) {
TrackListIterator iter(stack[i]->tracks);
VTrack *t = iter.First();
while (t) {
delete t;
t = iter.Next();
}
stack.RemoveAt(i);
}
current = -1;
}
bool UndoManager::UndoAvailable()
{
return (current > 0);
}
bool UndoManager::RedoAvailable()
{
return (current < stack.Count() - 1);
}
void UndoManager::PushState(TrackList * l, double sel0, double sel1)
{
int i;
for (i = current + 1; i < stack.Count(); i++) {
TrackListIterator iter(stack[i]->tracks);
VTrack *t = iter.First();
while (t) {
delete t;
t = iter.Next();
}
}
i = stack.Count() - 1;
while (i > current)
stack.RemoveAt(i--);
TrackList *tracksCopy = new TrackList();
TrackListIterator iter(l);
VTrack *t = iter.First();
while (t) {
tracksCopy->Add(t->Duplicate());
t = iter.Next();
}
UndoStackElem *push = new UndoStackElem();
push->tracks = tracksCopy;
push->sel0 = sel0;
push->sel1 = sel1;
stack.Add(push);
current++;
}
TrackList *UndoManager::Undo(double *sel0, double *sel1)
{
wxASSERT(UndoAvailable());
current--;
*sel0 = stack[current]->sel0;
*sel1 = stack[current]->sel1;
return stack[current]->tracks;
}
TrackList *UndoManager::Redo(double *sel0, double *sel1)
{
wxASSERT(RedoAvailable());
current++;
*sel0 = stack[current]->sel0;
*sel1 = stack[current]->sel1;
return stack[current]->tracks;
}
void UndoManager::Debug()
{
for (int i = 0; i < stack.Count(); i++) {
TrackListIterator iter(stack[i]->tracks);
WaveTrack *t = (WaveTrack *) (iter.First());
printf("*%d* %s %d\n", i, (i == current) ? "-->" : " ",
t ? t->numSamples : 0);
}
}
|