diff --git a/src/Project.cpp b/src/Project.cpp index 279e339db..0a09614a9 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -1958,12 +1958,7 @@ void AudacityProject::FixScrollbars() auto &tracks = *GetTracks(); for (const Track *track : tracks) { // Iterate over pending changed tracks if present. - { - auto other = - tracks.FindPendingChangedTrack(track->GetId()); - if (other) - track = other.get(); - } + track = track->SubstitutePendingChangedTrack().get(); LastTime = std::max( LastTime, track->GetEndTime() ); } LastTime = diff --git a/src/Track.cpp b/src/Track.cpp index 32e2404d2..fcd8ef6b9 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -1554,14 +1554,20 @@ bool TrackList::ApplyPendingTracks() return result; } -std::shared_ptr TrackList::FindPendingChangedTrack(TrackId id) const +std::shared_ptr Track::SubstitutePendingChangedTrack() const { // Linear search. Tracks in a project are usually very few. - auto it = std::find_if( mPendingUpdates.begin(), mPendingUpdates.end(), - [=](const ListOfTracks::value_type &ptr){ return ptr->GetId() == id; } ); - if (it == mPendingUpdates.end()) - return {}; - return *it; + auto pList = mList.lock(); + if (pList) { + const auto id = GetId(); + const auto end = pList->mPendingUpdates.end(); + auto it = std::find_if( + pList->mPendingUpdates.begin(), end, + [=](const ListOfTracks::value_type &ptr){ return ptr->GetId() == id; } ); + if (it != end) + return *it; + } + return Pointer( this ); } bool TrackList::HasPendingTracks() const diff --git a/src/Track.h b/src/Track.h index c4311ccc1..6dc4d0238 100644 --- a/src/Track.h +++ b/src/Track.h @@ -158,6 +158,10 @@ class AUDACITY_DLL_API Track /* not final */ return {}; } + // Find anything registered with TrackList::RegisterPendingChangedTrack and + // not yet cleared or applied; if no such exists, return this track + std::shared_ptr SubstitutePendingChangedTrack() const; + // Cause certain overriding tool modes (Zoom; future ones?) to behave // uniformly in all tracks, disregarding track contents. // Do not further override this... @@ -851,10 +855,6 @@ public: // Return true if the state of the track list really did change. bool ApplyPendingTracks(); - // Find anything registered with RegisterPendingChangedTrack and not yet - // cleared or applied - std::shared_ptr FindPendingChangedTrack(TrackId id) const; - bool HasPendingTracks() const; private: diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index c96d39018..489309c32 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -358,9 +358,7 @@ void TrackArtist::DrawTracks(TrackPanelDrawingContext &context, bool hasSolo = false; for (t = iter.First(); t; t = iter.Next()) { - auto other = tracks->FindPendingChangedTrack(t->GetId()); - if (other) - t = other.get(); + t = t->SubstitutePendingChangedTrack().get(); auto pt = dynamic_cast(t); if (pt && pt->GetSolo()) { hasSolo = true; @@ -385,9 +383,7 @@ void TrackArtist::DrawTracks(TrackPanelDrawingContext &context, t = iter.StartWith(start); while (t) { - auto other = tracks->FindPendingChangedTrack(t->GetId()); - if (other) - t = other.get(); + t = t->SubstitutePendingChangedTrack().get(); trackRect.y = t->GetY() - zoomInfo.vpos; trackRect.height = t->GetHeight(); diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 02201faad..1c6272018 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1193,9 +1193,7 @@ void TrackPanel::DrawEverythingElse(TrackPanelDrawingContext &context, VisibleTrackIterator iter(GetProject()); for (const Track *t = iter.First(); t; t = iter.Next()) { - auto other = GetTracks()->FindPendingChangedTrack(t->GetId()); - if (other) - t = other.get(); + t = t->SubstitutePendingChangedTrack().get(); trackRect.y = t->GetY() - mViewInfo->vpos; trackRect.height = t->GetHeight();