diff --git a/src/Snap.cpp b/src/Snap.cpp index 2753b22a0..123aa4595 100644 --- a/src/Snap.cpp +++ b/src/Snap.cpp @@ -69,65 +69,6 @@ SnapPointArray FindCandidates( const TrackList &tracks ) } return candidates; } - -SnapPointArray FindCandidates( - const TrackList &tracks, - const TrackClipArray *clipExclusions, const TrackArray *trackExclusions ) -{ - // Special case restricted candidates for time shift - SnapPointArray candidates; - auto trackRange = - tracks.Any() - - [&](const Track *pTrack){ - return trackExclusions && - make_iterator_range( *trackExclusions ).contains( pTrack ); - }; - trackRange.Visit( - [&](const LabelTrack *labelTrack) { - for (int i = 0, cnt = labelTrack->GetNumLabels(); i < cnt; ++i) - { - const LabelStruct *label = labelTrack->GetLabel(i); - const double t0 = label->getT0(); - const double t1 = label->getT1(); - candidates.emplace_back(t0, labelTrack); - if (t1 != t0) - candidates.emplace_back(t1, labelTrack); - } - }, - [&](const WaveTrack *waveTrack) { - for (const auto &clip: waveTrack->GetClips()) - { - if (clipExclusions) - { - bool skip = false; - for (size_t j = 0, cnt = clipExclusions->size(); j < cnt; ++j) - { - if ((*clipExclusions)[j].track == waveTrack && - (*clipExclusions)[j].clip == clip.get()) - { - skip = true; - break; - } - } - - if (skip) - continue; - } - - candidates.emplace_back(clip->GetStartTime(), waveTrack); - candidates.emplace_back(clip->GetEndTime(), waveTrack); - } - } -#ifdef USE_MIDI - , - [&](const NoteTrack *track) { - candidates.emplace_back(track->GetStartTime(), track); - candidates.emplace_back(track->GetEndTime(), track); - } -#endif - ); - return candidates; -} } SnapManager::SnapManager(const AudacityProject &project, @@ -141,19 +82,6 @@ SnapManager::SnapManager(const AudacityProject &project, { } -SnapManager::SnapManager(const AudacityProject &project, - const TrackList &tracks, - const ZoomInfo &zoomInfo, - bool noTimeSnap, - int pixelTolerance, - const TrackClipArray *clipExclusions, - const TrackArray *trackExclusions) - : SnapManager{ project, - FindCandidates( tracks, clipExclusions, trackExclusions ), - zoomInfo, noTimeSnap, pixelTolerance } -{ -} - SnapManager::~SnapManager() { } diff --git a/src/Snap.h b/src/Snap.h index 50679d244..5582cdff2 100644 --- a/src/Snap.h +++ b/src/Snap.h @@ -89,13 +89,6 @@ public: bool noTimeSnap = false, int pixelTolerance = kPixelTolerance); - SnapManager(const AudacityProject &project, - const TrackList &tracks, - const ZoomInfo &zoomInfo, - bool noTimeSnap, - int pixelTolerance, - const TrackClipArray *clipExclusions = NULL, - const TrackArray *trackExclusions = NULL); ~SnapManager(); // The track may be NULL. diff --git a/src/tracks/ui/TimeShiftHandle.cpp b/src/tracks/ui/TimeShiftHandle.cpp index 54a039519..acb9d5eb0 100644 --- a/src/tracks/ui/TimeShiftHandle.cpp +++ b/src/tracks/ui/TimeShiftHandle.cpp @@ -350,6 +350,64 @@ void TimeShiftHandle::DoSlideHorizontal DoOffset( state, &capturedTrack, state.hSlideAmount ); } +#include "LabelTrack.h" +namespace { +SnapPointArray FindCandidates( + const TrackList &tracks, + const TrackClipArray &clipExclusions, const TrackArray &trackExclusions ) +{ + // Special case restricted candidates for time shift + SnapPointArray candidates; + auto trackRange = + tracks.Any() + - [&](const Track *pTrack){ + return + make_iterator_range( trackExclusions ).contains( pTrack ); + }; + trackRange.Visit( + [&](const LabelTrack *labelTrack) { + for (const auto &label : labelTrack->GetLabels()) + { + const double t0 = label.getT0(); + const double t1 = label.getT1(); + candidates.emplace_back(t0, labelTrack); + if (t1 != t0) + candidates.emplace_back(t1, labelTrack); + } + }, + [&](const WaveTrack *waveTrack) { + for (const auto &clip: waveTrack->GetClips()) + { + bool skip = false; + for (const auto &exclusion : clipExclusions) + { + if (exclusion.track == waveTrack && + exclusion.clip == clip.get()) + { + skip = true; + break; + } + } + + if (skip) + continue; + + candidates.emplace_back(clip->GetStartTime(), waveTrack); + candidates.emplace_back(clip->GetEndTime(), waveTrack); + } + } +#ifdef USE_MIDI + , + [&](const NoteTrack *track) { + candidates.emplace_back(track->GetStartTime(), track); + candidates.emplace_back(track->GetEndTime(), track); + } +#endif + ); + return candidates; +} +} + UIHandle::Result TimeShiftHandle::Click (const TrackPanelMouseEvent &evt, AudacityProject *pProject) { @@ -415,12 +473,12 @@ UIHandle::Result TimeShiftHandle::Click mRect = rect; mClipMoveState.mMouseClickX = event.m_x; mSnapManager = - std::make_shared(*trackList.GetOwner(), trackList, - viewInfo, - true, // don't snap to time - kPixelTolerance, - &mClipMoveState.capturedClipArray, - &mClipMoveState.trackExclusions); + std::make_shared(*trackList.GetOwner(), + FindCandidates( trackList, + mClipMoveState.capturedClipArray, mClipMoveState.trackExclusions), + viewInfo, + true, // don't snap to time + kPixelTolerance); mClipMoveState.snapLeft = -1; mClipMoveState.snapRight = -1; mSnapPreferRightEdge =