From 89748cbe3cb70e3e226596c4a95d6a7723a1b061 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Thu, 3 Nov 2016 22:10:57 -0400 Subject: [PATCH] Remove "skiplinked" argument of old track iterators --- src/Menus.cpp | 17 ++------- src/MixerBoard.cpp | 56 +++++++++++++--------------- src/Track.cpp | 61 +++++++++---------------------- src/Track.h | 30 +++++++-------- src/TrackPanelAx.cpp | 18 ++------- src/effects/TruncSilence.cpp | 15 +++----- src/tracks/ui/TimeShiftHandle.cpp | 19 ++++------ 7 files changed, 79 insertions(+), 137 deletions(-) diff --git a/src/Menus.cpp b/src/Menus.cpp index 9642f70d9..0c9c1a6ea 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -3578,11 +3578,8 @@ void MenuCommandHandler::OnPrevTrack( AudacityProject &project, bool shift ) wxBell(); if( mCircularTrackNavigation ) { - TrackListIterator iter( tracks ); - for( Track *d = iter.First(); d; d = iter.Next( true ) ) - { - p = d; - } + auto range = tracks->Leaders(); + p = * range.rbegin(); // null if range is empty trackPanel->SetFocusedTrack( p ); // Wrap to the first track trackPanel->EnsureVisible( p ); project.ModifyState(false); @@ -7206,13 +7203,11 @@ int MenuCommandHandler::FindClips // first search the tracks individually - TrackListIterator iter(tracks); - Track* track = iter.First(); std::vector results; int nTracksSearched = 0; int trackNum = 1; - while (track) { + for (auto track : tracks->Leaders()) { if (track->GetKind() == Track::Wave && (!anyWaveTracksSelected || track->GetSelected())) { auto waveTrack = static_cast(track); bool stereoAndDiff = waveTrack->GetLinked() && !ChannelsHaveSameClipBoundaries(waveTrack); @@ -7239,7 +7234,6 @@ int MenuCommandHandler::FindClips } trackNum++; - track = iter.Next(true); } @@ -8465,13 +8459,11 @@ int MenuCommandHandler::FindClipBoundaries // first search the tracks individually - TrackListIterator iter(tracks); - Track* track = iter.First(); std::vector results; int nTracksSearched = 0; int trackNum = 1; - while (track) { + for (auto track : tracks->Leaders()) { if (track->GetKind() == Track::Wave && (!anyWaveTracksSelected || track->GetSelected())) { auto waveTrack = static_cast(track); bool stereoAndDiff = waveTrack->GetLinked() && !ChannelsHaveSameClipBoundaries(waveTrack); @@ -8498,7 +8490,6 @@ int MenuCommandHandler::FindClipBoundaries } trackNum++; - track = iter.Next(true); } diff --git a/src/MixerBoard.cpp b/src/MixerBoard.cpp index bdfb32483..6a9b37949 100644 --- a/src/MixerBoard.cpp +++ b/src/MixerBoard.cpp @@ -980,42 +980,36 @@ void MixerBoard::UpdateTrackClusters() const int nClusterHeight = mScrolledWindow->GetClientSize().GetHeight() - kDoubleInset; size_t nClusterCount = mMixerTrackClusters.size(); unsigned int nClusterIndex = 0; - TrackListIterator iterTracks(mTracks); MixerTrackCluster* pMixerTrackCluster = NULL; Track* pTrack; - pTrack = iterTracks.First(); - while (pTrack) { - if (auto pPlayableTrack = dynamic_cast(pTrack)) + for (auto pPlayableTrack: mTracks->Leaders()) { + auto spTrack = Track::Pointer( pPlayableTrack ); + if (nClusterIndex < nClusterCount) { - auto spTrack = Track::Pointer( pPlayableTrack ); - if (nClusterIndex < nClusterCount) - { - // Already showing it. - // Track clusters are maintained in the same order as the WaveTracks. - // Track pointers can change for the "same" track for different states - // on the undo stack, so update the pointers and display name. - mMixerTrackClusters[nClusterIndex]->mTrack = spTrack; - // Assume linked track is wave or null - mMixerTrackClusters[nClusterIndex]->UpdateForStateChange(); - } - else - { - // Not already showing it. Add a NEW MixerTrackCluster. - wxPoint clusterPos( - kInset + nClusterIndex * kMixerTrackClusterWidth, - kInset); - wxSize clusterSize(kMixerTrackClusterWidth, nClusterHeight); - pMixerTrackCluster = - safenew MixerTrackCluster(mScrolledWindow, this, mProject, - spTrack, - clusterPos, clusterSize); - if (pMixerTrackCluster) - mMixerTrackClusters.push_back(pMixerTrackCluster); - } - nClusterIndex++; + // Already showing it. + // Track clusters are maintained in the same order as the WaveTracks. + // Track pointers can change for the "same" track for different states + // on the undo stack, so update the pointers and display name. + mMixerTrackClusters[nClusterIndex]->mTrack = spTrack; + // Assume linked track is wave or null + mMixerTrackClusters[nClusterIndex]->UpdateForStateChange(); } - pTrack = iterTracks.Next(true); + else + { + // Not already showing it. Add a NEW MixerTrackCluster. + wxPoint clusterPos( + kInset + nClusterIndex * kMixerTrackClusterWidth, + kInset); + wxSize clusterSize(kMixerTrackClusterWidth, nClusterHeight); + pMixerTrackCluster = + safenew MixerTrackCluster(mScrolledWindow, this, mProject, + spTrack, + clusterPos, clusterSize); + if (pMixerTrackCluster) + mMixerTrackClusters.push_back(pMixerTrackCluster); + } + nClusterIndex++; } if (pMixerTrackCluster) diff --git a/src/Track.cpp b/src/Track.cpp index 7a2f30b8a..ffa80d2ba 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -469,7 +469,7 @@ Track *TrackListIterator::First(TrackList * val) return nullptr; } -Track *TrackListIterator::Last(bool skiplinked) +Track *TrackListIterator::Last() { if (l == NULL) { return NULL; @@ -479,20 +479,10 @@ Track *TrackListIterator::Last(bool skiplinked) if ( l->isNull( cur ) ) return nullptr; - // With skiplinked set, we won't return the second channel of a linked pair - if (skiplinked) { - auto prev = l->getPrev( cur ); - if ( !l->isNull( prev ) && - !(*cur.first)->GetLinked() && - (*cur.first)->GetLink() - ) - cur = prev; - } - return cur.first->get(); } -Track *TrackListIterator::Next(bool skipLinked) +Track *TrackListIterator::Next() { #ifdef DEBUG_TLI // if we are debugging this bit wxASSERT_MSG((!cur || (*l).Contains((*cur).t)), wxT("cur invalid at start of Next(). List changed since iterator created?")); // check that cur is in the list @@ -501,16 +491,7 @@ Track *TrackListIterator::Next(bool skipLinked) if (!l || l->isNull(cur)) return nullptr; - if (skipLinked && - (*cur.first)->GetLinked()) - cur = l->getNext( cur ); - - #ifdef DEBUG_TLI // if we are debugging this bit - wxASSERT_MSG((!cur || (*l).Contains((*cur).t)), wxT("cur invalid after skipping linked tracks.")); // check that cur is in the list - #endif - - if (!l->isNull(cur)) - cur = l->getNext( cur ); + cur = l->getNext( cur ); #ifdef DEBUG_TLI // if we are debugging this bit wxASSERT_MSG((!cur || (*l).Contains((*cur).t)), wxT("cur invalid after moving to next track.")); // check that cur is in the list if it is not null @@ -522,7 +503,7 @@ Track *TrackListIterator::Next(bool skipLinked) return nullptr; } -Track *TrackListIterator::Prev(bool skiplinked) +Track *TrackListIterator::Prev() { if (!l || l->isNull(cur)) return nullptr; @@ -531,12 +512,6 @@ Track *TrackListIterator::Prev(bool skiplinked) if ( l->isNull( cur ) ) return nullptr; - if ( skiplinked ) { - auto prev = l->getPrev( cur ); - if( !l->isNull( prev ) && (*prev.first)->GetLinked() ) - cur = prev; - } - return cur.first->get(); } @@ -601,9 +576,9 @@ Track *TrackListCondIterator::First(TrackList *val) return t; } -Track *TrackListCondIterator::Next(bool skiplinked) +Track *TrackListCondIterator::Next() { - while (Track *t = TrackListIterator::Next(skiplinked)) { + while (Track *t = TrackListIterator::Next()) { if (this->Condition(t)) { return t; } @@ -612,9 +587,9 @@ Track *TrackListCondIterator::Next(bool skiplinked) return NULL; } -Track *TrackListCondIterator::Prev(bool skiplinked) +Track *TrackListCondIterator::Prev() { - while (Track *t = TrackListIterator::Prev(skiplinked)) + while (Track *t = TrackListIterator::Prev()) { if (this->Condition(t)) { return t; @@ -624,12 +599,12 @@ Track *TrackListCondIterator::Prev(bool skiplinked) return NULL; } -Track *TrackListCondIterator::Last(bool skiplinked) +Track *TrackListCondIterator::Last() { - Track *t = TrackListIterator::Last(skiplinked); + Track *t = TrackListIterator::Last(); while (t && !this->Condition(t)) { - t = TrackListIterator::Prev(skiplinked); + t = TrackListIterator::Prev(); } return t; @@ -734,9 +709,9 @@ bool SyncLockedTracksIterator::IsGoodNextTrack(const Track *t) const return true; } -Track *SyncLockedTracksIterator::Next(bool skiplinked) +Track *SyncLockedTracksIterator::Next() { - Track *t = TrackListIterator::Next(skiplinked); + Track *t = TrackListIterator::Next(); if (!t) return nullptr; @@ -751,9 +726,9 @@ Track *SyncLockedTracksIterator::Next(bool skiplinked) return t; } -Track *SyncLockedTracksIterator::Prev(bool skiplinked) +Track *SyncLockedTracksIterator::Prev() { - Track *t = TrackListIterator::Prev(skiplinked); + Track *t = TrackListIterator::Prev(); // // Ways to end a sync-locked group in reverse @@ -781,17 +756,17 @@ Track *SyncLockedTracksIterator::Prev(bool skiplinked) return t; } -Track *SyncLockedTracksIterator::Last(bool skiplinked) +Track *SyncLockedTracksIterator::Last() { if ( !l || l->isNull( cur ) ) return nullptr; Track *t = cur.first->get(); - while (const auto next = l->GetNext(t, skiplinked)) { + while (const auto next = l->GetNext(t)) { if ( ! IsGoodNextTrack(next) ) break; - t = Next(skiplinked); + t = Next(); } return t; diff --git a/src/Track.h b/src/Track.h index f92ca32ee..76fb723ad 100644 --- a/src/Track.h +++ b/src/Track.h @@ -1095,9 +1095,9 @@ class AUDACITY_DLL_API TrackListIterator /* not final */ // Iterate functions virtual Track *First(TrackList * val = nullptr); virtual Track *StartWith(Track * val); - virtual Track *Next(bool skiplinked = false); - virtual Track *Prev(bool skiplinked = false); - virtual Track *Last(bool skiplinked = false); + virtual Track *Next(); + virtual Track *Prev(); + virtual Track *Last(); Track *RemoveCurrent(); // deletes track, returns next @@ -1146,12 +1146,12 @@ public: { return mIter.First(const_cast(val)); } const Track *StartWith(const Track * val) { return mIter.StartWith(const_cast(val)); } - const Track *Next(bool skiplinked = false) - { return mIter.Next(skiplinked); } - const Track *Prev(bool skiplinked = false) - { return mIter.Prev(skiplinked); } - const Track *Last(bool skiplinked = false) - { return mIter.Last(skiplinked); } + const Track *Next() + { return mIter.Next(); } + const Track *Prev() + { return mIter.Prev(); } + const Track *Last() + { return mIter.Last(); } // Provide minimal STL forward-iterator idiom: @@ -1184,9 +1184,9 @@ class AUDACITY_DLL_API TrackListCondIterator /* not final */ : public TrackListI // Iteration functions Track *First(TrackList *val = NULL) override; Track *StartWith(Track *val) override; - Track *Next(bool skiplinked = false) override; - Track *Prev(bool skiplinked = false) override; - Track *Last(bool skiplinked = false) override; + Track *Next() override; + Track *Prev() override; + Track *Last() override; protected: // NEW virtual @@ -1256,9 +1256,9 @@ class AUDACITY_DLL_API SyncLockedTracksIterator final : public TrackListIterator // Iterate functions Track *StartWith(Track *member) override; - Track *Next(bool skiplinked = false) override; - Track *Prev(bool skiplinked = false) override; - Track *Last(bool skiplinked = false) override; + Track *Next() override; + Track *Prev() override; + Track *Last() override; private: bool IsGoodNextTrack(const Track *t) const; diff --git a/src/TrackPanelAx.cpp b/src/TrackPanelAx.cpp index d1c568b2c..c9d3078ca 100644 --- a/src/TrackPanelAx.cpp +++ b/src/TrackPanelAx.cpp @@ -162,19 +162,15 @@ int TrackPanelAx::TrackNum( const std::shared_ptr &target ) { // Find 1-based position of the target in the visible tracks, or 0 if not // found - TrackListIterator iter( mTrackPanel->GetTracks() ); - Track *t = iter.First(); int ndx = 0; - while( t != NULL ) + for ( auto t : mTrackPanel->GetTracks()->Leaders() ) { ndx++; if( t == target.get() ) { return ndx; } - - t = iter.Next( true ); } return 0; @@ -182,22 +178,16 @@ int TrackPanelAx::TrackNum( const std::shared_ptr &target ) std::shared_ptr TrackPanelAx::FindTrack( int num ) { - TrackListIterator iter( mTrackPanel->GetTracks() ); - Track *t = iter.First(); int ndx = 0; - while( t != NULL ) + for ( auto t : mTrackPanel->GetTracks()->Leaders() ) { ndx++; if( ndx == num ) - { - break; - } - - t = iter.Next( true ); + return Track::Pointer( t ); } - return Track::Pointer( t ); + return {}; } void TrackPanelAx::Updated() diff --git a/src/effects/TruncSilence.cpp b/src/effects/TruncSilence.cpp index da1be49ee..5b4d111be 100644 --- a/src/effects/TruncSilence.cpp +++ b/src/effects/TruncSilence.cpp @@ -334,10 +334,7 @@ bool EffectTruncSilence::ProcessIndependently() // Check if it's permissible { - SelectedTrackListOfKindIterator iter(Track::Wave, inputTracks()); - for (Track *track = iter.First(); track; - track = iter.Next(true) // skip linked tracks - ) { + for (auto track : inputTracks()->SelectedLeaders< WaveTrack >() ) { if (syncLock) { Track *const link = track->GetLink(); SyncLockedTracksIterator syncIter(inputTracks()); @@ -367,12 +364,8 @@ bool EffectTruncSilence::ProcessIndependently() { unsigned iGroup = 0; - SelectedTrackListOfKindIterator iter(Track::Wave, mOutputTracks.get()); - for (Track *track = iter.First(); track; - ++iGroup, track = iter.Next(true) // skip linked tracks - ) { - Track *const link = track->GetLink(); - Track *const last = link ? link : track; + for (auto track : mOutputTracks->SelectedLeaders< WaveTrack >() ) { + Track *const last = *TrackList::Channels(track).rbegin(); RegionList silences; @@ -393,6 +386,8 @@ bool EffectTruncSilence::ProcessIndependently() if (!DoRemoval(silences, iGroup, nGroups, groupFirst, groupLast, totalCutLen)) return false; newT1 = std::max(newT1, mT1 - totalCutLen); + + ++iGroup; } } diff --git a/src/tracks/ui/TimeShiftHandle.cpp b/src/tracks/ui/TimeShiftHandle.cpp index 06988a0e9..6ca9c22e9 100644 --- a/src/tracks/ui/TimeShiftHandle.cpp +++ b/src/tracks/ui/TimeShiftHandle.cpp @@ -153,26 +153,23 @@ namespace WaveTrack *NthAudioTrack(TrackList &list, int nn) { if (nn >= 0) { - TrackListOfKindIterator iter(Track::Wave, &list); - Track *pTrack = iter.First(); - while (pTrack && nn--) - pTrack = iter.Next(true); - return static_cast(pTrack); + for ( auto pTrack : list.Leaders< WaveTrack >() ) + if (nn -- == 0) + return pTrack; } return NULL; } // Don't count right channels. - int TrackPosition(TrackList &list, Track *pFindTrack) + int TrackPosition(TrackList &list, const Track *pFindTrack) { - Track *const partner = pFindTrack->GetLink(); - TrackListOfKindIterator iter(Track::Wave, &list); + pFindTrack = *list.FindLeader(pFindTrack); int nn = 0; - for (Track *pTrack = iter.First(); pTrack; pTrack = iter.Next(true), ++nn) { - if (pTrack == pFindTrack || - pTrack == partner) + for ( auto pTrack : list.Leaders< const WaveTrack >() ) { + if (pTrack == pFindTrack) return nn; + ++nn; } return -1; }