1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-04-30 15:49:41 +02:00

Make FindCorrespondence invocable repeatedly to accumulate pairs

This commit is contained in:
Paul Licameli 2020-09-21 10:54:19 -04:00 committed by James Crook
parent cc554350aa
commit 785857a883

View File

@ -592,12 +592,15 @@ namespace {
bool FindCorrespondence( bool FindCorrespondence(
Correspondence &correspondence, Correspondence &correspondence,
TrackList &trackList, Track &track, TrackList &trackList, Track &capturedTrack, Track &track,
ClipMoveState &state) ClipMoveState &state)
{ {
auto &capturedTrack = state.mCapturedTrack; // Accumulate new pairs for the correspondence, and merge them
// into the given correspondence only on success
Correspondence newPairs;
auto sameType = [&]( auto pTrack ){ auto sameType = [&]( auto pTrack ){
return capturedTrack->SameKindAs( *pTrack ); return capturedTrack.SameKindAs( *pTrack );
}; };
if (!sameType(&track)) if (!sameType(&track))
return false; return false;
@ -607,7 +610,7 @@ namespace {
// Find how far this track would shift down among those (signed) // Find how far this track would shift down among those (signed)
const auto myPosition = const auto myPosition =
std::distance( range.first, trackList.Find( capturedTrack.get() ) ); std::distance( range.first, trackList.Find( &capturedTrack ) );
const auto otherPosition = const auto otherPosition =
std::distance( range.first, trackList.Find( &track ) ); std::distance( range.first, trackList.Find( &track ) );
auto diff = otherPosition - myPosition; auto diff = otherPosition - myPosition;
@ -629,7 +632,11 @@ namespace {
// Rejected for other reason // Rejected for other reason
return false; return false;
correspondence[ pTrack ] = pOther; if ( correspondence.count(pTrack) )
// Don't overwrite the given correspondence
return false;
newPairs[ pTrack ] = pOther;
} }
if ( diff < 0 ) if ( diff < 0 )
@ -638,6 +645,12 @@ namespace {
++iter; // Safe to increment TrackIter even at end of range ++iter; // Safe to increment TrackIter even at end of range
} }
// Success
if (correspondence.empty())
correspondence.swap(newPairs);
else
std::copy( newPairs.begin(), newPairs.end(),
std::inserter( correspondence, correspondence.end() ) );
return true; return true;
} }
@ -717,7 +730,11 @@ bool TimeShiftHandle::DoSlideVertical
Track &dstTrack, double &desiredSlideAmount ) Track &dstTrack, double &desiredSlideAmount )
{ {
Correspondence correspondence; Correspondence correspondence;
if (!FindCorrespondence( correspondence, trackList, dstTrack, state ))
// See if captured track corresponds to another
auto &capturedTrack = *state.mCapturedTrack;
if (!FindCorrespondence(
correspondence, trackList, capturedTrack, dstTrack, state ))
return false; return false;
// Having passed that test, remove clips temporarily from their // Having passed that test, remove clips temporarily from their