mirror of
https://github.com/cookiengineer/audacity
synced 2025-09-17 16:50:26 +02:00
Macros to simplify usage of class template AttachedVirtualFunction ...
... And allow correct linkage when overrides are defined in dynamically loaded modules
This commit is contained in:
parent
ed3e4de17b
commit
48217d5acf
@ -72,13 +72,15 @@ AttachedVirtualFunction<
|
|||||||
AbstractHost, // class to be switched on by runtime type
|
AbstractHost, // class to be switched on by runtime type
|
||||||
int, double // other arguments
|
int, double // other arguments
|
||||||
>;
|
>;
|
||||||
|
// Allow correct linkage for overrides defined in dynamically loaded modules:
|
||||||
|
DECLARE_EXPORTED_ATTACHED_VIRTUAL(AUDACITY_DLL_API, DoSomething);
|
||||||
```
|
```
|
||||||
|
|
||||||
Definitions needed:
|
Definitions needed:
|
||||||
```
|
```
|
||||||
//file Client.cpp
|
//file Client.cpp
|
||||||
// Define the default function body here (as a function returning a function!)
|
// Define the default function body here
|
||||||
template<> auto DoSomething::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL(DoSomething) {
|
||||||
return [](AbstractHost &host, int arg1, double arg2) {
|
return [](AbstractHost &host, int arg1, double arg2) {
|
||||||
return ErrorCode::Ok;
|
return ErrorCode::Ok;
|
||||||
};
|
};
|
||||||
@ -86,9 +88,6 @@ template<> auto DoSomething::Implementation() -> Function {
|
|||||||
// at runtime if the virtual function is invoked for a host subclass for which no override
|
// at runtime if the virtual function is invoked for a host subclass for which no override
|
||||||
// was defined.
|
// was defined.
|
||||||
}
|
}
|
||||||
// Must also guarantee construction of an instance of class DoSomething at least
|
|
||||||
// once before any use of DoSomething::Call()
|
|
||||||
static DoSomething registerMe;
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Usage of the method somewhere else:
|
Usage of the method somewhere else:
|
||||||
@ -124,7 +123,7 @@ Overrides of the method, defined in any other .cpp file:
|
|||||||
// An override of the function, building up a hierarchy of function bodies parallel
|
// An override of the function, building up a hierarchy of function bodies parallel
|
||||||
// to the host class hierarchy
|
// to the host class hierarchy
|
||||||
using DoSomethingSpecial = DoSomething::Override< SpecialHost >;
|
using DoSomethingSpecial = DoSomething::Override< SpecialHost >;
|
||||||
template<> template<> auto DoSomethingSpecial::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoSomethingSpecial) {
|
||||||
// The function can be defined without casting the first argument
|
// The function can be defined without casting the first argument
|
||||||
return [](SpecialHost &host, int arg1, double arg2) {
|
return [](SpecialHost &host, int arg1, double arg2) {
|
||||||
return arg1 == 0 ? ErrorCode::Ok : ErrorCode::Bad;
|
return arg1 == 0 ? ErrorCode::Ok : ErrorCode::Bad;
|
||||||
@ -135,8 +134,7 @@ static DoSomethingSpecial registerMe;
|
|||||||
// A further override, demonstrating call-through too
|
// A further override, demonstrating call-through too
|
||||||
using DoSomethingExtraSpecial =
|
using DoSomethingExtraSpecial =
|
||||||
DoSomething::Override< ExtraSpecialHost, DoSomethingSpecial >;
|
DoSomething::Override< ExtraSpecialHost, DoSomethingSpecial >;
|
||||||
template<> template<>
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoSomethingExtraSpecial) {
|
||||||
auto DoSomethingExtraSpecial::Implementation() -> Function {
|
|
||||||
return [](ExtraSpecialHost &host, int arg1, double arg2){
|
return [](ExtraSpecialHost &host, int arg1, double arg2){
|
||||||
// Call the immediately overridden version of the function
|
// Call the immediately overridden version of the function
|
||||||
auto result = Callthrough( host, arg1, arg2 );
|
auto result = Callthrough( host, arg1, arg2 );
|
||||||
@ -173,11 +171,7 @@ public:
|
|||||||
|
|
||||||
//! At least one static instance must be created; more instances are harmless
|
//! At least one static instance must be created; more instances are harmless
|
||||||
/*! (There will be others if there are any overrides.) */
|
/*! (There will be others if there are any overrides.) */
|
||||||
AttachedVirtualFunction()
|
AttachedVirtualFunction();
|
||||||
{
|
|
||||||
static std::once_flag flag;
|
|
||||||
std::call_once( flag, []{ Register<This>( Implementation() ); } );
|
|
||||||
}
|
|
||||||
|
|
||||||
//! For defining overrides of the method
|
//! For defining overrides of the method
|
||||||
/*!
|
/*!
|
||||||
@ -280,11 +274,33 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
using Registry = std::vector< Entry >;
|
using Registry = std::vector< Entry >;
|
||||||
static Registry &GetRegistry()
|
static Registry &GetRegistry();
|
||||||
{
|
|
||||||
static Registry registry;
|
|
||||||
return registry;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! Typically follow the `using` declaration of a new AttachedVirtualFunction with this macro
|
||||||
|
#define DECLARE_EXPORTED_ATTACHED_VIRTUAL(DECLSPEC, Name) \
|
||||||
|
template<> DECLSPEC Name::AttachedVirtualFunction(); \
|
||||||
|
template<> auto DECLSPEC Name::GetRegistry() -> Registry &; \
|
||||||
|
template<> auto DECLSPEC Name::Implementation() -> Function
|
||||||
|
|
||||||
|
//! Used in the companion .cpp file to the .h using the above macro; followed by a function body
|
||||||
|
#define DEFINE_ATTACHED_VIRTUAL(Name) \
|
||||||
|
template<> Name::AttachedVirtualFunction() \
|
||||||
|
{ \
|
||||||
|
static std::once_flag flag; \
|
||||||
|
std::call_once( flag, []{ Register<Object>( Implementation() ); } ); \
|
||||||
|
} \
|
||||||
|
template<> auto Name::GetRegistry() -> Registry & \
|
||||||
|
{ \
|
||||||
|
static Registry registry; \
|
||||||
|
return registry; \
|
||||||
|
} \
|
||||||
|
static Name register ## Name ; \
|
||||||
|
template<> auto Name::Implementation() -> Function
|
||||||
|
|
||||||
|
//! Used to define overriding function; followed by a function body
|
||||||
|
#define DEFINE_ATTACHED_VIRTUAL_OVERRIDE(Name) \
|
||||||
|
static Name register ## Name ; \
|
||||||
|
template<> template<> auto Name::Implementation() -> Function \
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -179,16 +179,14 @@ PopupMenuTable *LabelTrackControls::GetMenuExtension(Track *)
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetLabelTrackControls = DoGetControls::Override< LabelTrack >;
|
using DoGetLabelTrackControls = DoGetControls::Override< LabelTrack >;
|
||||||
template<> template<> auto DoGetLabelTrackControls::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetLabelTrackControls) {
|
||||||
return [](LabelTrack &track) {
|
return [](LabelTrack &track) {
|
||||||
return std::make_shared<LabelTrackControls>( track.SharedPointer() );
|
return std::make_shared<LabelTrackControls>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetLabelTrackControls registerDoGetLabelTrackControls;
|
|
||||||
|
|
||||||
using GetDefaultLabelTrackHeight = GetDefaultTrackHeight::Override< LabelTrack >;
|
using GetDefaultLabelTrackHeight = GetDefaultTrackHeight::Override< LabelTrack >;
|
||||||
template<> template<>
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(GetDefaultLabelTrackHeight) {
|
||||||
auto GetDefaultLabelTrackHeight::Implementation() -> Function {
|
|
||||||
return [](LabelTrack &) {
|
return [](LabelTrack &) {
|
||||||
// Label tracks are narrow
|
// Label tracks are narrow
|
||||||
// Default is to allow two rows so that NEW users get the
|
// Default is to allow two rows so that NEW users get the
|
||||||
@ -196,4 +194,3 @@ auto GetDefaultLabelTrackHeight::Implementation() -> Function {
|
|||||||
return 73;
|
return 73;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static GetDefaultLabelTrackHeight registerGetDefaultLabelTrackHeight;
|
|
||||||
|
@ -248,9 +248,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
using MakeLabelTrackShifter = MakeTrackShifter::Override<LabelTrack>;
|
using MakeLabelTrackShifter = MakeTrackShifter::Override<LabelTrack>;
|
||||||
template<> template<> auto MakeLabelTrackShifter::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(MakeLabelTrackShifter) {
|
||||||
return [](LabelTrack &track, AudacityProject &project) {
|
return [](LabelTrack &track, AudacityProject &project) {
|
||||||
return std::make_unique<LabelTrackShifter>(track, project);
|
return std::make_unique<LabelTrackShifter>(track, project);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static MakeLabelTrackShifter registerMakeLabelTrackShifter;
|
|
||||||
|
@ -2290,12 +2290,11 @@ int LabelTrackView::DialogForLabelName(
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetLabelTrackView = DoGetView::Override< LabelTrack >;
|
using DoGetLabelTrackView = DoGetView::Override< LabelTrack >;
|
||||||
template<> template<> auto DoGetLabelTrackView::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetLabelTrackView) {
|
||||||
return [](LabelTrack &track) {
|
return [](LabelTrack &track) {
|
||||||
return std::make_shared<LabelTrackView>( track.SharedPointer() );
|
return std::make_shared<LabelTrackView>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetLabelTrackView registerDoGetLabelTrackView;
|
|
||||||
|
|
||||||
std::shared_ptr<TrackVRulerControls> LabelTrackView::DoGetVRulerControls()
|
std::shared_ptr<TrackVRulerControls> LabelTrackView::DoGetVRulerControls()
|
||||||
{
|
{
|
||||||
|
@ -321,22 +321,19 @@ void NoteTrackControls::ReCreateVelocitySlider( wxEvent &evt )
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetNoteTrackControls = DoGetControls::Override< NoteTrack >;
|
using DoGetNoteTrackControls = DoGetControls::Override< NoteTrack >;
|
||||||
template<> template<> auto DoGetNoteTrackControls::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetNoteTrackControls) {
|
||||||
return [](NoteTrack &track) {
|
return [](NoteTrack &track) {
|
||||||
return std::make_shared<NoteTrackControls>( track.SharedPointer() );
|
return std::make_shared<NoteTrackControls>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetNoteTrackControls registerDoGetNoteTrackControls;
|
|
||||||
|
|
||||||
#include "../../../ui/TrackView.h"
|
#include "../../../ui/TrackView.h"
|
||||||
|
|
||||||
using GetDefaultNoteTrackHeight = GetDefaultTrackHeight::Override< NoteTrack >;
|
using GetDefaultNoteTrackHeight = GetDefaultTrackHeight::Override< NoteTrack >;
|
||||||
template<> template<>
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(GetDefaultNoteTrackHeight) {
|
||||||
auto GetDefaultNoteTrackHeight::Implementation() -> Function {
|
|
||||||
return [](NoteTrack &) {
|
return [](NoteTrack &) {
|
||||||
return NoteTrackControls::DefaultNoteTrackHeight();
|
return NoteTrackControls::DefaultNoteTrackHeight();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static GetDefaultNoteTrackHeight registerGetDefaultNoteTrackHeight;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,9 +54,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
using MakeNoteTrackShifter = MakeTrackShifter::Override<NoteTrack>;
|
using MakeNoteTrackShifter = MakeTrackShifter::Override<NoteTrack>;
|
||||||
template<> template<> auto MakeNoteTrackShifter::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(MakeNoteTrackShifter) {
|
||||||
return [](NoteTrack &track, AudacityProject&) {
|
return [](NoteTrack &track, AudacityProject&) {
|
||||||
return std::make_unique<NoteTrackShifter>(track);
|
return std::make_unique<NoteTrackShifter>(track);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static MakeNoteTrackShifter registerMakeNoteTrackShifter;
|
|
||||||
|
@ -60,12 +60,11 @@ std::vector<UIHandlePtr> NoteTrackView::DetailedHitTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetNoteTrackView = DoGetView::Override< NoteTrack >;
|
using DoGetNoteTrackView = DoGetView::Override< NoteTrack >;
|
||||||
template<> template<> auto DoGetNoteTrackView::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetNoteTrackView) {
|
||||||
return [](NoteTrack &track) {
|
return [](NoteTrack &track) {
|
||||||
return std::make_shared<NoteTrackView>( track.SharedPointer() );
|
return std::make_shared<NoteTrackView>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetNoteTrackView registerDoGetNoteTrackView;
|
|
||||||
|
|
||||||
std::shared_ptr<TrackVRulerControls> NoteTrackView::DoGetVRulerControls()
|
std::shared_ptr<TrackVRulerControls> NoteTrackView::DoGetVRulerControls()
|
||||||
{
|
{
|
||||||
|
@ -1253,19 +1253,16 @@ void WaveTrackControls::ReCreatePanSlider( wxEvent &event )
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetWaveTrackControls = DoGetControls::Override< WaveTrack >;
|
using DoGetWaveTrackControls = DoGetControls::Override< WaveTrack >;
|
||||||
template<> template<> auto DoGetWaveTrackControls::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetWaveTrackControls) {
|
||||||
return [](WaveTrack &track) {
|
return [](WaveTrack &track) {
|
||||||
return std::make_shared<WaveTrackControls>( track.SharedPointer() );
|
return std::make_shared<WaveTrackControls>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetWaveTrackControls registerDoGetWaveTrackControls;
|
|
||||||
|
|
||||||
using GetDefaultWaveTrackHeight = GetDefaultTrackHeight::Override< WaveTrack >;
|
using GetDefaultWaveTrackHeight = GetDefaultTrackHeight::Override< WaveTrack >;
|
||||||
template<> template<>
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(GetDefaultWaveTrackHeight) {
|
||||||
auto GetDefaultWaveTrackHeight::Implementation() -> Function {
|
|
||||||
return [](WaveTrack &) {
|
return [](WaveTrack &) {
|
||||||
return WaveTrackControls::DefaultWaveTrackHeight();
|
return WaveTrackControls::DefaultWaveTrackHeight();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static GetDefaultWaveTrackHeight registerGetDefaultWaveTrackHeight;
|
|
||||||
|
|
||||||
|
@ -188,9 +188,8 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
using MakeWaveTrackShifter = MakeTrackShifter::Override<WaveTrack>;
|
using MakeWaveTrackShifter = MakeTrackShifter::Override<WaveTrack>;
|
||||||
template<> template<> auto MakeWaveTrackShifter::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(MakeWaveTrackShifter) {
|
||||||
return [](WaveTrack &track, AudacityProject&) {
|
return [](WaveTrack &track, AudacityProject&) {
|
||||||
return std::make_unique<WaveTrackShifter>(track);
|
return std::make_unique<WaveTrackShifter>(track);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static MakeWaveTrackShifter registerMakeWaveTrackShifter;
|
|
||||||
|
@ -1043,12 +1043,11 @@ void WaveTrackView::DoSetMinimized( bool minimized )
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetWaveTrackView = DoGetView::Override< WaveTrack >;
|
using DoGetWaveTrackView = DoGetView::Override< WaveTrack >;
|
||||||
template<> template<> auto DoGetWaveTrackView::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetWaveTrackView) {
|
||||||
return [](WaveTrack &track) {
|
return [](WaveTrack &track) {
|
||||||
return std::make_shared<WaveTrackView>( track.SharedPointer() );
|
return std::make_shared<WaveTrackView>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetWaveTrackView registerDoGetWaveTrackView;
|
|
||||||
|
|
||||||
std::shared_ptr<TrackVRulerControls> WaveTrackView::DoGetVRulerControls()
|
std::shared_ptr<TrackVRulerControls> WaveTrackView::DoGetVRulerControls()
|
||||||
{
|
{
|
||||||
|
@ -170,20 +170,17 @@ PopupMenuTable *TimeTrackControls::GetMenuExtension(Track *)
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetTimeTrackControls = DoGetControls::Override< TimeTrack >;
|
using DoGetTimeTrackControls = DoGetControls::Override< TimeTrack >;
|
||||||
template<> template<> auto DoGetTimeTrackControls::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetTimeTrackControls) {
|
||||||
return [](TimeTrack &track) {
|
return [](TimeTrack &track) {
|
||||||
return std::make_shared<TimeTrackControls>( track.SharedPointer() );
|
return std::make_shared<TimeTrackControls>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetTimeTrackControls registerDoGetTimeTrackControls;
|
|
||||||
|
|
||||||
#include "../../ui/TrackView.h"
|
#include "../../ui/TrackView.h"
|
||||||
|
|
||||||
using GetDefaultTimeTrackHeight = GetDefaultTrackHeight::Override< TimeTrack >;
|
using GetDefaultTimeTrackHeight = GetDefaultTrackHeight::Override< TimeTrack >;
|
||||||
template<> template<>
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(GetDefaultTimeTrackHeight) {
|
||||||
auto GetDefaultTimeTrackHeight::Implementation() -> Function {
|
|
||||||
return [](TimeTrack &) {
|
return [](TimeTrack &) {
|
||||||
return 100;
|
return 100;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static GetDefaultTimeTrackHeight registerGetDefaultTimeTrackHeight;
|
|
||||||
|
@ -53,12 +53,11 @@ std::vector<UIHandlePtr> TimeTrackView::DetailedHitTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
using DoGetTimeTrackView = DoGetView::Override< TimeTrack >;
|
using DoGetTimeTrackView = DoGetView::Override< TimeTrack >;
|
||||||
template<> template<> auto DoGetTimeTrackView::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL_OVERRIDE(DoGetTimeTrackView) {
|
||||||
return [](TimeTrack &track) {
|
return [](TimeTrack &track) {
|
||||||
return std::make_shared<TimeTrackView>( track.SharedPointer() );
|
return std::make_shared<TimeTrackView>( track.SharedPointer() );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static DoGetTimeTrackView registerDoGetTimeTrackView;
|
|
||||||
|
|
||||||
std::shared_ptr<TrackVRulerControls> TimeTrackView::DoGetVRulerControls()
|
std::shared_ptr<TrackVRulerControls> TimeTrackView::DoGetVRulerControls()
|
||||||
{
|
{
|
||||||
|
@ -272,12 +272,11 @@ bool CoarseTrackShifter::SyncLocks()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> auto MakeTrackShifter::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL(MakeTrackShifter) {
|
||||||
return [](Track &track, AudacityProject&) {
|
return [](Track &track, AudacityProject&) {
|
||||||
return std::make_unique<CoarseTrackShifter>(track);
|
return std::make_unique<CoarseTrackShifter>(track);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
static MakeTrackShifter registerMakeTrackShifter;
|
|
||||||
|
|
||||||
void ClipMoveState::Init(
|
void ClipMoveState::Init(
|
||||||
AudacityProject &project,
|
AudacityProject &project,
|
||||||
|
@ -198,6 +198,7 @@ private:
|
|||||||
struct MakeTrackShifterTag;
|
struct MakeTrackShifterTag;
|
||||||
using MakeTrackShifter = AttachedVirtualFunction<
|
using MakeTrackShifter = AttachedVirtualFunction<
|
||||||
MakeTrackShifterTag, std::unique_ptr<TrackShifter>, Track, AudacityProject&>;
|
MakeTrackShifterTag, std::unique_ptr<TrackShifter>, Track, AudacityProject&>;
|
||||||
|
DECLARE_EXPORTED_ATTACHED_VIRTUAL(AUDACITY_DLL_API, MakeTrackShifter);
|
||||||
|
|
||||||
class ViewInfo;
|
class ViewInfo;
|
||||||
|
|
||||||
|
@ -37,7 +37,6 @@ const TrackControls &TrackControls::Get( const Track &track )
|
|||||||
return Get( const_cast< Track& >( track ) );
|
return Get( const_cast< Track& >( track ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> auto DoGetControls::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL(DoGetControls) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
static DoGetControls registerDoGetControls;
|
|
||||||
|
@ -38,5 +38,6 @@ AttachedVirtualFunction<
|
|||||||
std::shared_ptr< TrackControls >,
|
std::shared_ptr< TrackControls >,
|
||||||
Track
|
Track
|
||||||
>;
|
>;
|
||||||
|
DECLARE_EXPORTED_ATTACHED_VIRTUAL(AUDACITY_DLL_API, DoGetControls);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -229,12 +229,10 @@ static const AudacityProject::AttachedObjects::RegisteredFactory key{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> auto DoGetView::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL(DoGetView) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
static DoGetView registerDoGetView;
|
|
||||||
|
|
||||||
template<> auto GetDefaultTrackHeight::Implementation() -> Function {
|
DEFINE_ATTACHED_VIRTUAL(GetDefaultTrackHeight) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
static GetDefaultTrackHeight registerGetDefaultTrackHeight;
|
|
||||||
|
@ -113,6 +113,7 @@ AttachedVirtualFunction<
|
|||||||
std::shared_ptr< TrackView >,
|
std::shared_ptr< TrackView >,
|
||||||
Track
|
Track
|
||||||
>;
|
>;
|
||||||
|
DECLARE_EXPORTED_ATTACHED_VIRTUAL(AUDACITY_DLL_API, DoGetView);
|
||||||
|
|
||||||
struct GetDefaultTrackHeightTag;
|
struct GetDefaultTrackHeightTag;
|
||||||
|
|
||||||
@ -122,5 +123,6 @@ AttachedVirtualFunction<
|
|||||||
int,
|
int,
|
||||||
Track
|
Track
|
||||||
>;
|
>;
|
||||||
|
DECLARE_EXPORTED_ATTACHED_VIRTUAL(AUDACITY_DLL_API, GetDefaultTrackHeight);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user