diff --git a/src/menus/ClipMenus.cpp b/src/menus/ClipMenus.cpp index 63d9d5d09..15b11207e 100644 --- a/src/menus/ClipMenus.cpp +++ b/src/menus/ClipMenus.cpp @@ -671,8 +671,8 @@ double DoClipMove if (!right) desiredSlideAmount *= -1; - auto hSlideAmount = state.DoSlideHorizontal( - desiredSlideAmount, trackList, *track ); + auto hSlideAmount = + state.DoSlideHorizontal( desiredSlideAmount, trackList ); // update t0 and t1. There is the possibility that the updated // t0 may no longer be within the clip due to rounding errors, diff --git a/src/tracks/ui/TimeShiftHandle.cpp b/src/tracks/ui/TimeShiftHandle.cpp index 7ea7e3ee6..352456afe 100644 --- a/src/tracks/ui/TimeShiftHandle.cpp +++ b/src/tracks/ui/TimeShiftHandle.cpp @@ -45,9 +45,9 @@ TrackClip::~TrackClip() TimeShiftHandle::TimeShiftHandle ( const std::shared_ptr &pTrack, bool gripHit ) - : mCapturedTrack{ pTrack } - , mGripHit{ gripHit } + : mGripHit{ gripHit } { + mClipMoveState.mCapturedTrack = pTrack; } void TimeShiftHandle::Enter(bool, AudacityProject *) @@ -320,6 +320,7 @@ void ClipMoveState::Init( }); auto &state = *this; + state.mCapturedTrack = capturedTrack.SharedPointer(); state.movingSelection = capturedTrack.IsSelected() && clickTime >= viewInfo.selectedRegion.t0() && @@ -474,9 +475,10 @@ void ClipMoveState::Init( } double ClipMoveState::DoSlideHorizontal( - double desiredSlideAmount, TrackList &trackList, Track &capturedTrack ) + double desiredSlideAmount, TrackList &trackList ) { auto &state = *this; + auto &capturedTrack = *state.mCapturedTrack; state.hSlideAmount = desiredSlideAmount; // Given a signed slide distance, move clips, but subject to constraint of @@ -896,7 +898,7 @@ UIHandle::Result TimeShiftHandle::Drag // within the bounds of the tracks area. if (event.m_x >= mRect.GetX() && event.m_x < mRect.GetX() + mRect.GetWidth()) - track = mCapturedTrack.get(); + track = mClipMoveState.mCapturedTrack.get(); } // May need a shared_ptr to reassign mCapturedTrack below @@ -907,14 +909,14 @@ UIHandle::Result TimeShiftHandle::Drag auto &trackList = TrackList::Get( *pProject ); - // GM: DoSlide now implementing snap-to + // GM: slide now implementing snap-to // samples functionality based on sample rate. // Start by undoing the current slide amount; everything // happens relative to the original horizontal position of // each clip... DoOffset( - mClipMoveState, mCapturedTrack.get(), -mClipMoveState.hSlideAmount ); + mClipMoveState, mClipMoveState.mCapturedTrack.get(), -mClipMoveState.hSlideAmount ); if ( mClipMoveState.movingSelection ) { // Slide the selection, too @@ -925,7 +927,7 @@ UIHandle::Result TimeShiftHandle::Drag double desiredSlideAmount = FindDesiredSlideAmount( viewInfo, mRect.x, event, mSnapManager.get(), mSlideUpDownOnly, mSnapPreferRightEdge, mClipMoveState, - *mCapturedTrack, *pTrack ); + *mClipMoveState.mCapturedTrack, *pTrack ); // Scroll during vertical drag. // EnsureVisible(pTrack); //vvv Gale says this has problems on Linux, per bug 393 thread. Revert for 2.0.2. @@ -935,12 +937,12 @@ UIHandle::Result TimeShiftHandle::Drag // decide which tracks the captured clips should go to. bool fail = ( mClipMoveState.capturedClip && - pTrack != mCapturedTrack + pTrack != mClipMoveState.mCapturedTrack /* && !mCapturedClipIsSelection*/ && pTrack->TypeSwitch( [&] (WaveTrack *) { if ( DoSlideVertical( viewInfo, event.m_x, mClipMoveState, - trackList, *mCapturedTrack, *pTrack, desiredSlideAmount ) ) { - mCapturedTrack = pTrack; + trackList, *mClipMoveState.mCapturedTrack, *pTrack, desiredSlideAmount ) ) { + mClipMoveState.mCapturedTrack = pTrack; mDidSlideVertically = true; } else @@ -958,8 +960,7 @@ UIHandle::Result TimeShiftHandle::Drag if (desiredSlideAmount == 0.0) return RefreshAll; - mClipMoveState.DoSlideHorizontal( - desiredSlideAmount, trackList, *mCapturedTrack ); + mClipMoveState.DoSlideHorizontal( desiredSlideAmount, trackList ); if (mClipMoveState.movingSelection) { // Slide the selection, too diff --git a/src/tracks/ui/TimeShiftHandle.h b/src/tracks/ui/TimeShiftHandle.h index f1106ab23..b68911ba4 100644 --- a/src/tracks/ui/TimeShiftHandle.h +++ b/src/tracks/ui/TimeShiftHandle.h @@ -132,8 +132,9 @@ struct ClipMoveState { TrackList &trackList, bool syncLocked ); /*! @return actual slide amount, maybe adjusted toward zero from desired */ - double DoSlideHorizontal( - double desiredSlideAmount, TrackList &trackList, Track &capturedTrack ); + double DoSlideHorizontal( double desiredSlideAmount, TrackList &trackList ); + + std::shared_ptr mCapturedTrack; // non-NULL only if click was in a WaveTrack and without Shift key: WaveClip *capturedClip {}; @@ -171,7 +172,7 @@ public: TimeShiftHandle &operator=(TimeShiftHandle&&) = default; bool IsGripHit() const { return mGripHit; } - std::shared_ptr GetTrack() const { return mCapturedTrack; } + std::shared_ptr GetTrack() const = delete; // Try to move clips from one WaveTrack to another, before also moving // by some horizontal amount, which may be slightly adjusted to fit the @@ -221,7 +222,6 @@ private: TrackPanelDrawingContext &, const wxRect &rect, const wxRect &panelRect, unsigned iPass ) override; - std::shared_ptr mCapturedTrack; wxRect mRect{}; bool mDidSlideVertically{};