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:
parent
fa5a742e22
commit
4ac40d12c0
@ -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();
|
||||||
|
@ -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 }
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user