/********************************************************************** Audacity: A Digital Audio Editor SelectionState.h **********************************************************************/ #ifndef __AUDACITY_SELECTION_STATE__ #define __AUDACITY_SELECTION_STATE__ class AudacityProject; class Track; class TrackList; class ViewInfo; #include "ClientData.h" #include #include // State relating to the set of selected tracks class AUDACITY_DLL_API SelectionState final : public ClientData::Base { public: SelectionState() = default; SelectionState( const SelectionState & ) PROHIBITED; SelectionState &operator=( const SelectionState & ) PROHIBITED; static SelectionState &Get( AudacityProject &project ); static const SelectionState &Get( const AudacityProject &project ); static void SelectTrackLength ( ViewInfo &viewInfo, Track &track, bool syncLocked ); void SelectTrack( Track &track, bool selected, bool updateLastPicked ); // Inclusive range of tracks, the limits specified in either order: void SelectRangeOfTracks ( TrackList &tracks, Track &sTrack, Track &eTrack ); void SelectNone( TrackList &tracks ); void ChangeSelectionOnShiftClick ( TrackList &tracks, Track &track ); void HandleListSelection ( TrackList &tracks, ViewInfo &viewInfo, Track &track, bool shift, bool ctrl, bool syncLocked ); private: friend class SelectionStateChanger; std::weak_ptr 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 AUDACITY_DLL_API SelectionStateChanger { public: SelectionStateChanger( SelectionState &state, TrackList &tracks ); SelectionStateChanger( const SelectionStateChanger& ) = delete; SelectionStateChanger &operator=( const SelectionStateChanger& ) = delete; ~SelectionStateChanger(); void Commit(); private: SelectionState *mpState; TrackList &mTracks; std::weak_ptr mInitialLastPickedTrack; std::vector mInitialTrackSelection; }; #endif