1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-22 23:30:07 +02:00

Define UndoState

This commit is contained in:
Paul Licameli 2016-02-09 09:47:46 -05:00
parent a5b6c9fd8f
commit e12a060751
5 changed files with 51 additions and 45 deletions

View File

@ -3772,8 +3772,8 @@ void AudacityProject::OnUndo()
return;
}
TrackList *l = GetUndoManager()->Undo(&mViewInfo.selectedRegion);
PopState(l);
const UndoState &state = GetUndoManager()->Undo(&mViewInfo.selectedRegion);
PopState(state);
mTrackPanel->SetFocusedTrack(NULL);
mTrackPanel->EnsureVisible(mTrackPanel->GetFirstSelectedTrack());
@ -3797,8 +3797,8 @@ void AudacityProject::OnRedo()
return;
}
TrackList *l = GetUndoManager()->Redo(&mViewInfo.selectedRegion);
PopState(l);
const UndoState &state = GetUndoManager()->Redo(&mViewInfo.selectedRegion);
PopState(state);
mTrackPanel->SetFocusedTrack(NULL);
mTrackPanel->EnsureVisible(mTrackPanel->GetFirstSelectedTrack());

View File

@ -4052,10 +4052,12 @@ void AudacityProject::ModifyState(bool bWantsAutoSave)
// LL: Is there a memory leak here as "l" and "t" are not deleted???
// Vaughan, 2010-08-29: No, as "l" is a TrackList* of an Undo stack state.
// Need to keep it and its tracks "t" available for Undo/Redo/SetStateTo.
void AudacityProject::PopState(TrackList * l)
void AudacityProject::PopState(const UndoState &state)
{
TrackList *const tracks = state.tracks.get();
mTracks->Clear(true);
TrackListIterator iter(l);
TrackListIterator iter(tracks);
Track *t = iter.First();
bool odUsed = false;
ODComputeSummaryTask* computeTask = NULL;
@ -4104,9 +4106,9 @@ void AudacityProject::PopState(TrackList * l)
void AudacityProject::SetStateTo(unsigned int n)
{
TrackList *l =
const UndoState &state =
GetUndoManager()->SetStateTo(n, &mViewInfo.selectedRegion);
PopState(l);
PopState(state);
HandleResize();
mTrackPanel->SetFocusedTrack(NULL);

View File

@ -84,6 +84,7 @@ class MixerBoard;
class MixerBoardFrame;
struct AudioIOStartStreamOptions;
struct UndoState;
class WaveTrackArray;
class Regions;
@ -498,7 +499,7 @@ public:
void InitialState();
void ModifyState(bool bWantsAutoSave); // if true, writes auto-save file. Should set only if you really want the state change restored after
// a crash, as it can take many seconds for large (eg. 10 track-hours) projects
void PopState(TrackList * l);
void PopState(const UndoState &state);
void UpdateLyrics();
void UpdateMixerBoard();

View File

@ -36,9 +36,22 @@ UndoManager
WX_DECLARE_HASH_SET(BlockFile *, wxPointerHash, wxPointerEqual, Set );
UndoStackElem::~UndoStackElem()
{
}
struct UndoStackElem {
UndoStackElem(std::unique_ptr<TrackList> &&tracks_,
const wxString &description_,
const wxString &shortDescription_,
const SelectedRegion &selectedRegion_)
: state(std::move(tracks_), selectedRegion_)
, description(description_)
, shortDescription(shortDescription_)
{
}
UndoState state;
wxString description;
wxString shortDescription;
};
UndoManager::UndoManager()
{
@ -74,7 +87,7 @@ void UndoManager::CalculateSpaceUsage()
cur->clear();
// Scan all tracks at current level
WaveTrack *wt = (WaveTrack *) iter.First(stack[i]->tracks.get());
WaveTrack *wt = (WaveTrack *) iter.First(stack[i]->state.tracks.get());
while (wt)
{
// Scan all clips within current track
@ -191,7 +204,7 @@ void UndoManager::ModifyState(const TrackList * l,
SonifyBeginModifyState();
// Delete current -- not necessary, but let's reclaim space early
stack[current]->tracks.reset();
stack[current]->state.tracks.reset();
// Duplicate
auto tracksCopy = std::make_unique<TrackList>(true);
@ -203,8 +216,8 @@ void UndoManager::ModifyState(const TrackList * l,
}
// Replace
stack[current]->tracks = std::move(tracksCopy);
stack[current]->selectedRegion = selectedRegion;
stack[current]->state.tracks = std::move(tracksCopy);
stack[current]->state.selectedRegion = selectedRegion;
SonifyEndModifyState();
}
@ -257,8 +270,8 @@ void UndoManager::PushState(const TrackList * l,
lastAction = longDescription;
}
TrackList *UndoManager::SetStateTo(unsigned int n,
SelectedRegion *selectedRegion)
const UndoState &UndoManager::SetStateTo
(unsigned int n, SelectedRegion *selectedRegion)
{
n -= 1;
@ -267,39 +280,39 @@ TrackList *UndoManager::SetStateTo(unsigned int n,
current = n;
if (current == int(stack.size()-1)) {
*selectedRegion = stack[current]->selectedRegion;
*selectedRegion = stack[current]->state.selectedRegion;
}
else {
*selectedRegion = stack[current + 1]->selectedRegion;
*selectedRegion = stack[current + 1]->state.selectedRegion;
}
lastAction = wxT("");
consolidationCount = 0;
return stack[current]->tracks.get();
return stack[current]->state;
}
TrackList *UndoManager::Undo(SelectedRegion *selectedRegion)
const UndoState &UndoManager::Undo(SelectedRegion *selectedRegion)
{
wxASSERT(UndoAvailable());
current--;
*selectedRegion = stack[current]->selectedRegion;
*selectedRegion = stack[current]->state.selectedRegion;
lastAction = wxT("");
consolidationCount = 0;
return stack[current]->tracks.get();
return stack[current]->state;
}
TrackList *UndoManager::Redo(SelectedRegion *selectedRegion)
const UndoState &UndoManager::Redo(SelectedRegion *selectedRegion)
{
wxASSERT(RedoAvailable());
current++;
*selectedRegion = stack[current]->selectedRegion;
*selectedRegion = stack[current]->state.selectedRegion;
/*
if (!RedoAvailable()) {
@ -317,7 +330,7 @@ TrackList *UndoManager::Redo(SelectedRegion *selectedRegion)
lastAction = wxT("");
consolidationCount = 0;
return stack[current]->tracks.get();
return stack[current]->state;
}
bool UndoManager::UnsavedChanges()

View File

@ -57,24 +57,14 @@
class Track;
class TrackList;
struct UndoStackElem {
UndoStackElem(std::unique_ptr<TrackList> &&tracks_,
const wxString &description_,
const wxString &shortDescription_,
const SelectedRegion &selectedRegion_)
: tracks(std::move(tracks_))
, description(description_)
, shortDescription(shortDescription_)
, selectedRegion(selectedRegion_)
struct UndoStackElem;
struct UndoState {
UndoState(std::unique_ptr<TrackList> &&tracks_, const SelectedRegion &selectedRegion_)
: tracks(std::move(tracks_)), selectedRegion(selectedRegion_)
{}
~UndoStackElem();
std::unique_ptr<TrackList> tracks;
wxString description;
wxString shortDescription;
SelectedRegion selectedRegion;
SelectedRegion selectedRegion; // by value
};
using UndoStack = std::vector <std::unique_ptr<UndoStackElem>> ;
@ -115,9 +105,9 @@ class AUDACITY_DLL_API UndoManager {
wxLongLong_t GetLongDescription(unsigned int n, wxString *desc, wxString *size);
void SetLongDescription(unsigned int n, const wxString &desc);
TrackList *SetStateTo(unsigned int n, SelectedRegion *selectedRegion);
TrackList *Undo(SelectedRegion *selectedRegion);
TrackList *Redo(SelectedRegion *selectedRegion);
const UndoState &SetStateTo(unsigned int n, SelectedRegion *selectedRegion);
const UndoState &Undo(SelectedRegion *selectedRegion);
const UndoState &Redo(SelectedRegion *selectedRegion);
bool UndoAvailable();
bool RedoAvailable();