Redefine the factories for track views and controls...

... non-intrusively in the Track suclasses, registering functions instead.

For each abstract factory function (of two), build a table of concrete factory
functions, paralleling the hierarchy of Track subclesses.  Dispatch using
runt time type information in the Track objects.
This commit is contained in:
Paul Licameli 2019-06-21 08:49:24 -04:00
parent 77eeba5463
commit 3e0d48cc14
15 changed files with 88 additions and 56 deletions

View File

@ -169,10 +169,6 @@ public:
double mClipLen;
int miLastLabel; // used by FindNextLabel and FindPrevLabel
private:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
};
struct LabelTrackEvent : TrackListEvent

View File

@ -222,10 +222,6 @@ public:
int mVisibleChannels; // bit set of visible channels
std::weak_ptr<StretchHandle> mStretchHandle;
protected:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
};
/// Data used to display a note track

View File

@ -113,10 +113,6 @@ private:
Track::Holder Clone() const override;
friend class TrackFactory;
protected:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
};

View File

@ -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;

View File

@ -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<TrackView> DoGetView() = 0;
virtual std::shared_ptr<TrackControls> DoGetControls() = 0;
// These hold the controls:
std::shared_ptr<TrackView> mpView;
std::shared_ptr<CommonTrackCell> 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

View File

@ -682,10 +682,6 @@ private:
std::unique_ptr<SpectrogramSettings> mpSpectrumSettings;
std::unique_ptr<WaveformSettings> mpWaveformSettings;
protected:
std::shared_ptr<TrackView> DoGetView() override;
std::shared_ptr<TrackControls> DoGetControls() override;
};
// This is meant to be a short-lived object, during whose lifetime,

View File

@ -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<LabelTrackControls>( track.SharedPointer() );
};
}
static DoGetLabelTrackControls registerDoGetLabelTrackControls;

View File

@ -2080,15 +2080,13 @@ int LabelTrackView::DialogForLabelName(
return status;
}
std::shared_ptr<TrackView> LabelTrack::DoGetView()
{
return std::make_shared<LabelTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> LabelTrack::DoGetControls()
{
return std::make_shared<LabelTrackControls>( SharedPointer() );
using DoGetLabelTrackView = DoGetView::Override< LabelTrack >;
template<> template<> auto DoGetLabelTrackView::Implementation() -> Function {
return [](LabelTrack &track) {
return std::make_shared<LabelTrackView>( track.SharedPointer() );
};
}
static DoGetLabelTrackView registerDoGetLabelTrackView;
std::shared_ptr<TrackVRulerControls> LabelTrackView::DoGetVRulerControls()
{

View File

@ -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<NoteTrackControls>( track.SharedPointer() );
};
}
static DoGetNoteTrackControls registerDoGetNoteTrackControls;

View File

@ -53,15 +53,13 @@ std::vector<UIHandlePtr> NoteTrackView::DetailedHitTest
return results;
}
std::shared_ptr<TrackView> NoteTrack::DoGetView()
{
return std::make_shared<NoteTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> NoteTrack::DoGetControls()
{
return std::make_shared<NoteTrackControls>( SharedPointer() );
using DoGetNoteTrackView = DoGetView::Override< NoteTrack >;
template<> template<> auto DoGetNoteTrackView::Implementation() -> Function {
return [](NoteTrack &track) {
return std::make_shared<NoteTrackView>( track.SharedPointer() );
};
}
static DoGetNoteTrackView registerDoGetNoteTrackView;
std::shared_ptr<TrackVRulerControls> NoteTrackView::DoGetVRulerControls()
{

View File

@ -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<WaveTrackControls>( track.SharedPointer() );
};
}
static DoGetWaveTrackControls registerDoGetWaveTrackControls;

View File

@ -156,15 +156,13 @@ void WaveTrackView::DoSetMinimized( bool minimized )
TrackView::DoSetMinimized( minimized );
}
std::shared_ptr<TrackView> WaveTrack::DoGetView()
{
return std::make_shared<WaveTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> WaveTrack::DoGetControls()
{
return std::make_shared<WaveTrackControls>( SharedPointer() );
using DoGetWaveTrackView = DoGetView::Override< WaveTrack >;
template<> template<> auto DoGetWaveTrackView::Implementation() -> Function {
return [](WaveTrack &track) {
return std::make_shared<WaveTrackView>( track.SharedPointer() );
};
}
static DoGetWaveTrackView registerDoGetWaveTrackView;
std::shared_ptr<TrackVRulerControls> WaveTrackView::DoGetVRulerControls()
{

View File

@ -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<TimeTrackControls>( track.SharedPointer() );
};
}
static DoGetTimeTrackControls registerDoGetTimeTrackControls;

View File

@ -43,15 +43,13 @@ std::vector<UIHandlePtr> TimeTrackView::DetailedHitTest
return results;
}
std::shared_ptr<TrackView> TimeTrack::DoGetView()
{
return std::make_shared<TimeTrackView>( SharedPointer() );
}
std::shared_ptr<TrackControls> TimeTrack::DoGetControls()
{
return std::make_shared<TimeTrackControls>( SharedPointer() );
using DoGetTimeTrackView = DoGetView::Override< TimeTrack >;
template<> template<> auto DoGetTimeTrackView::Implementation() -> Function {
return [](TimeTrack &track) {
return std::make_shared<TimeTrackView>( track.SharedPointer() );
};
}
static DoGetTimeTrackView registerDoGetTimeTrackView;
std::shared_ptr<TrackVRulerControls> TimeTrackView::DoGetVRulerControls()
{

View File

@ -57,7 +57,7 @@ std::shared_ptr<TrackView> Track::GetTrackView()
{
if (!mpView)
// create on demand
mpView = DoGetView();
mpView = DoGetView::Call( *this );
return mpView;
}
@ -70,7 +70,7 @@ std::shared_ptr<TrackPanelCell> Track::GetTrackControls()
{
if (!mpControls)
// create on demand
mpControls = DoGetControls();
mpControls = DoGetControls::Call( *this );
return mpControls;
}