diff --git a/src/LabelTrack.h b/src/LabelTrack.h index 47f9c9a36..63b3621b4 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -169,10 +169,6 @@ public: double mClipLen; int miLastLabel; // used by FindNextLabel and FindPrevLabel - -private: - std::shared_ptr DoGetView() override; - std::shared_ptr DoGetControls() override; }; struct LabelTrackEvent : TrackListEvent diff --git a/src/NoteTrack.h b/src/NoteTrack.h index f15734a37..9267b16e1 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -222,10 +222,6 @@ public: int mVisibleChannels; // bit set of visible channels std::weak_ptr mStretchHandle; - -protected: - std::shared_ptr DoGetView() override; - std::shared_ptr DoGetControls() override; }; /// Data used to display a note track diff --git a/src/TimeTrack.h b/src/TimeTrack.h index e1d33f1f1..9f1ccc05a 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -113,10 +113,6 @@ private: Track::Holder Clone() const override; friend class TrackFactory; - -protected: - std::shared_ptr DoGetView() override; - std::shared_ptr DoGetControls() override; }; diff --git a/src/Track.cpp b/src/Track.cpp index 7bef624bf..8d34889ec 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -1284,3 +1284,13 @@ void TrackFactory::Destroy( AudacityProject &project ) { project.AttachedObjects::Assign( key2, nullptr ); } + +template<> auto DoGetControls::Implementation() -> Function { + return nullptr; +} +static DoGetControls registerDoGetControls; + +template<> auto DoGetView::Implementation() -> Function { + return nullptr; +} +static DoGetView registerDoGetView; diff --git a/src/Track.h b/src/Track.h index a37238707..74b1bfba6 100644 --- a/src/Track.h +++ b/src/Track.h @@ -704,12 +704,6 @@ public: bool HandleCommonXMLAttribute(const wxChar *attr, const wxChar *value); protected: - - // These are called to create controls on demand: - virtual std::shared_ptr DoGetView() = 0; - virtual std::shared_ptr DoGetControls() = 0; - - // These hold the controls: std::shared_ptr mpView; std::shared_ptr mpControls; }; @@ -1595,4 +1589,24 @@ class AUDACITY_DLL_API TrackFactory final #endif }; +#include "AttachedVirtualFunction.h" + +struct DoGetControlsTag; + +using DoGetControls = +AttachedVirtualFunction< + DoGetControlsTag, + std::shared_ptr< TrackControls >, + Track +>; + +struct DoGetViewTag; + +using DoGetView = +AttachedVirtualFunction< + DoGetViewTag, + std::shared_ptr< TrackView >, + Track +>; + #endif diff --git a/src/WaveTrack.h b/src/WaveTrack.h index 9e7037487..826169d81 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -682,10 +682,6 @@ private: std::unique_ptr mpSpectrumSettings; std::unique_ptr mpWaveformSettings; - -protected: - std::shared_ptr DoGetView() override; - std::shared_ptr DoGetControls() override; }; // This is meant to be a short-lived object, during whose lifetime, diff --git a/src/tracks/labeltrack/ui/LabelTrackControls.cpp b/src/tracks/labeltrack/ui/LabelTrackControls.cpp index 0054dbdf9..af316ce11 100644 --- a/src/tracks/labeltrack/ui/LabelTrackControls.cpp +++ b/src/tracks/labeltrack/ui/LabelTrackControls.cpp @@ -170,3 +170,11 @@ PopupMenuTable *LabelTrackControls::GetMenuExtension(Track *) { return &LabelTrackMenuTable::Instance(); } + +using DoGetLabelTrackControls = DoGetControls::Override< LabelTrack >; +template<> template<> auto DoGetLabelTrackControls::Implementation() -> Function { + return [](LabelTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; +} +static DoGetLabelTrackControls registerDoGetLabelTrackControls; diff --git a/src/tracks/labeltrack/ui/LabelTrackView.cpp b/src/tracks/labeltrack/ui/LabelTrackView.cpp index e56463c67..620a22e87 100644 --- a/src/tracks/labeltrack/ui/LabelTrackView.cpp +++ b/src/tracks/labeltrack/ui/LabelTrackView.cpp @@ -2080,15 +2080,13 @@ int LabelTrackView::DialogForLabelName( return status; } -std::shared_ptr LabelTrack::DoGetView() -{ - return std::make_shared( SharedPointer() ); -} - -std::shared_ptr LabelTrack::DoGetControls() -{ - return std::make_shared( SharedPointer() ); +using DoGetLabelTrackView = DoGetView::Override< LabelTrack >; +template<> template<> auto DoGetLabelTrackView::Implementation() -> Function { + return [](LabelTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; } +static DoGetLabelTrackView registerDoGetLabelTrackView; std::shared_ptr LabelTrackView::DoGetVRulerControls() { diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp index e32e7b057..29c9958c9 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp @@ -310,3 +310,11 @@ void NoteTrackControls::ReCreateVelocitySlider( wxEvent &evt ) pParent; #endif } + +using DoGetNoteTrackControls = DoGetControls::Override< NoteTrack >; +template<> template<> auto DoGetNoteTrackControls::Implementation() -> Function { + return [](NoteTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; +} +static DoGetNoteTrackControls registerDoGetNoteTrackControls; diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp index 3b55696d7..26fb35fc4 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp @@ -53,15 +53,13 @@ std::vector NoteTrackView::DetailedHitTest return results; } -std::shared_ptr NoteTrack::DoGetView() -{ - return std::make_shared( SharedPointer() ); -} - -std::shared_ptr NoteTrack::DoGetControls() -{ - return std::make_shared( SharedPointer() ); +using DoGetNoteTrackView = DoGetView::Override< NoteTrack >; +template<> template<> auto DoGetNoteTrackView::Implementation() -> Function { + return [](NoteTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; } +static DoGetNoteTrackView registerDoGetNoteTrackView; std::shared_ptr NoteTrackView::DoGetVRulerControls() { diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index 1a7f39dcf..27898eee7 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -1283,3 +1283,11 @@ void WaveTrackControls::ReCreatePanSlider( wxEvent &event ) PAN_SLIDER); gPanCaptured->SetDefaultValue(defPos); } + +using DoGetWaveTrackControls = DoGetControls::Override< WaveTrack >; +template<> template<> auto DoGetWaveTrackControls::Implementation() -> Function { + return [](WaveTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; +} +static DoGetWaveTrackControls registerDoGetWaveTrackControls; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index 3a2abe81d..37bd8a9fd 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -156,15 +156,13 @@ void WaveTrackView::DoSetMinimized( bool minimized ) TrackView::DoSetMinimized( minimized ); } -std::shared_ptr WaveTrack::DoGetView() -{ - return std::make_shared( SharedPointer() ); -} - -std::shared_ptr WaveTrack::DoGetControls() -{ - return std::make_shared( SharedPointer() ); +using DoGetWaveTrackView = DoGetView::Override< WaveTrack >; +template<> template<> auto DoGetWaveTrackView::Implementation() -> Function { + return [](WaveTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; } +static DoGetWaveTrackView registerDoGetWaveTrackView; std::shared_ptr WaveTrackView::DoGetVRulerControls() { diff --git a/src/tracks/timetrack/ui/TimeTrackControls.cpp b/src/tracks/timetrack/ui/TimeTrackControls.cpp index e855f77da..552cce92c 100644 --- a/src/tracks/timetrack/ui/TimeTrackControls.cpp +++ b/src/tracks/timetrack/ui/TimeTrackControls.cpp @@ -170,3 +170,11 @@ PopupMenuTable *TimeTrackControls::GetMenuExtension(Track *) { return &TimeTrackMenuTable::Instance(); } + +using DoGetTimeTrackControls = DoGetControls::Override< TimeTrack >; +template<> template<> auto DoGetTimeTrackControls::Implementation() -> Function { + return [](TimeTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; +} +static DoGetTimeTrackControls registerDoGetTimeTrackControls; diff --git a/src/tracks/timetrack/ui/TimeTrackView.cpp b/src/tracks/timetrack/ui/TimeTrackView.cpp index 8d90c5ced..3c0967e38 100644 --- a/src/tracks/timetrack/ui/TimeTrackView.cpp +++ b/src/tracks/timetrack/ui/TimeTrackView.cpp @@ -43,15 +43,13 @@ std::vector TimeTrackView::DetailedHitTest return results; } -std::shared_ptr TimeTrack::DoGetView() -{ - return std::make_shared( SharedPointer() ); -} - -std::shared_ptr TimeTrack::DoGetControls() -{ - return std::make_shared( SharedPointer() ); +using DoGetTimeTrackView = DoGetView::Override< TimeTrack >; +template<> template<> auto DoGetTimeTrackView::Implementation() -> Function { + return [](TimeTrack &track) { + return std::make_shared( track.SharedPointer() ); + }; } +static DoGetTimeTrackView registerDoGetTimeTrackView; std::shared_ptr TimeTrackView::DoGetVRulerControls() { diff --git a/src/tracks/ui/TrackView.cpp b/src/tracks/ui/TrackView.cpp index 304675e50..843fdee4f 100644 --- a/src/tracks/ui/TrackView.cpp +++ b/src/tracks/ui/TrackView.cpp @@ -57,7 +57,7 @@ std::shared_ptr Track::GetTrackView() { if (!mpView) // create on demand - mpView = DoGetView(); + mpView = DoGetView::Call( *this ); return mpView; } @@ -70,7 +70,7 @@ std::shared_ptr Track::GetTrackControls() { if (!mpControls) // create on demand - mpControls = DoGetControls(); + mpControls = DoGetControls::Call( *this ); return mpControls; }