From e6d7a72a733917db3deb292ba7af65623469d6b7 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 12 Jun 2019 15:53:13 -0400 Subject: [PATCH] Registration of toolbar factory functions... ... reduces direct dependencies of ToolManager.cpp. This frees four files from cycles: DeviceToolBar EditToolBar MeterToolBar MixerToolBar Leaving 66 files still in the big s.c.c. --- src/toolbars/ControlToolBar.cpp | 4 ++++ src/toolbars/DeviceToolBar.cpp | 4 ++++ src/toolbars/EditToolBar.cpp | 4 +++- src/toolbars/MeterToolBar.cpp | 12 +++++++++++ src/toolbars/MixerToolBar.cpp | 4 ++++ src/toolbars/ScrubbingToolBar.cpp | 4 ++++ src/toolbars/SelectionBar.cpp | 4 ++++ src/toolbars/SpectralSelectionBar.cpp | 4 ++++ src/toolbars/ToolBar.cpp | 22 ++++++++++++++++++++ src/toolbars/ToolBar.h | 15 +++++++++++++- src/toolbars/ToolManager.cpp | 29 ++++----------------------- src/toolbars/ToolsToolBar.cpp | 4 ++++ src/toolbars/TranscriptionToolBar.cpp | 4 ++++ 13 files changed, 87 insertions(+), 27 deletions(-) diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index 99889aeb2..e680203e8 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -1572,3 +1572,7 @@ TransportTracks GetAllPlaybackTracks(TrackList &trackList, bool selectedOnly, bo #endif return result; } + +static RegisteredToolbarFactory factory{ TransportBarID, + [](AudacityProject*){ return ToolBar::Holder{ safenew ControlToolBar }; } +}; diff --git a/src/toolbars/DeviceToolBar.cpp b/src/toolbars/DeviceToolBar.cpp index 25a4a7bad..0a48217d2 100644 --- a/src/toolbars/DeviceToolBar.cpp +++ b/src/toolbars/DeviceToolBar.cpp @@ -871,3 +871,7 @@ void DeviceToolBar::ShowComboDialog(wxChoice *combo, const wxString &title) } #endif } + +static RegisteredToolbarFactory factory{ DeviceBarID, + [](AudacityProject *){ return ToolBar::Holder{ safenew DeviceToolBar }; } +}; diff --git a/src/toolbars/EditToolBar.cpp b/src/toolbars/EditToolBar.cpp index d69225f26..e47880a6a 100644 --- a/src/toolbars/EditToolBar.cpp +++ b/src/toolbars/EditToolBar.cpp @@ -303,4 +303,6 @@ void EditToolBar::OnButton(wxCommandEvent &event) cm.HandleTextualCommand(EditToolbarButtonList[id].commandName, context, flags, NoFlagsSpecified); } - +static RegisteredToolbarFactory factory{ EditBarID, + [](AudacityProject *){ return ToolBar::Holder{ safenew EditToolBar }; } +}; diff --git a/src/toolbars/MeterToolBar.cpp b/src/toolbars/MeterToolBar.cpp index b58b6458a..7b87c9acb 100644 --- a/src/toolbars/MeterToolBar.cpp +++ b/src/toolbars/MeterToolBar.cpp @@ -274,3 +274,15 @@ void MeterToolBar::SetDocked(ToolDock *dock, bool pushed) { Fit(); } +static RegisteredToolbarFactory factory1{ RecordMeterBarID, + [](AudacityProject *parent){ + return ToolBar::Holder{ safenew MeterToolBar{ parent, RecordMeterBarID } }; } +}; +static RegisteredToolbarFactory factory2{ PlayMeterBarID, + [](AudacityProject *parent){ + return ToolBar::Holder{ safenew MeterToolBar{ parent, PlayMeterBarID } }; } +}; +static RegisteredToolbarFactory factory3{ MeterBarID, + [](AudacityProject *parent){ + return ToolBar::Holder{ safenew MeterToolBar{ parent, MeterBarID } }; } +}; diff --git a/src/toolbars/MixerToolBar.cpp b/src/toolbars/MixerToolBar.cpp index c50cf8676..7a716793c 100644 --- a/src/toolbars/MixerToolBar.cpp +++ b/src/toolbars/MixerToolBar.cpp @@ -314,3 +314,7 @@ void MixerToolBar::SetToolTips() mOutputSlider->SetToolTipTemplate(_("Playback Volume (Unavailable; use system mixer.)")); } } + +static RegisteredToolbarFactory factory{ MixerBarID, + [](AudacityProject *){ return ToolBar::Holder{ safenew MixerToolBar }; } +}; diff --git a/src/toolbars/ScrubbingToolBar.cpp b/src/toolbars/ScrubbingToolBar.cpp index a916939b3..226bc1e48 100644 --- a/src/toolbars/ScrubbingToolBar.cpp +++ b/src/toolbars/ScrubbingToolBar.cpp @@ -261,3 +261,7 @@ void ScrubbingToolBar::EnableDisableButtons() RegenerateTooltips(); scrubber.CheckMenuItems(); } + +static RegisteredToolbarFactory factory{ ScrubbingBarID, + [](AudacityProject *){ return ToolBar::Holder{ safenew ScrubbingToolBar }; } +}; diff --git a/src/toolbars/SelectionBar.cpp b/src/toolbars/SelectionBar.cpp index 39d078817..db51cfaa0 100644 --- a/src/toolbars/SelectionBar.cpp +++ b/src/toolbars/SelectionBar.cpp @@ -760,3 +760,7 @@ void SelectionBar::OnSnapTo(wxCommandEvent & WXUNUSED(event)) { mListener->AS_SetSnapTo(mSnapTo->GetSelection()); } + +static RegisteredToolbarFactory factory{ SelectionBarID, + [](AudacityProject *){ return ToolBar::Holder{ safenew SelectionBar }; } +}; diff --git a/src/toolbars/SpectralSelectionBar.cpp b/src/toolbars/SpectralSelectionBar.cpp index de87a6a04..1b124b165 100644 --- a/src/toolbars/SpectralSelectionBar.cpp +++ b/src/toolbars/SpectralSelectionBar.cpp @@ -491,4 +491,8 @@ void SpectralSelectionBar::SetBandwidthSelectionFormatName(const NumericFormatSy } } +static RegisteredToolbarFactory factory{ SpectralSelectionBarID, + [](AudacityProject *){ return ToolBar::Holder{ safenew SpectralSelectionBar }; } +}; + #endif // #ifdef EXPERIMENTAL_SPECTRAL_EDITING diff --git a/src/toolbars/ToolBar.cpp b/src/toolbars/ToolBar.cpp index 2368d9add..7f4d75d0e 100644 --- a/src/toolbars/ToolBar.cpp +++ b/src/toolbars/ToolBar.cpp @@ -913,3 +913,25 @@ int ToolBar::GetResizeGrabberWidth() { return RWIDTH; } + +namespace { + +RegisteredToolbarFactory::Functions &GetFunctions() +{ + static RegisteredToolbarFactory::Functions factories( ToolBarCount ); + return factories; +} + +} + +RegisteredToolbarFactory::RegisteredToolbarFactory( + int id, const Function &function) +{ + wxASSERT( id >= 0 && id < ToolBarCount ); + GetFunctions()[ id ] = function; +} + +auto RegisteredToolbarFactory::GetFactories() -> const Functions& +{ + return GetFunctions(); +} diff --git a/src/toolbars/ToolBar.h b/src/toolbars/ToolBar.h index beb6f2ae9..a061464a0 100644 --- a/src/toolbars/ToolBar.h +++ b/src/toolbars/ToolBar.h @@ -15,12 +15,14 @@ #include "../Experimental.h" +#include #include #include #include "../Prefs.h" #include "../Theme.h" #include "../widgets/wxPanelWrapper.h" // to inherit +#include class wxBoxSizer; class wxDC; @@ -92,7 +94,7 @@ class ToolBar /* not final */ public: - using Holder = Destroy_ptr; + using Holder = wxWindowPtr; ToolBar(int type, const wxString & label, const wxString & section, bool resizable = false); virtual ~ToolBar(); @@ -239,4 +241,15 @@ class ToolBar /* not final */ friend class ToolBarResizer; }; +class AudacityProject; + +struct RegisteredToolbarFactory { + using Function = std::function< ToolBar::Holder( AudacityProject * ) >; + using Functions = std::vector< Function >; + + RegisteredToolbarFactory( int id, const Function &function ); + + static const Functions &GetFactories(); +}; + #endif diff --git a/src/toolbars/ToolManager.cpp b/src/toolbars/ToolManager.cpp index 9233bfe5d..48a52d36b 100644 --- a/src/toolbars/ToolManager.cpp +++ b/src/toolbars/ToolManager.cpp @@ -52,17 +52,6 @@ #include #include -#include "ControlToolBar.h" -#include "DeviceToolBar.h" -#include "EditToolBar.h" -#include "MeterToolBar.h" -#include "MixerToolBar.h" -#include "ScrubbingToolBar.h" -#include "SelectionBar.h" -#include "SpectralSelectionBar.h" -#include "ToolsToolBar.h" -#include "TranscriptionToolBar.h" - #include "../AColor.h" #include "../AllThemeResources.h" #include "../ImageManipulation.h" @@ -429,20 +418,10 @@ ToolManager::ToolManager( AudacityProject *parent, wxWindow *topDockParent ) // Create all of the toolbars // All have the project as parent window wxASSERT(parent); - mBars[ ToolsBarID ] = ToolBar::Holder{ safenew ToolsToolBar() }; - mBars[ TransportBarID ] = ToolBar::Holder{ safenew ControlToolBar() }; - mBars[ RecordMeterBarID ] = ToolBar::Holder{ safenew MeterToolBar( parent, RecordMeterBarID ) }; - mBars[ PlayMeterBarID ] = ToolBar::Holder{ safenew MeterToolBar( parent, PlayMeterBarID ) }; - mBars[ MeterBarID ] = ToolBar::Holder{ safenew MeterToolBar( parent, MeterBarID ) }; - mBars[ EditBarID ] = ToolBar::Holder{ safenew EditToolBar() }; - mBars[ MixerBarID ] = ToolBar::Holder{ safenew MixerToolBar() }; - mBars[ TranscriptionBarID ] = ToolBar::Holder{ safenew TranscriptionToolBar() }; - mBars[ SelectionBarID ] = ToolBar::Holder{ safenew SelectionBar() }; - mBars[ DeviceBarID ] = ToolBar::Holder{ safenew DeviceToolBar() }; -#ifdef EXPERIMENTAL_SPECTRAL_EDITING - mBars[SpectralSelectionBarID] = ToolBar::Holder{ safenew SpectralSelectionBar() }; -#endif - mBars[ ScrubbingBarID ] = ToolBar::Holder{ safenew ScrubbingToolBar() }; + + size_t ii = 0; + for (const auto &factory : RegisteredToolbarFactory::GetFactories()) + mBars[ii++] = factory( parent ); // We own the timer mTimer.SetOwner( this ); diff --git a/src/toolbars/ToolsToolBar.cpp b/src/toolbars/ToolsToolBar.cpp index 23a744740..68b15c8d1 100644 --- a/src/toolbars/ToolsToolBar.cpp +++ b/src/toolbars/ToolsToolBar.cpp @@ -276,3 +276,7 @@ void ToolsToolBar::Create(wxWindow * parent) ToolBar::Create(parent); UpdatePrefs(); } + +static RegisteredToolbarFactory factory{ ToolsBarID, + [](AudacityProject*){ return ToolBar::Holder{ safenew ToolsToolBar }; } +}; diff --git a/src/toolbars/TranscriptionToolBar.cpp b/src/toolbars/TranscriptionToolBar.cpp index 75417d5bc..082702ddc 100644 --- a/src/toolbars/TranscriptionToolBar.cpp +++ b/src/toolbars/TranscriptionToolBar.cpp @@ -980,3 +980,7 @@ void TranscriptionToolBar::AdjustPlaySpeed(float adj) OnSpeedSlider(e); } +static RegisteredToolbarFactory factory{ TranscriptionBarID, + [](AudacityProject *){ + return ToolBar::Holder{ safenew TranscriptionToolBar }; } +};