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:
parent
cc554350aa
commit
785857a883
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user