1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-02 17:09:26 +02:00

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 // The projects tracklist has been updated
void AudacityProject::OnTrackListDeletion(wxCommandEvent & event) void AudacityProject::OnTrackListDeletion(wxCommandEvent & event)
{ {
GetSelectionState().TrackListUpdated( *GetTracks() );
mViewInfo.track = NULL; mViewInfo.track = NULL;
event.Skip(); event.Skip();

View File

@ -61,7 +61,7 @@ void SelectionState::SelectTrack
tracks.Select( &track, selected ); tracks.Select( &track, selected );
if (updateLastPicked) if (updateLastPicked)
mLastPickedTrack = &track; mLastPickedTrack = Track::Pointer( &track );
//The older code below avoids an anchor on an unselected 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 // This handles the case of linked tracks, selecting all channels
mTracks->Select(pTrack, true); mTracks->Select(pTrack, true);
if (updateLastPicked) if (updateLastPicked)
mLastPickedTrack = pTrack; mLastPickedTrack = Track::Pointer( pTrack );
} }
else { else {
mTracks->Select(pTrack, false); mTracks->Select(pTrack, false);
if (updateLastPicked && pTrack == mLastPickedTrack) if (updateLastPicked && pTrack == mLastPickedTrack.lock().get())
mLastPickedTrack = nullptr; mLastPickedTrack.reset();
} }
*/ */
@ -130,11 +130,9 @@ void SelectionState::ChangeSelectionOnShiftClick
Track* pFirst = nullptr; Track* pFirst = nullptr;
Track* pLast = nullptr; Track* pLast = nullptr;
// We will either extend from the first or from the last. // We will either extend from the first or from the last.
Track* pExtendFrom= nullptr; auto pExtendFrom = mLastPickedTrack.lock();
if( mLastPickedTrack ) if( !pExtendFrom ) {
pExtendFrom = mLastPickedTrack;
else {
TrackListIterator iter( &tracks ); TrackListIterator iter( &tracks );
for (Track *t = iter.First(); t; t = iter.Next()) { for (Track *t = iter.First(); t; t = iter.Next()) {
const bool isSelected = t->GetSelected(); 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 our track is at or after the first, extend from the first.
if( t == &track ) if( t == &track )
pExtendFrom = pFirst; pExtendFrom = Track::Pointer( pFirst );
} }
// Our track was earlier than the first. Extend from the last. // Our track was earlier than the first. Extend from the last.
if( !pExtendFrom ) if( !pExtendFrom )
pExtendFrom = pLast; pExtendFrom = Track::Pointer( pLast );
} }
SelectNone( tracks, pMixerBoard ); SelectNone( tracks, pMixerBoard );
@ -170,7 +168,7 @@ void SelectionState::HandleListSelection
if (ctrl) if (ctrl)
SelectTrack( tracks, track, !track.GetSelected(), true, pMixerBoard ); SelectTrack( tracks, track, !track.GetSelected(), true, pMixerBoard );
else { else {
if (shift && mLastPickedTrack) if (shift && mLastPickedTrack.lock())
ChangeSelectionOnShiftClick( tracks, track, pMixerBoard ); ChangeSelectionOnShiftClick( tracks, track, pMixerBoard );
else { else {
SelectNone( tracks, pMixerBoard ); 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 SelectionStateChanger::SelectionStateChanger
( SelectionState &state, TrackList &tracks ) ( SelectionState &state, TrackList &tracks )
: mpState{ &state } : mpState{ &state }

View File

@ -13,6 +13,7 @@ class Track;
class TrackList; class TrackList;
class MixerBoard; class MixerBoard;
class ViewInfo; class ViewInfo;
#include "MemoryX.h"
#include <vector> #include <vector>
// State relating to the set of selected tracks // State relating to the set of selected tracks
@ -36,12 +37,10 @@ public:
( TrackList &tracks, ViewInfo &viewInfo, Track &track, ( TrackList &tracks, ViewInfo &viewInfo, Track &track,
bool shift, bool ctrl, bool syncLocked, MixerBoard *pMixerBoard ); bool shift, bool ctrl, bool syncLocked, MixerBoard *pMixerBoard );
void TrackListUpdated( const TrackList &tracks );
private: private:
friend class SelectionStateChanger; friend class SelectionStateChanger;
Track *mLastPickedTrack {}; std::weak_ptr<Track> mLastPickedTrack;
}; };
// For committing or rolling-back of changes in selectedness of tracks. // For committing or rolling-back of changes in selectedness of tracks.
@ -59,7 +58,7 @@ public:
private: private:
SelectionState *mpState; SelectionState *mpState;
TrackList &mTracks; TrackList &mTracks;
Track *mInitialLastPickedTrack; std::weak_ptr<Track> mInitialLastPickedTrack;
std::vector<bool> mInitialTrackSelection; std::vector<bool> mInitialTrackSelection;
}; };