From cfdbc35990532c16a429b96584940370b6d32ba3 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 8 Aug 2015 16:10:33 -0400 Subject: [PATCH] Bug 1132: Time shift should not snap to starting positions of moving labels --- src/Snap.cpp | 12 +++++++++--- src/Snap.h | 2 ++ src/TrackPanel.cpp | 11 ++++++++++- src/widgets/Ruler.cpp | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Snap.cpp b/src/Snap.cpp index f8c7a4dff..1b7d9bc1a 100644 --- a/src/Snap.cpp +++ b/src/Snap.cpp @@ -30,6 +30,7 @@ static int CompareSnapPoints(SnapPoint *s1, SnapPoint *s2) } SnapManager::SnapManager(TrackList *tracks, TrackClipArray *exclusions, + const std::vector *pLabelTrackExclusions, const ZoomInfo &zoomInfo, int pixelTolerance, bool noTimeSnap) : mConverter(NumericConverter::TIME) , mPixelTolerance(std::max(0, pixelTolerance)) @@ -61,9 +62,15 @@ SnapManager::SnapManager(TrackList *tracks, TrackClipArray *exclusions, mSnapPoints->Add(new SnapPoint(0.0, NULL)); TrackListIterator iter(tracks); - Track *track = iter.First(); - while (track) { + for (Track *track = iter.First(); track; track = iter.Next()) { if (track->GetKind() == Track::Label) { + if (pLabelTrackExclusions) { + const std::vector::const_iterator + begin = pLabelTrackExclusions->begin(), + end = pLabelTrackExclusions->end(); + if (end != std::find(begin, end, track)) + continue; + } LabelTrack *labelTrack = (LabelTrack *)track; for(i = 0; i < labelTrack->GetNumLabels(); i++) { const LabelStruct *label = labelTrack->GetLabel(i); @@ -100,7 +107,6 @@ SnapManager::SnapManager(TrackList *tracks, TrackClipArray *exclusions, CondListAdd(track->GetEndTime(), track); } #endif - track = iter.Next(); } } diff --git a/src/Snap.h b/src/Snap.h index 478a49e0e..b95a0cb14 100644 --- a/src/Snap.h +++ b/src/Snap.h @@ -21,6 +21,7 @@ #include "widgets/NumericTextCtrl.h" +class LabelTrack; class Track; class WaveClip; class TrackList; @@ -58,6 +59,7 @@ WX_DEFINE_SORTED_ARRAY(SnapPoint *, SnapPointArray); class SnapManager { public: SnapManager(TrackList *tracks, TrackClipArray *exclusions, + const std::vector *pLabelTrackExclusions, const ZoomInfo &zoomInfo, int pixelTolerance, bool noTimeSnap = false); ~SnapManager(); diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 43d0fd030..996a6b050 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -2528,7 +2528,7 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event, if (mSnapManager) delete mSnapManager; - mSnapManager = new SnapManager(mTracks, NULL, + mSnapManager = new SnapManager(mTracks, NULL, NULL, *mViewInfo, 4); // pixel tolerance @@ -3895,6 +3895,8 @@ void TrackPanel::StartSlide(wxMouseEvent & event) mHSlideAmount = 0.0; mDidSlideVertically = false; + std::vector trackExclusions; + Track *vt = FindTrack(event.m_x, event.m_y, false, false, &rect); if (!vt) return; @@ -3940,6 +3942,8 @@ void TrackPanel::StartSlide(wxMouseEvent & event) for (Track *t = iter.First(); t; t = iter.Next()) { if (t->GetSelected()) { AddClipsToCaptured(t, true); + if (t->GetKind() != Track::Wave) + trackExclusions.push_back(t); } } } @@ -3984,6 +3988,8 @@ void TrackPanel::StartSlide(wxMouseEvent & event) AddClipsToCaptured(t, mCapturedClipArray[i].clip->GetStartTime(), mCapturedClipArray[i].clip->GetEndTime() ); + if (t->GetKind() != Track::Wave) + trackExclusions.push_back(t); } } #ifdef USE_MIDI @@ -3995,6 +4001,8 @@ void TrackPanel::StartSlide(wxMouseEvent & event) for (Track *t = git.First(nt); t; t = git.Next()) { AddClipsToCaptured(t, nt->GetStartTime(), nt->GetEndTime()); + if (t->GetKind() != Track::Wave) + trackExclusions.push_back(t); } } #endif @@ -4021,6 +4029,7 @@ void TrackPanel::StartSlide(wxMouseEvent & event) delete mSnapManager; mSnapManager = new SnapManager(mTracks, &mCapturedClipArray, + &trackExclusions, *mViewInfo, 4, // pixel tolerance true); // don't snap to time diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 2aebe092f..9e19fd1b2 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2290,7 +2290,7 @@ void AdornedRulerPanel::HandleSnapping() // Create a new snap manager in case any snap-points have changed delete mSnapManager; } - mSnapManager = new SnapManager(mProject->GetTracks(), NULL, + mSnapManager = new SnapManager(mProject->GetTracks(), NULL, NULL, *mViewInfo, QUICK_PLAY_SNAP_PIXEL); bool snappedPoint, snappedTime;