mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-22 23:30:07 +02:00
Define UndoState
This commit is contained in:
parent
a5b6c9fd8f
commit
e12a060751
@ -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());
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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()
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user