Rewrite iterations over sync-lock groups

This commit is contained in:
Paul Licameli 2018-09-10 11:58:48 -04:00
parent bb3aa00f50
commit b6a6b8e73e
7 changed files with 22 additions and 47 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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;

View File

@ -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());

View File

@ -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;

View File

@ -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

View File

@ -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() );
});