1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-28 06:08:40 +02:00

Define and use SelectionStateChanger

This commit is contained in:
Paul Licameli 2017-06-11 09:59:23 -04:00
parent a594207265
commit 4da881d1db
4 changed files with 67 additions and 22 deletions

View File

@ -188,3 +188,39 @@ void SelectionState::TrackListUpdated( const TrackList &tracks )
if (mLastPickedTrack && !tracks.Contains(mLastPickedTrack))
mLastPickedTrack = nullptr;
}
SelectionStateChanger::SelectionStateChanger
( SelectionState &state, TrackList &tracks )
: mpState{ &state }
, mTracks{ tracks }
, mInitialLastPickedTrack{ state.mLastPickedTrack }
{
// Save initial state of track selections
mInitialTrackSelection.clear();
TrackListIterator iter( &mTracks );
for (Track *track = iter.First(); track; track = iter.Next()) {
const bool isSelected = track->GetSelected();
mInitialTrackSelection.push_back(isSelected);
}
}
SelectionStateChanger::~SelectionStateChanger()
{
if ( mpState ) {
// roll back changes
mpState->mLastPickedTrack = mInitialLastPickedTrack;
TrackListIterator iter( &mTracks );
std::vector<bool>::const_iterator
it = mInitialTrackSelection.begin(),
end = mInitialTrackSelection.end();
for (Track *track = iter.First(); track && it != end; track = iter.Next()) {
// wxASSERT(it != end);
track->SetSelected( *it++ );
}
}
}
void SelectionStateChanger::Commit()
{
mpState = nullptr;
}

View File

@ -13,6 +13,7 @@ class Track;
class TrackList;
class MixerBoard;
class ViewInfo;
#include <vector>
// State relating to the set of selected tracks
class SelectionState
@ -37,7 +38,29 @@ public:
void TrackListUpdated( const TrackList &tracks );
private:
friend class SelectionStateChanger;
Track *mLastPickedTrack {};
};
// For committing or rolling-back of changes in selectedness of tracks.
// When rolling back, it is assumed that no tracks have been added or removed.
class SelectionStateChanger
{
public:
SelectionStateChanger( SelectionState &state, TrackList &tracks );
SelectionStateChanger( const SelectionStateChanger& ) = delete;
SelectionStateChanger &operator=( const SelectionStateChanger& ) = delete;
~SelectionStateChanger();
void Commit();
private:
SelectionState *mpState;
TrackList &mTracks;
Track *mInitialLastPickedTrack;
std::vector<bool> mInitialTrackSelection;
};
#endif

View File

@ -1151,15 +1151,7 @@ bool TrackPanel::HandleEscapeKey(bool down)
{
case IsSelecting:
{
TrackListIterator iter(GetTracks());
std::vector<bool>::const_iterator
it = mInitialTrackSelection.begin(),
end = mInitialTrackSelection.end();
for (Track *t = iter.First(); t; t = iter.Next()) {
wxASSERT(it != end);
t->SetSelected(*it++);
}
GetSelectionState().mLastPickedTrack = mInitialLastPickedTrack;
mSelectionStateChanger.reset();
mViewInfo->selectedRegion = mInitialSelection;
// Refresh mixer board for change of set of selected tracks
@ -1789,6 +1781,10 @@ void TrackPanel::HandleSelect(wxMouseEvent & event)
SelectionHandleClick(event, t, rect);
} else if (event.LeftUp() || event.RightUp()) {
mSnapManager.reset();
if (mSelectionStateChanger) {
mSelectionStateChanger->Commit();
mSelectionStateChanger.reset();
}
bool left;
if ( GetProject()->IsSyncLocked() &&
@ -1931,17 +1927,8 @@ void TrackPanel::SelectionHandleClick(wxMouseEvent & event,
mMouseCapture=IsSelecting;
mInitialSelection = mViewInfo->selectedRegion;
mInitialLastPickedTrack = GetSelectionState().mLastPickedTrack;
// Save initial state of track selections
mInitialTrackSelection.clear();
{
TrackListIterator iter(GetTracks());
for (Track *t = iter.First(); t; t = iter.Next()) {
const bool isSelected = t->GetSelected();
mInitialTrackSelection.push_back(isSelected);
}
}
mSelectionStateChanger = std::make_unique< SelectionStateChanger >
( GetSelectionState(), *mTracks );
// We create a NEW snap manager in case any snap-points have changed
mSnapManager = std::make_unique<SnapManager>(GetTracks(), mViewInfo);

View File

@ -639,10 +639,9 @@ protected:
bool mRefreshBacking;
SelectedRegion mInitialSelection;
std::vector<bool> mInitialTrackSelection;
SelectionState mSelectionState{};
SelectionState &GetSelectionState() { return mSelectionState; }
Track *mInitialLastPickedTrack {};
std::unique_ptr<SelectionStateChanger> mSelectionStateChanger{};
bool mSelStartValid;
double mSelStart;