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:
parent
77eeba5463
commit
3e0d48cc14
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
26
src/Track.h
26
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<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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue