From 4ac40d12c0fdaac4d74c8165504c488d0b5c594c Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 25 Jun 2017 00:50:05 -0400 Subject: [PATCH] Use weak_ptr in track selection state --- src/Project.cpp | 2 -- src/SelectionState.cpp | 26 +++++++++----------------- src/SelectionState.h | 7 +++---- 3 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/Project.cpp b/src/Project.cpp index d870ff7e1..fbde87380 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -2224,8 +2224,6 @@ void AudacityProject::OnToolBarUpdate(wxCommandEvent & event) // The projects tracklist has been updated void AudacityProject::OnTrackListDeletion(wxCommandEvent & event) { - GetSelectionState().TrackListUpdated( *GetTracks() ); - mViewInfo.track = NULL; event.Skip(); diff --git a/src/SelectionState.cpp b/src/SelectionState.cpp index 03275d9b5..8aa2c12b7 100644 --- a/src/SelectionState.cpp +++ b/src/SelectionState.cpp @@ -61,7 +61,7 @@ void SelectionState::SelectTrack tracks.Select( &track, selected ); if (updateLastPicked) - mLastPickedTrack = &track; + mLastPickedTrack = Track::Pointer( &track ); //The older code below avoids an anchor on an unselected track. @@ -70,12 +70,12 @@ void SelectionState::SelectTrack // This handles the case of linked tracks, selecting all channels mTracks->Select(pTrack, true); if (updateLastPicked) - mLastPickedTrack = pTrack; + mLastPickedTrack = Track::Pointer( pTrack ); } else { mTracks->Select(pTrack, false); - if (updateLastPicked && pTrack == mLastPickedTrack) - mLastPickedTrack = nullptr; + if (updateLastPicked && pTrack == mLastPickedTrack.lock().get()) + mLastPickedTrack.reset(); } */ @@ -130,11 +130,9 @@ void SelectionState::ChangeSelectionOnShiftClick Track* pFirst = nullptr; Track* pLast = nullptr; // We will either extend from the first or from the last. - Track* pExtendFrom= nullptr; + auto pExtendFrom = mLastPickedTrack.lock(); - if( mLastPickedTrack ) - pExtendFrom = mLastPickedTrack; - else { + if( !pExtendFrom ) { TrackListIterator iter( &tracks ); for (Track *t = iter.First(); t; t = iter.Next()) { const bool isSelected = t->GetSelected(); @@ -146,11 +144,11 @@ void SelectionState::ChangeSelectionOnShiftClick } // If our track is at or after the first, extend from the first. if( t == &track ) - pExtendFrom = pFirst; + pExtendFrom = Track::Pointer( pFirst ); } // Our track was earlier than the first. Extend from the last. if( !pExtendFrom ) - pExtendFrom = pLast; + pExtendFrom = Track::Pointer( pLast ); } SelectNone( tracks, pMixerBoard ); @@ -170,7 +168,7 @@ void SelectionState::HandleListSelection if (ctrl) SelectTrack( tracks, track, !track.GetSelected(), true, pMixerBoard ); else { - if (shift && mLastPickedTrack) + if (shift && mLastPickedTrack.lock()) ChangeSelectionOnShiftClick( tracks, track, pMixerBoard ); else { SelectNone( tracks, pMixerBoard ); @@ -183,12 +181,6 @@ void SelectionState::HandleListSelection } } -void SelectionState::TrackListUpdated( const TrackList &tracks ) -{ - if (mLastPickedTrack && !tracks.Contains(mLastPickedTrack)) - mLastPickedTrack = nullptr; -} - SelectionStateChanger::SelectionStateChanger ( SelectionState &state, TrackList &tracks ) : mpState{ &state } diff --git a/src/SelectionState.h b/src/SelectionState.h index 9797f8e21..19e1eae11 100644 --- a/src/SelectionState.h +++ b/src/SelectionState.h @@ -13,6 +13,7 @@ class Track; class TrackList; class MixerBoard; class ViewInfo; +#include "MemoryX.h" #include // State relating to the set of selected tracks @@ -36,12 +37,10 @@ public: ( TrackList &tracks, ViewInfo &viewInfo, Track &track, bool shift, bool ctrl, bool syncLocked, MixerBoard *pMixerBoard ); - void TrackListUpdated( const TrackList &tracks ); - private: friend class SelectionStateChanger; - Track *mLastPickedTrack {}; + std::weak_ptr mLastPickedTrack; }; // For committing or rolling-back of changes in selectedness of tracks. @@ -59,7 +58,7 @@ public: private: SelectionState *mpState; TrackList &mTracks; - Track *mInitialLastPickedTrack; + std::weak_ptr mInitialLastPickedTrack; std::vector mInitialTrackSelection; };