TrackList has back-pointer to project...

... and Track::GetOwner() is publicized, so that now you can find the
the AudacityProject, if any, that owns a given Track; this will help eliminate
some uses of GetActiveProject
This commit is contained in:
Paul Licameli 2019-05-21 11:22:19 -04:00
parent c7984a2c83
commit a93c4472f5
10 changed files with 35 additions and 24 deletions

View File

@ -12,7 +12,7 @@
wxDEFINE_EVENT( EVT_CLIPBOARD_CHANGE, wxCommandEvent);
Clipboard::Clipboard()
: mTracks { TrackList::Create() }
: mTracks { TrackList::Create( nullptr ) }
{
}

View File

@ -767,7 +767,7 @@ void ProjectAudioManager::SetupCutPreviewTracks(double WXUNUSED(playStart), doub
{
auto trackRange = TrackList::Get( *p ).Selected< const PlayableTrack >();
if( !trackRange.empty() ) {
auto cutPreviewTracks = TrackList::Create();
auto cutPreviewTracks = TrackList::Create( nullptr );
for (const auto track1 : trackRange) {
// Duplicate and change tracks
// Clear has a very small chance of throwing

View File

@ -204,7 +204,7 @@ auto ProjectFileManager::ReadProjectFile( const FilePath &fileName )
// the version saved on disk will be preserved until the
// user selects Save().
mLastSavedTracks = TrackList::Create();
mLastSavedTracks = TrackList::Create( nullptr );
auto &tracks = TrackList::Get( project );
for (auto t : tracks.Any()) {
@ -589,7 +589,7 @@ bool ProjectFileManager::DoSave (const bool fromSaveAs,
if (mLastSavedTracks)
mLastSavedTracks->Clear();
mLastSavedTracks = TrackList::Create();
mLastSavedTracks = TrackList::Create( nullptr );
auto &tracks = TrackList::Get( proj );
for ( auto t : tracks.Any() ) {
@ -643,7 +643,7 @@ bool ProjectFileManager::SaveCopyWaveTracks(const FilePath & strProjectPathName,
// Copy the tracks because we're going to do some state changes before exporting.
unsigned int numWaveTracks = 0;
auto ppSavedTrackList = TrackList::Create();
auto ppSavedTrackList = TrackList::Create( nullptr );
auto &pSavedTrackList = *ppSavedTrackList;
auto trackRange = tracks.Any< WaveTrack >();

View File

@ -492,7 +492,7 @@ wxDEFINE_EVENT(EVT_TRACKLIST_DELETION, TrackListEvent);
long TrackList::sCounter = -1;
static const AudacityProject::AttachedObjects::RegisteredFactory key{
[](AudacityProject&) { return TrackList::Create(); }
[](AudacityProject &project) { return TrackList::Create( &project ); }
};
TrackList &TrackList::Get( AudacityProject &project )
@ -505,17 +505,19 @@ const TrackList &TrackList::Get( const AudacityProject &project )
return Get( const_cast< AudacityProject & >( project ) );
}
TrackList::TrackList()
TrackList::TrackList( AudacityProject *pOwner )
: wxEvtHandler()
, mOwner{ pOwner }
{
}
// Factory function
std::shared_ptr<TrackList> TrackList::Create()
std::shared_ptr<TrackList> TrackList::Create( AudacityProject *pOwner )
{
return std::make_shared<TrackList>();
return std::make_shared<TrackList>( pOwner );
}
#if 0
TrackList &TrackList::operator= (TrackList &&that)
{
if (this != &that) {
@ -524,6 +526,7 @@ TrackList &TrackList::operator= (TrackList &&that)
}
return *this;
}
#endif
void TrackList::Swap(TrackList &that)
{

View File

@ -285,9 +285,9 @@ public:
bool HasOwner() const { return static_cast<bool>(GetOwner());}
private:
std::shared_ptr<TrackList> GetOwner() const { return mList.lock(); }
private:
Track *GetLink() const;
bool GetLinked () const { return mLinked; }
@ -1141,9 +1141,9 @@ class TrackList final
TrackList(const TrackList &that) = delete;
TrackList &operator= (const TrackList&) = delete;
// Allow move
TrackList(TrackList &&that) : TrackList() { Swap(that); }
TrackList& operator= (TrackList&&);
// No need for move, disallow it
TrackList(TrackList &&that) = delete;
TrackList& operator= (TrackList&&) = delete;
void clear() = delete;
@ -1153,10 +1153,10 @@ class TrackList final
// Create an empty TrackList
// Don't call directly -- use Create() instead
TrackList();
explicit TrackList( AudacityProject *pOwner );
// Create an empty TrackList
static std::shared_ptr<TrackList> Create();
static std::shared_ptr<TrackList> Create( AudacityProject *pOwner );
// Move is defined in terms of Swap
void Swap(TrackList &that);
@ -1164,6 +1164,10 @@ class TrackList final
// Destructor
virtual ~TrackList();
// Find the owning project, which may be null
AudacityProject *GetOwner() { return mOwner; }
const AudacityProject *GetOwner() const { return mOwner; }
// Iteration
// Hide the inherited begin() and end()
@ -1561,6 +1565,8 @@ public:
bool HasPendingTracks() const;
private:
AudacityProject *mOwner;
// Need to put pending tracks into a list so that GetLink() works
ListOfTracks mPendingUpdates;
// This is in correspondence with mPendingUpdates

View File

@ -254,7 +254,7 @@ void UndoManager::ModifyState(const TrackList * l,
stack[current]->state.tracks.reset();
// Duplicate
auto tracksCopy = TrackList::Create();
auto tracksCopy = TrackList::Create( nullptr );
for (auto t : *l) {
if ( t->GetId() == TrackId{} )
// Don't copy a pending added track
@ -294,7 +294,7 @@ void UndoManager::PushState(const TrackList * l,
return;
}
auto tracksCopy = TrackList::Create();
auto tracksCopy = TrackList::Create( nullptr );
for (auto t : *l) {
if ( t->GetId() == TrackId{} )
// Don't copy a pending added track

View File

@ -1983,7 +1983,7 @@ void Effect::CopyInputTracks(bool allSyncLockSelected)
mIMap.clear();
mOMap.clear();
mOutputTracks = TrackList::Create();
mOutputTracks = TrackList::Create( nullptr );
auto trackRange = mTracks->Any() +
[&] (const Track *pTrack) {
@ -2271,7 +2271,9 @@ void Effect::Preview(bool dryOnly)
} );
// Build NEW tracklist from rendering tracks
auto uTracks = TrackList::Create();
// Set the same owning project, so FindProject() can see it within Process()
const auto pProject = saveTracks->GetOwner();
auto uTracks = TrackList::Create( pProject );
mTracks = uTracks.get();
// Linear Effect preview optimised by pre-mixing to one track.

View File

@ -339,7 +339,7 @@ bool EffectEqualization48x::TrackCompare()
SecondIMap.clear();
SecondOMap.clear();
auto pSecondOutputTracks = TrackList::Create();
auto pSecondOutputTracks = TrackList::Create( nullptr );
auto &SecondOutputTracks = *pSecondOutputTracks;
for (auto aTrack :

View File

@ -256,7 +256,7 @@ void OnCut(const CommandContext &context)
auto &clipboard = Clipboard::Get();
clipboard.Clear();
auto pNewClipboard = TrackList::Create();
auto pNewClipboard = TrackList::Create( nullptr );
auto &newClipboard = *pNewClipboard;
tracks.Selected().Visit(
@ -361,7 +361,7 @@ void OnCopy(const CommandContext &context)
auto &clipboard = Clipboard::Get();
clipboard.Clear();
auto pNewClipboard = TrackList::Create();
auto pNewClipboard = TrackList::Create( nullptr );
auto &newClipboard = *pNewClipboard;
for (auto n : tracks.Selected()) {
@ -681,7 +681,7 @@ void OnSplitCut(const CommandContext &context)
auto &clipboard = Clipboard::Get();
clipboard.Clear();
auto pNewClipboard = TrackList::Create();
auto pNewClipboard = TrackList::Create( nullptr );
auto &newClipboard = *pNewClipboard;
Track::Holder dest;

View File

@ -190,7 +190,7 @@ void EditClipboardByLabel( AudacityProject &project,
auto &clipboard = Clipboard::Get();
clipboard.Clear();
auto pNewClipboard = TrackList::Create();
auto pNewClipboard = TrackList::Create( nullptr );
auto &newClipboard = *pNewClipboard;
//Apply action on wavetracks starting from