Use weak_ptr in track selection state
This commit is contained in:
parent
fa5a742e22
commit
4ac40d12c0
|
@ -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();
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue