From 186f2f6ac7f01de237d9a33e153bd2a6f5c8be35 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Thu, 6 Jun 2019 11:21:15 -0400 Subject: [PATCH 1/2] Split class ProjectSelectionManager from ProjectManager... ... handling the callbacks from the selection toolbars. Next ProjectFileManager will be split out of ProjectManager, and ProjectSelectionManager will be used by it during file opening, so separating files for it avoids a cycle. --- src/ProjectManager.cpp | 72 ++++++++++++++++++++++++---------- src/ProjectManager.h | 62 +++++++++++++++++------------ src/commands/SelectCommand.cpp | 2 +- src/menus/HelpMenus.cpp | 2 +- src/menus/SelectMenus.cpp | 6 +-- 5 files changed, 95 insertions(+), 49 deletions(-) diff --git a/src/ProjectManager.cpp b/src/ProjectManager.cpp index 5fe39a357..7edbc8c44 100644 --- a/src/ProjectManager.cpp +++ b/src/ProjectManager.cpp @@ -61,6 +61,33 @@ Paul Licameli split from AudacityProject.cpp const int AudacityProjectTimerID = 5200; +static AudacityProject::AttachedObjects::RegisteredFactory +sProjectSelectionManagerKey { + []( AudacityProject &project ) { + return std::make_shared< ProjectSelectionManager >( project ); + } +}; + +ProjectSelectionManager &ProjectSelectionManager::Get( + AudacityProject &project ) +{ + return project.AttachedObjects::Get< ProjectSelectionManager >( + sProjectSelectionManagerKey ); +} + +const ProjectSelectionManager &ProjectSelectionManager::Get( + const AudacityProject &project ) +{ + return Get( const_cast< AudacityProject & >( project ) ); +} + +ProjectSelectionManager::ProjectSelectionManager( AudacityProject &project ) + : mProject{ project } +{ +} + +ProjectSelectionManager::~ProjectSelectionManager() = default; + static AudacityProject::AttachedObjects::RegisteredFactory sProjectManagerKey { []( AudacityProject &project ) { return std::make_shared< ProjectManager >( project ); @@ -391,9 +418,10 @@ AudacityProject *ProjectManager::New() //Initialise the Listeners gAudioIO->SetListener( &ProjectAudioManager::Get( project ) ); - SelectionBar::Get( project ).SetListener( &projectManager ); + auto &projectSelectionManager = ProjectSelectionManager::Get( project ); + SelectionBar::Get( project ).SetListener( &projectSelectionManager ); #ifdef EXPERIMENTAL_SPECTRAL_EDITING - SpectralSelectionBar::Get( project ).SetListener( &projectManager ); + SpectralSelectionBar::Get( project ).SetListener( &projectSelectionManager ); #endif #if wxUSE_DRAG_AND_DROP @@ -419,7 +447,7 @@ AudacityProject *ProjectManager::New() return p; } -bool ProjectManager::SnapSelection() +bool ProjectSelectionManager::SnapSelection() { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); @@ -453,7 +481,7 @@ bool ProjectManager::SnapSelection() return false; } -double ProjectManager::AS_GetRate() +double ProjectSelectionManager::AS_GetRate() { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); @@ -462,21 +490,21 @@ double ProjectManager::AS_GetRate() // Typically this came from the SelectionToolbar and does not need to // be communicated back to it. -void ProjectManager::AS_SetRate(double rate) +void ProjectSelectionManager::AS_SetRate(double rate) { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); settings.SetRate( rate ); } -int ProjectManager::AS_GetSnapTo() +int ProjectSelectionManager::AS_GetSnapTo() { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); return settings.GetSnapTo(); } -void ProjectManager::AS_SetSnapTo(int snap) +void ProjectSelectionManager::AS_SetSnapTo(int snap) { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); @@ -496,14 +524,15 @@ void ProjectManager::AS_SetSnapTo(int snap) SelectionBar::Get( project ).SetSnapTo(snap); } -const NumericFormatSymbol & ProjectManager::AS_GetSelectionFormat() +const NumericFormatSymbol & ProjectSelectionManager::AS_GetSelectionFormat() { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); return settings.GetSelectionFormat(); } -void ProjectManager::AS_SetSelectionFormat(const NumericFormatSymbol & format) +void ProjectSelectionManager::AS_SetSelectionFormat( + const NumericFormatSymbol & format) { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); @@ -518,7 +547,8 @@ void ProjectManager::AS_SetSelectionFormat(const NumericFormatSymbol & format) SelectionBar::Get( project ).SetSelectionFormat(format); } -void ProjectManager::AS_ModifySelection(double &start, double &end, bool done) +void ProjectSelectionManager::AS_ModifySelection( + double &start, double &end, bool done) { auto &project = mProject; auto &history = ProjectHistory::Get( project ); @@ -531,7 +561,7 @@ void ProjectManager::AS_ModifySelection(double &start, double &end, bool done) } } -double ProjectManager::SSBL_GetRate() const +double ProjectSelectionManager::SSBL_GetRate() const { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); @@ -541,14 +571,15 @@ double ProjectManager::SSBL_GetRate() const tracks.Any().max( &WaveTrack::GetRate ) ); } -const NumericFormatSymbol & ProjectManager::SSBL_GetFrequencySelectionFormatName() +const NumericFormatSymbol & +ProjectSelectionManager::SSBL_GetFrequencySelectionFormatName() { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); return settings.GetFrequencySelectionFormatName(); } -void ProjectManager::SSBL_SetFrequencySelectionFormatName( +void ProjectSelectionManager::SSBL_SetFrequencySelectionFormatName( const NumericFormatSymbol & formatName) { auto &project = mProject; @@ -566,14 +597,14 @@ void ProjectManager::SSBL_SetFrequencySelectionFormatName( } const NumericFormatSymbol & -ProjectManager::SSBL_GetBandwidthSelectionFormatName() +ProjectSelectionManager::SSBL_GetBandwidthSelectionFormatName() { auto &project = mProject; auto &settings = ProjectSettings::Get( project ); return settings.GetBandwidthSelectionFormatName(); } -void ProjectManager::SSBL_SetBandwidthSelectionFormatName( +void ProjectSelectionManager::SSBL_SetBandwidthSelectionFormatName( const NumericFormatSymbol & formatName) { auto &project = mProject; @@ -590,7 +621,7 @@ void ProjectManager::SSBL_SetBandwidthSelectionFormatName( #endif } -void ProjectManager::SSBL_ModifySpectralSelection( +void ProjectSelectionManager::SSBL_ModifySpectralSelection( double &bottom, double &top, bool done) { #ifdef EXPERIMENTAL_SPECTRAL_EDITING @@ -1294,11 +1325,12 @@ void ProjectManager::OpenFile(const FilePath &fileNameArg, bool addtohistory) if (bParseSuccess) { auto &settings = ProjectSettings::Get( project ); - AS_SetSnapTo(settings.GetSnapTo()); - AS_SetSelectionFormat(settings.GetSelectionFormat()); - SSBL_SetFrequencySelectionFormatName( + auto &selectionManager = ProjectSelectionManager::Get( project ); + selectionManager.AS_SetSnapTo(settings.GetSnapTo()); + selectionManager.AS_SetSelectionFormat(settings.GetSelectionFormat()); + selectionManager.SSBL_SetFrequencySelectionFormatName( settings.GetFrequencySelectionFormatName()); - SSBL_SetBandwidthSelectionFormatName( + selectionManager.SSBL_SetBandwidthSelectionFormatName( settings.GetBandwidthSelectionFormatName()); ProjectHistory::Get( project ).InitialState(); diff --git a/src/ProjectManager.h b/src/ProjectManager.h index d6525ae8d..9f7f9148c 100644 --- a/src/ProjectManager.h +++ b/src/ProjectManager.h @@ -34,14 +34,50 @@ namespace ProjectFileIORegistry{ struct Entry; } using WaveTrackArray = std::vector < std::shared_ptr < WaveTrack > >; +class ProjectSelectionManager final + : public ClientData::Base + , public SelectionBarListener + , public SpectralSelectionBarListener +{ +public: + static ProjectSelectionManager &Get( AudacityProject &project ); + static const ProjectSelectionManager &Get( const AudacityProject &project ); + + explicit ProjectSelectionManager( AudacityProject &project ); + ~ProjectSelectionManager() override; + + // SelectionBarListener callback methods + double AS_GetRate() override; + void AS_SetRate(double rate) override; + int AS_GetSnapTo() override; + void AS_SetSnapTo(int snap) override; + const NumericFormatSymbol & AS_GetSelectionFormat() override; + void AS_SetSelectionFormat(const NumericFormatSymbol & format) override; + void AS_ModifySelection(double &start, double &end, bool done) override; + + // SpectralSelectionBarListener callback methods + double SSBL_GetRate() const override; + const NumericFormatSymbol & SSBL_GetFrequencySelectionFormatName() override; + void SSBL_SetFrequencySelectionFormatName( + const NumericFormatSymbol & formatName) override; + const NumericFormatSymbol & SSBL_GetBandwidthSelectionFormatName() override; + void SSBL_SetBandwidthSelectionFormatName( + const NumericFormatSymbol & formatName) override; + void SSBL_ModifySpectralSelection( + double &bottom, double &top, bool done) override; + +private: + bool SnapSelection(); + + AudacityProject &mProject; +}; + ///\brief Object associated with a project for high-level management of the /// project's lifetime, including creation, destruction, opening from file, /// importing, pushing undo states, and reverting to saved states class ProjectManager final : public wxEvtHandler , public ClientData::Base - , private SelectionBarListener - , private SpectralSelectionBarListener { public: static ProjectManager &Get( AudacityProject &project ); @@ -119,34 +155,12 @@ public: void SetMenuClose(bool value) { mMenuClose = value; } - // SelectionBarListener callback methods - double AS_GetRate() override; - void AS_SetRate(double rate) override; - int AS_GetSnapTo() override; - void AS_SetSnapTo(int snap) override; - const NumericFormatSymbol & AS_GetSelectionFormat() override; - void AS_SetSelectionFormat(const NumericFormatSymbol & format) override; - void AS_ModifySelection(double &start, double &end, bool done) override; - - // SpectralSelectionBarListener callback methods - double SSBL_GetRate() const override; - const NumericFormatSymbol & SSBL_GetFrequencySelectionFormatName() override; - void SSBL_SetFrequencySelectionFormatName( - const NumericFormatSymbol & formatName) override; - const NumericFormatSymbol & SSBL_GetBandwidthSelectionFormatName() override; - void SSBL_SetBandwidthSelectionFormatName( - const NumericFormatSymbol & formatName) override; - void SSBL_ModifySpectralSelection( - double &bottom, double &top, bool done) override; - private: void OnCloseWindow(wxCloseEvent & event); void OnTimer(wxTimerEvent & event); void OnOpenAudioFile(wxCommandEvent & event); void OnStatusChange( wxCommandEvent& ); - bool SnapSelection(); - void RestartTimer(); // Declared in this class so that they can have access to private members diff --git a/src/commands/SelectCommand.cpp b/src/commands/SelectCommand.cpp index 14de8c548..447c2fb89 100644 --- a/src/commands/SelectCommand.cpp +++ b/src/commands/SelectCommand.cpp @@ -165,7 +165,7 @@ bool SelectFrequenciesCommand::Apply(const CommandContext & context){ if( !bHasBottom ) mBottom = 0.0; - ProjectManager::Get( context.project ).SSBL_ModifySpectralSelection( + ProjectSelectionManager::Get( context.project ).SSBL_ModifySpectralSelection( mBottom, mTop, false);// false for not done. return true; } diff --git a/src/menus/HelpMenus.cpp b/src/menus/HelpMenus.cpp index c6893a6d1..17ab834fc 100644 --- a/src/menus/HelpMenus.cpp +++ b/src/menus/HelpMenus.cpp @@ -253,7 +253,7 @@ void QuickFixDialog::OnFix(wxCommandEvent &event) // preference dialogs. if( Str == "/SnapTo" ) { - ProjectManager::Get( *pProject ).AS_SetSnapTo( 0 ); + ProjectSelectionManager::Get( *pProject ).AS_SetSnapTo( 0 ); } else { diff --git a/src/menus/SelectMenus.cpp b/src/menus/SelectMenus.cpp index f61aa4462..d1eb799c5 100644 --- a/src/menus/SelectMenus.cpp +++ b/src/menus/SelectMenus.cpp @@ -901,19 +901,19 @@ void OnZeroCrossing(const CommandContext &context) void OnSnapToOff(const CommandContext &context) { auto &project = context.project; - ProjectManager::Get( project ).AS_SetSnapTo(SNAP_OFF); + ProjectSelectionManager::Get( project ).AS_SetSnapTo(SNAP_OFF); } void OnSnapToNearest(const CommandContext &context) { auto &project = context.project; - ProjectManager::Get( project ).AS_SetSnapTo(SNAP_NEAREST); + ProjectSelectionManager::Get( project ).AS_SetSnapTo(SNAP_NEAREST); } void OnSnapToPrior(const CommandContext &context) { auto &project = context.project; - ProjectManager::Get( project ).AS_SetSnapTo(SNAP_PRIOR); + ProjectSelectionManager::Get( project ).AS_SetSnapTo(SNAP_PRIOR); } void OnSelToStart(const CommandContext &context) From 997bf9781d0111709c3b4e0dcc8a8d46963aef2c Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 9 Jun 2019 07:42:40 -0400 Subject: [PATCH 2/2] New files for ProjectSelectionManager --- locale/POTFILES.in | 2 + mac/Audacity.xcodeproj/project.pbxproj | 6 + src/Makefile.am | 2 + src/Makefile.in | 54 ++-- src/ProjectManager.cpp | 227 +--------------- src/ProjectManager.h | 40 --- src/ProjectSelectionManager.cpp | 249 ++++++++++++++++++ src/ProjectSelectionManager.h | 58 ++++ src/commands/SelectCommand.cpp | 2 +- src/menus/HelpMenus.cpp | 2 +- src/menus/SelectMenus.cpp | 2 +- win/Projects/Audacity/Audacity.vcxproj | 2 + .../Audacity/Audacity.vcxproj.filters | 6 + 13 files changed, 365 insertions(+), 287 deletions(-) create mode 100644 src/ProjectSelectionManager.cpp create mode 100644 src/ProjectSelectionManager.h diff --git a/locale/POTFILES.in b/locale/POTFILES.in index 9bf9905cf..eca2b2c03 100644 --- a/locale/POTFILES.in +++ b/locale/POTFILES.in @@ -174,6 +174,8 @@ src/ProjectHistory.cpp src/ProjectHistory.h src/ProjectManager.cpp src/ProjectManager.h +src/ProjectSelectionManager.cpp +src/ProjectSelectionManager.h src/ProjectSettings.cpp src/ProjectSettings.h src/ProjectWindow.cpp diff --git a/mac/Audacity.xcodeproj/project.pbxproj b/mac/Audacity.xcodeproj/project.pbxproj index cd2fb3ce4..cd8c91bd4 100644 --- a/mac/Audacity.xcodeproj/project.pbxproj +++ b/mac/Audacity.xcodeproj/project.pbxproj @@ -1245,6 +1245,7 @@ 5E36A0B0217FA2430068E082 /* WindowMenus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E36A0A7217FA2430068E082 /* WindowMenus.cpp */; }; 5E36A0B2217FC5A10068E082 /* (null) in Sources */ = {isa = PBXBuildFile; }; 5E36A0B4217FC6540068E082 /* HelpMenus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E36A0B3217FC6540068E082 /* HelpMenus.cpp */; }; + 5E3A530822AD277A00C4ADB8 /* ProjectSelectionManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E3A530622AD277A00C4ADB8 /* ProjectSelectionManager.cpp */; }; 5E3FFE721EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */; }; 5E667A601F0BEE5F00C942A5 /* WaveTrackVZoomHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E667A5E1F0BEE5F00C942A5 /* WaveTrackVZoomHandle.cpp */; }; 5E667A651F0BEE8C00C942A5 /* NoteTrackButtonHandle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5E667A611F0BEE8C00C942A5 /* NoteTrackButtonHandle.cpp */; }; @@ -3237,6 +3238,8 @@ 5E36A0A6217FA2430068E082 /* ViewMenus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ViewMenus.cpp; path = menus/ViewMenus.cpp; sourceTree = ""; }; 5E36A0A7217FA2430068E082 /* WindowMenus.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = WindowMenus.cpp; path = menus/WindowMenus.cpp; sourceTree = ""; }; 5E36A0B3217FC6540068E082 /* HelpMenus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HelpMenus.cpp; path = menus/HelpMenus.cpp; sourceTree = ""; }; + 5E3A530622AD277A00C4ADB8 /* ProjectSelectionManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProjectSelectionManager.cpp; sourceTree = ""; }; + 5E3A530722AD277A00C4ADB8 /* ProjectSelectionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectSelectionManager.h; sourceTree = ""; }; 5E3FFE701EC9032B0020F7C9 /* NoteTrackSliderHandles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NoteTrackSliderHandles.cpp; sourceTree = ""; }; 5E3FFE711EC9032B0020F7C9 /* NoteTrackSliderHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoteTrackSliderHandles.h; sourceTree = ""; }; 5E4685F81CCA9D84008741F2 /* CommandFunctors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommandFunctors.h; sourceTree = ""; }; @@ -4390,6 +4393,7 @@ 5ECF728C228B307E007F2A35 /* ProjectFSCK.cpp */, 5EB15A1E22A94043009FEC89 /* ProjectHistory.cpp */, 5E135A3A229EDF2E0076E983 /* ProjectManager.cpp */, + 5E3A530622AD277A00C4ADB8 /* ProjectSelectionManager.cpp */, 5E135A34229EDBE80076E983 /* ProjectSettings.cpp */, 5E135A46229EE5530076E983 /* ProjectWindow.cpp */, 28DABFBC0FF19DB100AC7848 /* RealFFTf.cpp */, @@ -4513,6 +4517,7 @@ 5ECF728B228B307E007F2A35 /* ProjectFSCK.h */, 5EB15A1F22A94043009FEC89 /* ProjectHistory.h */, 5E135A3B229EDF2E0076E983 /* ProjectManager.h */, + 5E3A530722AD277A00C4ADB8 /* ProjectSelectionManager.h */, 5E135A35229EDBE80076E983 /* ProjectSettings.h */, 5E135A47229EE5530076E983 /* ProjectWindow.h */, 28DABFBD0FF19DB100AC7848 /* RealFFTf.h */, @@ -8547,6 +8552,7 @@ 28B97B890FBF771A0076CF28 /* VSTEffect.cpp in Sources */, 284B279A0FC66864005EAC96 /* DevicePrefs.cpp in Sources */, 284B279B0FC66864005EAC96 /* ImportExportPrefs.cpp in Sources */, + 5E3A530822AD277A00C4ADB8 /* ProjectSelectionManager.cpp in Sources */, 284B279C0FC66864005EAC96 /* LibraryPrefs.cpp in Sources */, 5E15126E1DB0010C00702E29 /* TrackControls.cpp in Sources */, 5EA0182A1EC7B226001F2996 /* NoteTrackVRulerControls.cpp in Sources */, diff --git a/src/Makefile.am b/src/Makefile.am index 9a2068a46..b35354eb6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -225,6 +225,8 @@ audacity_SOURCES = \ ProjectHistory.h \ ProjectManager.cpp \ ProjectManager.h \ + ProjectSelectionManager.cpp \ + ProjectSelectionManager.h \ ProjectSettings.cpp \ ProjectSettings.h \ ProjectWindow.cpp \ diff --git a/src/Makefile.in b/src/Makefile.in index cf55cba65..a98c20fe1 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -325,15 +325,16 @@ am__audacity_SOURCES_DIST = BlockFile.cpp BlockFile.h DirManager.cpp \ ProjectFileIO.cpp ProjectFileIO.h ProjectFileIORegistry.cpp \ ProjectFileIORegistry.h ProjectFSCK.cpp ProjectFSCK.h \ ProjectHistory.cpp ProjectHistory.h ProjectManager.cpp \ - ProjectManager.h ProjectSettings.cpp ProjectSettings.h \ - ProjectWindow.cpp ProjectWindow.h RealFFTf.cpp RealFFTf.h \ - RealFFTf48x.cpp RealFFTf48x.h RefreshCode.h Resample.cpp \ - Resample.h RevisionIdent.h RingBuffer.cpp RingBuffer.h \ - Screenshot.cpp Screenshot.h SelectedRegion.cpp \ - SelectedRegion.h SelectionState.cpp SelectionState.h \ - Shuttle.cpp Shuttle.h ShuttleGetDefinition.cpp \ - ShuttleGetDefinition.h ShuttleGui.cpp ShuttleGui.h \ - ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \ + ProjectManager.h ProjectSelectionManager.cpp \ + ProjectSelectionManager.h ProjectSettings.cpp \ + ProjectSettings.h ProjectWindow.cpp ProjectWindow.h \ + RealFFTf.cpp RealFFTf.h RealFFTf48x.cpp RealFFTf48x.h \ + RefreshCode.h Resample.cpp Resample.h RevisionIdent.h \ + RingBuffer.cpp RingBuffer.h Screenshot.cpp Screenshot.h \ + SelectedRegion.cpp SelectedRegion.h SelectionState.cpp \ + SelectionState.h Shuttle.cpp Shuttle.h \ + ShuttleGetDefinition.cpp ShuttleGetDefinition.h ShuttleGui.cpp \ + ShuttleGui.h ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \ SoundActivatedRecord.cpp SoundActivatedRecord.h Spectrum.cpp \ Spectrum.h SplashDialog.cpp SplashDialog.h SseMathFuncs.cpp \ SseMathFuncs.h Tags.cpp Tags.h Theme.cpp Theme.h \ @@ -677,6 +678,7 @@ am_audacity_OBJECTS = $(am__objects_1) audacity-AboutDialog.$(OBJEXT) \ audacity-ProjectFSCK.$(OBJEXT) \ audacity-ProjectHistory.$(OBJEXT) \ audacity-ProjectManager.$(OBJEXT) \ + audacity-ProjectSelectionManager.$(OBJEXT) \ audacity-ProjectSettings.$(OBJEXT) \ audacity-ProjectWindow.$(OBJEXT) audacity-RealFFTf.$(OBJEXT) \ audacity-RealFFTf48x.$(OBJEXT) audacity-Resample.$(OBJEXT) \ @@ -1400,15 +1402,16 @@ audacity_SOURCES = $(libaudacity_la_SOURCES) AboutDialog.cpp \ ProjectFileIO.cpp ProjectFileIO.h ProjectFileIORegistry.cpp \ ProjectFileIORegistry.h ProjectFSCK.cpp ProjectFSCK.h \ ProjectHistory.cpp ProjectHistory.h ProjectManager.cpp \ - ProjectManager.h ProjectSettings.cpp ProjectSettings.h \ - ProjectWindow.cpp ProjectWindow.h RealFFTf.cpp RealFFTf.h \ - RealFFTf48x.cpp RealFFTf48x.h RefreshCode.h Resample.cpp \ - Resample.h RevisionIdent.h RingBuffer.cpp RingBuffer.h \ - Screenshot.cpp Screenshot.h SelectedRegion.cpp \ - SelectedRegion.h SelectionState.cpp SelectionState.h \ - Shuttle.cpp Shuttle.h ShuttleGetDefinition.cpp \ - ShuttleGetDefinition.h ShuttleGui.cpp ShuttleGui.h \ - ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \ + ProjectManager.h ProjectSelectionManager.cpp \ + ProjectSelectionManager.h ProjectSettings.cpp \ + ProjectSettings.h ProjectWindow.cpp ProjectWindow.h \ + RealFFTf.cpp RealFFTf.h RealFFTf48x.cpp RealFFTf48x.h \ + RefreshCode.h Resample.cpp Resample.h RevisionIdent.h \ + RingBuffer.cpp RingBuffer.h Screenshot.cpp Screenshot.h \ + SelectedRegion.cpp SelectedRegion.h SelectionState.cpp \ + SelectionState.h Shuttle.cpp Shuttle.h \ + ShuttleGetDefinition.cpp ShuttleGetDefinition.h ShuttleGui.cpp \ + ShuttleGui.h ShuttlePrefs.cpp ShuttlePrefs.h Snap.cpp Snap.h \ SoundActivatedRecord.cpp SoundActivatedRecord.h Spectrum.cpp \ Spectrum.h SplashDialog.cpp SplashDialog.h SseMathFuncs.cpp \ SseMathFuncs.h Tags.cpp Tags.h Theme.cpp Theme.h \ @@ -2583,6 +2586,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ProjectFileIORegistry.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ProjectHistory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ProjectManager.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ProjectSelectionManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ProjectSettings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-ProjectWindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audacity-RealFFTf.Po@am__quote@ @@ -4098,6 +4102,20 @@ audacity-ProjectManager.obj: ProjectManager.cpp @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-ProjectManager.obj `if test -f 'ProjectManager.cpp'; then $(CYGPATH_W) 'ProjectManager.cpp'; else $(CYGPATH_W) '$(srcdir)/ProjectManager.cpp'; fi` +audacity-ProjectSelectionManager.o: ProjectSelectionManager.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-ProjectSelectionManager.o -MD -MP -MF $(DEPDIR)/audacity-ProjectSelectionManager.Tpo -c -o audacity-ProjectSelectionManager.o `test -f 'ProjectSelectionManager.cpp' || echo '$(srcdir)/'`ProjectSelectionManager.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-ProjectSelectionManager.Tpo $(DEPDIR)/audacity-ProjectSelectionManager.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ProjectSelectionManager.cpp' object='audacity-ProjectSelectionManager.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-ProjectSelectionManager.o `test -f 'ProjectSelectionManager.cpp' || echo '$(srcdir)/'`ProjectSelectionManager.cpp + +audacity-ProjectSelectionManager.obj: ProjectSelectionManager.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-ProjectSelectionManager.obj -MD -MP -MF $(DEPDIR)/audacity-ProjectSelectionManager.Tpo -c -o audacity-ProjectSelectionManager.obj `if test -f 'ProjectSelectionManager.cpp'; then $(CYGPATH_W) 'ProjectSelectionManager.cpp'; else $(CYGPATH_W) '$(srcdir)/ProjectSelectionManager.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-ProjectSelectionManager.Tpo $(DEPDIR)/audacity-ProjectSelectionManager.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ProjectSelectionManager.cpp' object='audacity-ProjectSelectionManager.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -c -o audacity-ProjectSelectionManager.obj `if test -f 'ProjectSelectionManager.cpp'; then $(CYGPATH_W) 'ProjectSelectionManager.cpp'; else $(CYGPATH_W) '$(srcdir)/ProjectSelectionManager.cpp'; fi` + audacity-ProjectSettings.o: ProjectSettings.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(audacity_CPPFLAGS) $(CPPFLAGS) $(audacity_CXXFLAGS) $(CXXFLAGS) -MT audacity-ProjectSettings.o -MD -MP -MF $(DEPDIR)/audacity-ProjectSettings.Tpo -c -o audacity-ProjectSettings.o `test -f 'ProjectSettings.cpp' || echo '$(srcdir)/'`ProjectSettings.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audacity-ProjectSettings.Tpo $(DEPDIR)/audacity-ProjectSettings.Po diff --git a/src/ProjectManager.cpp b/src/ProjectManager.cpp index 7edbc8c44..e976b5953 100644 --- a/src/ProjectManager.cpp +++ b/src/ProjectManager.cpp @@ -31,10 +31,10 @@ Paul Licameli split from AudacityProject.cpp #include "ProjectFileIORegistry.h" #include "ProjectFSCK.h" #include "ProjectHistory.h" +#include "ProjectSelectionManager.h" #include "ProjectSettings.h" #include "ProjectWindow.h" #include "Sequence.h" -#include "Snap.h" #include "Tags.h" #include "TrackPanel.h" #include "UndoManager.h" @@ -61,33 +61,6 @@ Paul Licameli split from AudacityProject.cpp const int AudacityProjectTimerID = 5200; -static AudacityProject::AttachedObjects::RegisteredFactory -sProjectSelectionManagerKey { - []( AudacityProject &project ) { - return std::make_shared< ProjectSelectionManager >( project ); - } -}; - -ProjectSelectionManager &ProjectSelectionManager::Get( - AudacityProject &project ) -{ - return project.AttachedObjects::Get< ProjectSelectionManager >( - sProjectSelectionManagerKey ); -} - -const ProjectSelectionManager &ProjectSelectionManager::Get( - const AudacityProject &project ) -{ - return Get( const_cast< AudacityProject & >( project ) ); -} - -ProjectSelectionManager::ProjectSelectionManager( AudacityProject &project ) - : mProject{ project } -{ -} - -ProjectSelectionManager::~ProjectSelectionManager() = default; - static AudacityProject::AttachedObjects::RegisteredFactory sProjectManagerKey { []( AudacityProject &project ) { return std::make_shared< ProjectManager >( project ); @@ -447,204 +420,6 @@ AudacityProject *ProjectManager::New() return p; } -bool ProjectSelectionManager::SnapSelection() -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - auto &window = ProjectWindow::Get( project ); - auto snapTo = settings.GetSnapTo(); - if (snapTo != SNAP_OFF) { - auto &viewInfo = ViewInfo::Get( project ); - SelectedRegion &selectedRegion = viewInfo.selectedRegion; - NumericConverter nc(NumericConverter::TIME, - settings.GetSelectionFormat(), 0, settings.GetRate()); - const bool nearest = (snapTo == SNAP_NEAREST); - - const double oldt0 = selectedRegion.t0(); - const double oldt1 = selectedRegion.t1(); - - nc.ValueToControls(oldt0, nearest); - nc.ControlsToValue(); - const double t0 = nc.GetValue(); - - nc.ValueToControls(oldt1, nearest); - nc.ControlsToValue(); - const double t1 = nc.GetValue(); - - if (t0 != oldt0 || t1 != oldt1) { - selectedRegion.setTimes(t0, t1); - window.TP_DisplaySelection(); - return true; - } - } - - return false; -} - -double ProjectSelectionManager::AS_GetRate() -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - return settings.GetRate(); -} - -// Typically this came from the SelectionToolbar and does not need to -// be communicated back to it. -void ProjectSelectionManager::AS_SetRate(double rate) -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - settings.SetRate( rate ); -} - -int ProjectSelectionManager::AS_GetSnapTo() -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - return settings.GetSnapTo(); -} - -void ProjectSelectionManager::AS_SetSnapTo(int snap) -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - auto &window = ProjectWindow::Get( project ); - - settings.SetSnapTo( snap ); - -// LLL: TODO - what should this be changed to??? -// GetCommandManager()->Check(wxT("Snap"), mSnapTo); - gPrefs->Write(wxT("/SnapTo"), snap); - gPrefs->Flush(); - - SnapSelection(); - - window.RedrawProject(); - - SelectionBar::Get( project ).SetSnapTo(snap); -} - -const NumericFormatSymbol & ProjectSelectionManager::AS_GetSelectionFormat() -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - return settings.GetSelectionFormat(); -} - -void ProjectSelectionManager::AS_SetSelectionFormat( - const NumericFormatSymbol & format) -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - settings.SetSelectionFormat( format ); - - gPrefs->Write(wxT("/SelectionFormat"), format.Internal()); - gPrefs->Flush(); - - if (SnapSelection()) - TrackPanel::Get( project ).Refresh(false); - - SelectionBar::Get( project ).SetSelectionFormat(format); -} - -void ProjectSelectionManager::AS_ModifySelection( - double &start, double &end, bool done) -{ - auto &project = mProject; - auto &history = ProjectHistory::Get( project ); - auto &trackPanel = TrackPanel::Get( project ); - auto &viewInfo = ViewInfo::Get( project ); - viewInfo.selectedRegion.setTimes(start, end); - trackPanel.Refresh(false); - if (done) { - history.ModifyState(false); - } -} - -double ProjectSelectionManager::SSBL_GetRate() const -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - auto &tracks = TrackList::Get( project ); - // Return maximum of project rate and all track rates. - return std::max( settings.GetRate(), - tracks.Any().max( &WaveTrack::GetRate ) ); -} - -const NumericFormatSymbol & -ProjectSelectionManager::SSBL_GetFrequencySelectionFormatName() -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - return settings.GetFrequencySelectionFormatName(); -} - -void ProjectSelectionManager::SSBL_SetFrequencySelectionFormatName( - const NumericFormatSymbol & formatName) -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - - settings.SetFrequencySelectionFormatName( formatName ); - - gPrefs->Write(wxT("/FrequencySelectionFormatName"), - formatName.Internal()); - gPrefs->Flush(); - -#ifdef EXPERIMENTAL_SPECTRAL_EDITING - SpectralSelectionBar::Get( project ).SetFrequencySelectionFormatName(formatName); -#endif -} - -const NumericFormatSymbol & -ProjectSelectionManager::SSBL_GetBandwidthSelectionFormatName() -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - return settings.GetBandwidthSelectionFormatName(); -} - -void ProjectSelectionManager::SSBL_SetBandwidthSelectionFormatName( - const NumericFormatSymbol & formatName) -{ - auto &project = mProject; - auto &settings = ProjectSettings::Get( project ); - - settings.SetBandwidthSelectionFormatName( formatName ); - - gPrefs->Write(wxT("/BandwidthSelectionFormatName"), - formatName.Internal()); - gPrefs->Flush(); - -#ifdef EXPERIMENTAL_SPECTRAL_EDITING - SpectralSelectionBar::Get( project ).SetBandwidthSelectionFormatName(formatName); -#endif -} - -void ProjectSelectionManager::SSBL_ModifySpectralSelection( - double &bottom, double &top, bool done) -{ -#ifdef EXPERIMENTAL_SPECTRAL_EDITING - auto &project = mProject; - auto &history = ProjectHistory::Get( project ); - auto &trackPanel = TrackPanel::Get( project ); - auto &viewInfo = ViewInfo::Get( project ); - - double nyq = SSBL_GetRate() / 2.0; - if (bottom >= 0.0) - bottom = std::min(nyq, bottom); - if (top >= 0.0) - top = std::min(nyq, top); - viewInfo.selectedRegion.setFrequencies(bottom, top); - trackPanel.Refresh(false); - if (done) { - history.ModifyState(false); - } -#else - bottom; top; done; -#endif -} - // LL: All objects that have a reference to the DirManager should // be deleted before the final mDirManager->Deref() in this // routine. Failing to do so can cause unwanted recursion diff --git a/src/ProjectManager.h b/src/ProjectManager.h index 9f7f9148c..2cc4dab97 100644 --- a/src/ProjectManager.h +++ b/src/ProjectManager.h @@ -16,8 +16,6 @@ Paul Licameli split from AudacityProject.h #include // to inherit #include "ClientData.h" // to inherit -#include "toolbars/SelectionBarListener.h" // to inherit -#include "toolbars/SpectralSelectionBarListener.h" // to inherit #include "import/ImportRaw.h" // defines TrackHolders class wxTimer; @@ -34,44 +32,6 @@ namespace ProjectFileIORegistry{ struct Entry; } using WaveTrackArray = std::vector < std::shared_ptr < WaveTrack > >; -class ProjectSelectionManager final - : public ClientData::Base - , public SelectionBarListener - , public SpectralSelectionBarListener -{ -public: - static ProjectSelectionManager &Get( AudacityProject &project ); - static const ProjectSelectionManager &Get( const AudacityProject &project ); - - explicit ProjectSelectionManager( AudacityProject &project ); - ~ProjectSelectionManager() override; - - // SelectionBarListener callback methods - double AS_GetRate() override; - void AS_SetRate(double rate) override; - int AS_GetSnapTo() override; - void AS_SetSnapTo(int snap) override; - const NumericFormatSymbol & AS_GetSelectionFormat() override; - void AS_SetSelectionFormat(const NumericFormatSymbol & format) override; - void AS_ModifySelection(double &start, double &end, bool done) override; - - // SpectralSelectionBarListener callback methods - double SSBL_GetRate() const override; - const NumericFormatSymbol & SSBL_GetFrequencySelectionFormatName() override; - void SSBL_SetFrequencySelectionFormatName( - const NumericFormatSymbol & formatName) override; - const NumericFormatSymbol & SSBL_GetBandwidthSelectionFormatName() override; - void SSBL_SetBandwidthSelectionFormatName( - const NumericFormatSymbol & formatName) override; - void SSBL_ModifySpectralSelection( - double &bottom, double &top, bool done) override; - -private: - bool SnapSelection(); - - AudacityProject &mProject; -}; - ///\brief Object associated with a project for high-level management of the /// project's lifetime, including creation, destruction, opening from file, /// importing, pushing undo states, and reverting to saved states diff --git a/src/ProjectSelectionManager.cpp b/src/ProjectSelectionManager.cpp new file mode 100644 index 000000000..2391edf41 --- /dev/null +++ b/src/ProjectSelectionManager.cpp @@ -0,0 +1,249 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +ProjectSelectionManager.cpp + +Paul Licameli split from ProjectManager.cpp + +**********************************************************************/ + +#include "ProjectSelectionManager.h" + +#include "Experimental.h" + +#include "Project.h" +#include "ProjectHistory.h" +#include "ProjectSettings.h" +#include "ProjectWindow.h" +#include "Snap.h" +#include "TrackPanel.h" +#include "ViewInfo.h" +#include "WaveTrack.h" +#include "toolbars/SelectionBar.h" +#include "toolbars/SpectralSelectionBar.h" + +static AudacityProject::AttachedObjects::RegisteredFactory +sProjectSelectionManagerKey { + []( AudacityProject &project ) { + return std::make_shared< ProjectSelectionManager >( project ); + } +}; + +ProjectSelectionManager &ProjectSelectionManager::Get( + AudacityProject &project ) +{ + return project.AttachedObjects::Get< ProjectSelectionManager >( + sProjectSelectionManagerKey ); +} + +const ProjectSelectionManager &ProjectSelectionManager::Get( + const AudacityProject &project ) +{ + return Get( const_cast< AudacityProject & >( project ) ); +} + +ProjectSelectionManager::ProjectSelectionManager( AudacityProject &project ) + : mProject{ project } +{ +} + +ProjectSelectionManager::~ProjectSelectionManager() = default; + +bool ProjectSelectionManager::SnapSelection() +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + auto &window = ProjectWindow::Get( project ); + auto snapTo = settings.GetSnapTo(); + if (snapTo != SNAP_OFF) { + auto &viewInfo = ViewInfo::Get( project ); + SelectedRegion &selectedRegion = viewInfo.selectedRegion; + NumericConverter nc(NumericConverter::TIME, + settings.GetSelectionFormat(), 0, settings.GetRate()); + const bool nearest = (snapTo == SNAP_NEAREST); + + const double oldt0 = selectedRegion.t0(); + const double oldt1 = selectedRegion.t1(); + + nc.ValueToControls(oldt0, nearest); + nc.ControlsToValue(); + const double t0 = nc.GetValue(); + + nc.ValueToControls(oldt1, nearest); + nc.ControlsToValue(); + const double t1 = nc.GetValue(); + + if (t0 != oldt0 || t1 != oldt1) { + selectedRegion.setTimes(t0, t1); + window.TP_DisplaySelection(); + return true; + } + } + + return false; +} + +double ProjectSelectionManager::AS_GetRate() +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + return settings.GetRate(); +} + +// Typically this came from the SelectionToolbar and does not need to +// be communicated back to it. +void ProjectSelectionManager::AS_SetRate(double rate) +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + settings.SetRate( rate ); +} + +int ProjectSelectionManager::AS_GetSnapTo() +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + return settings.GetSnapTo(); +} + +void ProjectSelectionManager::AS_SetSnapTo(int snap) +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + auto &window = ProjectWindow::Get( project ); + + settings.SetSnapTo( snap ); + +// LLL: TODO - what should this be changed to??? +// GetCommandManager()->Check(wxT("Snap"), mSnapTo); + gPrefs->Write(wxT("/SnapTo"), snap); + gPrefs->Flush(); + + SnapSelection(); + + window.RedrawProject(); + + SelectionBar::Get( project ).SetSnapTo(snap); +} + +const NumericFormatSymbol & ProjectSelectionManager::AS_GetSelectionFormat() +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + return settings.GetSelectionFormat(); +} + +void ProjectSelectionManager::AS_SetSelectionFormat( + const NumericFormatSymbol & format) +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + settings.SetSelectionFormat( format ); + + gPrefs->Write(wxT("/SelectionFormat"), format.Internal()); + gPrefs->Flush(); + + if (SnapSelection()) + TrackPanel::Get( project ).Refresh(false); + + SelectionBar::Get( project ).SetSelectionFormat(format); +} + +void ProjectSelectionManager::AS_ModifySelection( + double &start, double &end, bool done) +{ + auto &project = mProject; + auto &history = ProjectHistory::Get( project ); + auto &trackPanel = TrackPanel::Get( project ); + auto &viewInfo = ViewInfo::Get( project ); + viewInfo.selectedRegion.setTimes(start, end); + trackPanel.Refresh(false); + if (done) { + history.ModifyState(false); + } +} + +double ProjectSelectionManager::SSBL_GetRate() const +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + auto &tracks = TrackList::Get( project ); + // Return maximum of project rate and all track rates. + return std::max( settings.GetRate(), + tracks.Any().max( &WaveTrack::GetRate ) ); +} + +const NumericFormatSymbol & +ProjectSelectionManager::SSBL_GetFrequencySelectionFormatName() +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + return settings.GetFrequencySelectionFormatName(); +} + +void ProjectSelectionManager::SSBL_SetFrequencySelectionFormatName( + const NumericFormatSymbol & formatName) +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + + settings.SetFrequencySelectionFormatName( formatName ); + + gPrefs->Write(wxT("/FrequencySelectionFormatName"), + formatName.Internal()); + gPrefs->Flush(); + +#ifdef EXPERIMENTAL_SPECTRAL_EDITING + SpectralSelectionBar::Get( project ).SetFrequencySelectionFormatName(formatName); +#endif +} + +const NumericFormatSymbol & +ProjectSelectionManager::SSBL_GetBandwidthSelectionFormatName() +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + return settings.GetBandwidthSelectionFormatName(); +} + +void ProjectSelectionManager::SSBL_SetBandwidthSelectionFormatName( + const NumericFormatSymbol & formatName) +{ + auto &project = mProject; + auto &settings = ProjectSettings::Get( project ); + + settings.SetBandwidthSelectionFormatName( formatName ); + + gPrefs->Write(wxT("/BandwidthSelectionFormatName"), + formatName.Internal()); + gPrefs->Flush(); + +#ifdef EXPERIMENTAL_SPECTRAL_EDITING + SpectralSelectionBar::Get( project ).SetBandwidthSelectionFormatName(formatName); +#endif +} + +void ProjectSelectionManager::SSBL_ModifySpectralSelection( + double &bottom, double &top, bool done) +{ +#ifdef EXPERIMENTAL_SPECTRAL_EDITING + auto &project = mProject; + auto &history = ProjectHistory::Get( project ); + auto &trackPanel = TrackPanel::Get( project ); + auto &viewInfo = ViewInfo::Get( project ); + + double nyq = SSBL_GetRate() / 2.0; + if (bottom >= 0.0) + bottom = std::min(nyq, bottom); + if (top >= 0.0) + top = std::min(nyq, top); + viewInfo.selectedRegion.setFrequencies(bottom, top); + trackPanel.Refresh(false); + if (done) { + history.ModifyState(false); + } +#else + bottom; top; done; +#endif +} diff --git a/src/ProjectSelectionManager.h b/src/ProjectSelectionManager.h new file mode 100644 index 000000000..83703b43b --- /dev/null +++ b/src/ProjectSelectionManager.h @@ -0,0 +1,58 @@ +/********************************************************************** + +Audacity: A Digital Audio Editor + +ProjectSelectionManager.cpp + +Paul Licameli split from ProjectManager.cpp + +**********************************************************************/ + +#ifndef __AUDACITY_PROJECT_SELECTION_MANAGER__ +#define __AUDACITY_PROJECT_SELECTION_MANAGER__ + +#include "ClientData.h" // to inherit +#include "toolbars/SelectionBarListener.h" // to inherit +#include "toolbars/SpectralSelectionBarListener.h" // to inherit + +class AudacityProject; + +class ProjectSelectionManager final + : public ClientData::Base + , public SelectionBarListener + , public SpectralSelectionBarListener +{ +public: + static ProjectSelectionManager &Get( AudacityProject &project ); + static const ProjectSelectionManager &Get( const AudacityProject &project ); + + explicit ProjectSelectionManager( AudacityProject &project ); + ~ProjectSelectionManager() override; + + // SelectionBarListener callback methods + double AS_GetRate() override; + void AS_SetRate(double rate) override; + int AS_GetSnapTo() override; + void AS_SetSnapTo(int snap) override; + const NumericFormatSymbol & AS_GetSelectionFormat() override; + void AS_SetSelectionFormat(const NumericFormatSymbol & format) override; + void AS_ModifySelection(double &start, double &end, bool done) override; + + // SpectralSelectionBarListener callback methods + double SSBL_GetRate() const override; + const NumericFormatSymbol & SSBL_GetFrequencySelectionFormatName() override; + void SSBL_SetFrequencySelectionFormatName( + const NumericFormatSymbol & formatName) override; + const NumericFormatSymbol & SSBL_GetBandwidthSelectionFormatName() override; + void SSBL_SetBandwidthSelectionFormatName( + const NumericFormatSymbol & formatName) override; + void SSBL_ModifySpectralSelection( + double &bottom, double &top, bool done) override; + +private: + bool SnapSelection(); + + AudacityProject &mProject; +}; + +#endif diff --git a/src/commands/SelectCommand.cpp b/src/commands/SelectCommand.cpp index 447c2fb89..e81dade04 100644 --- a/src/commands/SelectCommand.cpp +++ b/src/commands/SelectCommand.cpp @@ -35,7 +35,7 @@ explicitly code all three. #include #include -#include "../ProjectManager.h" +#include "../ProjectSelectionManager.h" #include "../TrackPanel.h" #include "../Shuttle.h" #include "../ShuttleGui.h" diff --git a/src/menus/HelpMenus.cpp b/src/menus/HelpMenus.cpp index 17ab834fc..c6add9ad9 100644 --- a/src/menus/HelpMenus.cpp +++ b/src/menus/HelpMenus.cpp @@ -16,7 +16,7 @@ #include "../Menus.h" #include "../Prefs.h" #include "../Project.h" -#include "../ProjectManager.h" +#include "../ProjectSelectionManager.h" #include "../ShuttleGui.h" #include "../SplashDialog.h" #include "../Theme.h" diff --git a/src/menus/SelectMenus.cpp b/src/menus/SelectMenus.cpp index d1eb799c5..31630a2c5 100644 --- a/src/menus/SelectMenus.cpp +++ b/src/menus/SelectMenus.cpp @@ -9,7 +9,7 @@ #include "../Project.h" #include "../ProjectAudioIO.h" #include "../ProjectHistory.h" -#include "../ProjectManager.h" +#include "../ProjectSelectionManager.h" #include "../ProjectSettings.h" #include "../ProjectWindow.h" #include "../SelectionState.h" diff --git a/win/Projects/Audacity/Audacity.vcxproj b/win/Projects/Audacity/Audacity.vcxproj index f2717a946..7f19e1579 100755 --- a/win/Projects/Audacity/Audacity.vcxproj +++ b/win/Projects/Audacity/Audacity.vcxproj @@ -229,6 +229,7 @@ + @@ -664,6 +665,7 @@ + diff --git a/win/Projects/Audacity/Audacity.vcxproj.filters b/win/Projects/Audacity/Audacity.vcxproj.filters index 96c1645ad..c3c156a5a 100755 --- a/win/Projects/Audacity/Audacity.vcxproj.filters +++ b/win/Projects/Audacity/Audacity.vcxproj.filters @@ -284,6 +284,9 @@ src + + src + src @@ -1366,6 +1369,9 @@ src + + src + src