From b6a6b8e73e4d76e1aa23b62012e4aaf81325286e Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 10 Sep 2018 11:58:48 -0400 Subject: [PATCH] Rewrite iterations over sync-lock groups --- src/SelectionState.cpp | 40 +++++-------------- src/SelectionState.h | 2 +- src/effects/TruncSilence.cpp | 6 +-- src/effects/nyquist/Nyquist.cpp | 7 +--- .../notetrack/ui/StretchHandle.cpp | 5 +-- src/tracks/ui/SelectHandle.cpp | 2 +- src/tracks/ui/TimeShiftHandle.cpp | 7 +--- 7 files changed, 22 insertions(+), 47 deletions(-) diff --git a/src/SelectionState.cpp b/src/SelectionState.cpp index 0e20e0170..be3e6fc2c 100644 --- a/src/SelectionState.cpp +++ b/src/SelectionState.cpp @@ -16,43 +16,25 @@ // on, use the largest possible selection in the sync-lock group. // If it's a stereo track, do the same for the stereo channels. void SelectionState::SelectTrackLength -( TrackList &tracks, ViewInfo &viewInfo, Track &track, bool syncLocked ) +( ViewInfo &viewInfo, Track &track, bool syncLocked ) { - SyncLockedTracksIterator it( &tracks ); - Track *t1 = it.StartWith( &track ); - double minOffset = track.GetOffset(); - double maxEnd = track.GetEndTime(); - + auto trackRange = syncLocked // If we have a sync-lock group and sync-lock linking is on, // check the sync-lock group tracks. - if ( syncLocked && t1 != NULL ) - { - for ( ; t1; t1 = it.Next()) - { - if (t1->GetOffset() < minOffset) - minOffset = t1->GetOffset(); - if (t1->GetEndTime() > maxEnd) - maxEnd = t1->GetEndTime(); - } - } - else - { - // Otherwise, check for a stereo pair - t1 = track.GetLink(); - if (t1) - { - if (t1->GetOffset() < minOffset) - minOffset = t1->GetOffset(); - if (t1->GetEndTime() > maxEnd) - maxEnd = t1->GetEndTime(); - } - } + ? TrackList::SyncLockGroup(&track) + + // Otherwise, check for a stereo pair + : TrackList::Channels(&track); + + auto minOffset = trackRange.min( &Track::GetOffset ); + auto maxEnd = trackRange.max( &Track::GetEndTime ); // PRL: double click or click on track control. // should this select all frequencies too? I think not. viewInfo.selectedRegion.setTimes(minOffset, maxEnd); } + void SelectionState::SelectTrack ( Track &track, bool selected, bool updateLastPicked, MixerBoard *pMixerBoard ) @@ -175,7 +157,7 @@ void SelectionState::HandleListSelection else { SelectNone( tracks, pMixerBoard ); SelectTrack( track, true, true, pMixerBoard ); - SelectTrackLength( tracks, viewInfo, track, syncLocked ); + SelectTrackLength( viewInfo, track, syncLocked ); } if (pMixerBoard) diff --git a/src/SelectionState.h b/src/SelectionState.h index 8499fc1c3..9784ae8e5 100644 --- a/src/SelectionState.h +++ b/src/SelectionState.h @@ -21,7 +21,7 @@ class SelectionState { public: static void SelectTrackLength - ( TrackList &tracks, ViewInfo &viewInfo, Track &track, bool syncLocked ); + ( ViewInfo &viewInfo, Track &track, bool syncLocked ); void SelectTrack ( Track &track, diff --git a/src/effects/TruncSilence.cpp b/src/effects/TruncSilence.cpp index 72465f298..8739a0bb9 100644 --- a/src/effects/TruncSilence.cpp +++ b/src/effects/TruncSilence.cpp @@ -371,9 +371,9 @@ bool EffectTruncSilence::ProcessIndependently() // Treat tracks in the sync lock group only Track *groupFirst, *groupLast; if (syncLock) { - SyncLockedTracksIterator syncIter(mOutputTracks.get()); - groupFirst = syncIter.StartWith(track); - groupLast = syncIter.Last(); + auto trackRange = TrackList::SyncLockGroup(track); + groupFirst = *trackRange.begin(); + groupLast = *trackRange.rbegin(); } else { groupFirst = track; diff --git a/src/effects/nyquist/Nyquist.cpp b/src/effects/nyquist/Nyquist.cpp index 8b41c8f00..f61c3f338 100644 --- a/src/effects/nyquist/Nyquist.cpp +++ b/src/effects/nyquist/Nyquist.cpp @@ -818,8 +818,7 @@ bool NyquistEffect::Process() } // Check whether we're in the same group as the last selected track - SyncLockedTracksIterator gIter(mOutputTracks.get()); - Track *gt = gIter.StartWith(mCurTrack[0]); + Track *gt = *TrackList::SyncLockGroup(mCurTrack[0]).first; mFirstInGroup = !gtLast || (gtLast != gt); gtLast = gt; @@ -1530,9 +1529,7 @@ bool NyquistEffect::ProcessOne() // If we were first in the group adjust non-selected group tracks if (mFirstInGroup) { - SyncLockedTracksIterator git(mOutputTracks.get()); - Track *t; - for (t = git.StartWith(mCurTrack[i]); t; t = git.Next()) + for (auto t : TrackList::SyncLockGroup(mCurTrack[i])) { if (!t->GetSelected() && t->IsSyncLockSelected()) { t->SyncLockAdjust(mT1, mT0 + out->GetEndTime()); diff --git a/src/tracks/playabletrack/notetrack/ui/StretchHandle.cpp b/src/tracks/playabletrack/notetrack/ui/StretchHandle.cpp index 8981790d4..ad24291ed 100644 --- a/src/tracks/playabletrack/notetrack/ui/StretchHandle.cpp +++ b/src/tracks/playabletrack/notetrack/ui/StretchHandle.cpp @@ -226,9 +226,8 @@ UIHandle::Result StretchHandle::Release bool right = mStretchState.mMode == stretchRight; ViewInfo &viewInfo = pProject->GetViewInfo(); if ( pProject->IsSyncLocked() && ( left || right ) ) { - SyncLockedTracksIterator syncIter( pProject->GetTracks() ); - for ( auto track = syncIter.StartWith( mpTrack.get() ); track != nullptr; - track = syncIter.Next() ) { + for ( auto track : + TrackList::SyncLockGroup( mpTrack.get() ) ) { if ( track != mpTrack.get() ) { if ( left ) { auto origT0 = mStretchState.mOrigSel0Quantized; diff --git a/src/tracks/ui/SelectHandle.cpp b/src/tracks/ui/SelectHandle.cpp index 1e9f3800d..6e1fcf8b1 100644 --- a/src/tracks/ui/SelectHandle.cpp +++ b/src/tracks/ui/SelectHandle.cpp @@ -566,7 +566,7 @@ UIHandle::Result SelectHandle::Click // Default behavior: select whole track SelectionState::SelectTrackLength - ( *trackList, viewInfo, *pTrack, pProject->IsSyncLocked() ); + ( viewInfo, *pTrack, pProject->IsSyncLocked() ); // Special case: if we're over a clip in a WaveTrack, // select just that clip diff --git a/src/tracks/ui/TimeShiftHandle.cpp b/src/tracks/ui/TimeShiftHandle.cpp index b2b3e4993..ea7856e05 100644 --- a/src/tracks/ui/TimeShiftHandle.cpp +++ b/src/tracks/ui/TimeShiftHandle.cpp @@ -267,9 +267,7 @@ void TimeShiftHandle::CreateListOfCapturedClips // we can treat individual labels as clips) if ( trackClip.clip ) { // Iterate over sync-lock group tracks. - SyncLockedTracksIterator git( &trackList ); - for (Track *t = git.StartWith( trackClip.track ); - t; t = git.Next() ) + for (auto t : TrackList::SyncLockGroup( trackClip.track )) AddClipsToCaptured(state, t, trackClip.clip->GetStartTime(), trackClip.clip->GetEndTime() ); @@ -278,8 +276,7 @@ void TimeShiftHandle::CreateListOfCapturedClips // Capture additional clips from NoteTracks trackClip.track->TypeSwitch( [&](NoteTrack *nt) { // Iterate over sync-lock group tracks. - SyncLockedTracksIterator git( &trackList ); - for (Track *t = git.StartWith(nt); t; t = git.Next()) + for (auto t : TrackList::SyncLockGroup(nt)) AddClipsToCaptured ( state, t, nt->GetStartTime(), nt->GetEndTime() ); });