Use weak_ptr in track selection state

This commit is contained in:
Paul Licameli 2017-06-25 00:50:05 -04:00
parent fa5a742e22
commit 4ac40d12c0
3 changed files with 12 additions and 23 deletions

View File

@ -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();

View File

@ -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 }

View File

@ -13,6 +13,7 @@ class Track;
class TrackList;
class MixerBoard;
class ViewInfo;
#include "MemoryX.h"
#include <vector>
// 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<Track> 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<Track> mInitialLastPickedTrack;
std::vector<bool> mInitialTrackSelection;
};