1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-11 17:41:15 +02:00

Don't define any Track members outside of Track.cpp

This commit is contained in:
Paul Licameli 2019-06-22 11:27:54 -04:00
parent dc9e436dde
commit 9e731390f6
6 changed files with 72 additions and 68 deletions

View File

@ -138,6 +138,26 @@ void Track::SetOwner
mNode = node; mNode = node;
} }
const std::shared_ptr<CommonTrackCell> &Track::GetTrackView()
{
return mpView;
}
void Track::SetTrackView( const std::shared_ptr<CommonTrackCell> &pView )
{
mpView = pView;
}
const std::shared_ptr<CommonTrackCell> &Track::GetTrackControls()
{
return mpControls;
}
void Track::SetTrackControls( const std::shared_ptr<CommonTrackCell> &pControls )
{
mpControls = pControls;
}
int Track::GetIndex() const int Track::GetIndex() const
{ {
return mIndex; return mIndex;
@ -1270,13 +1290,3 @@ void TrackFactory::Destroy( AudacityProject &project )
{ {
project.AttachedObjects::Assign( key2, nullptr ); 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

@ -261,15 +261,15 @@ class AUDACITY_DLL_API Track /* not final */
public: public:
mutable wxSize vrulerSize; mutable wxSize vrulerSize;
// Return another, associated TrackPanelCell object that implements // These are exposed only for the purposes of the TrackView class, to
// click and drag and keystrokes in the track contents. // initialize the pointer on demand
std::shared_ptr<CommonTrackCell> GetTrackView(); const std::shared_ptr<CommonTrackCell> &GetTrackView();
std::shared_ptr<const CommonTrackCell> GetTrackView() const; void SetTrackView( const std::shared_ptr<CommonTrackCell> &pView );
// Return another, associated TrackPanelCell object that implements the // These are exposed only for the purposes of the TrackControls class, to
// drop-down, close and minimize buttons, etc. // initialize the pointer on demand
std::shared_ptr<TrackPanelCell> GetTrackControls(); const std::shared_ptr<CommonTrackCell> &GetTrackControls();
std::shared_ptr<const TrackPanelCell> GetTrackControls() const; void SetTrackControls( const std::shared_ptr<CommonTrackCell> &pControls );
// Return another, associated TrackPanelCell object that implements the // Return another, associated TrackPanelCell object that implements the
@ -1588,24 +1588,4 @@ class AUDACITY_DLL_API TrackFactory final
#endif #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 #endif

View File

@ -24,11 +24,20 @@ TrackControls::~TrackControls()
TrackControls &TrackControls::Get( Track &track ) TrackControls &TrackControls::Get( Track &track )
{ {
return *static_cast<TrackControls*>( track.GetTrackControls().get() ); auto pControls =
std::static_pointer_cast<TrackControls>( track.GetTrackControls() );
if (!pControls)
// create on demand
track.SetTrackControls( pControls = DoGetControls::Call( track ) );
return *pControls;
} }
const TrackControls &TrackControls::Get( const Track &track ) const TrackControls &TrackControls::Get( const Track &track )
{ {
return *static_cast<const TrackControls*>( track.GetTrackControls().get() ); return Get( const_cast< Track& >( track ) );
} }
template<> auto DoGetControls::Implementation() -> Function {
return nullptr;
}
static DoGetControls registerDoGetControls;

View File

@ -28,4 +28,15 @@ public:
virtual ~TrackControls() = 0; virtual ~TrackControls() = 0;
}; };
#include "AttachedVirtualFunction.h"
struct DoGetControlsTag;
using DoGetControls =
AttachedVirtualFunction<
DoGetControlsTag,
std::shared_ptr< TrackControls >,
Track
>;
#endif #endif

View File

@ -59,12 +59,16 @@ void TrackView::CopyTo( Track &track ) const
TrackView &TrackView::Get( Track &track ) TrackView &TrackView::Get( Track &track )
{ {
return static_cast<TrackView&>( *track.GetTrackView() ); auto pView = std::static_pointer_cast<TrackView>( track.GetTrackView() );
if (!pView)
// create on demand
track.SetTrackView( pView = DoGetView::Call( track ) );
return *pView;
} }
const TrackView &TrackView::Get( const Track &track ) const TrackView &TrackView::Get( const Track &track )
{ {
return static_cast<const TrackView&>( *track.GetTrackView() ); return Get( const_cast< Track& >( track ) );
} }
void TrackView::SetMinimized(bool isMinimized) void TrackView::SetMinimized(bool isMinimized)
@ -107,32 +111,6 @@ void TrackView::DoSetMinimized(bool isMinimized)
mMinimized = isMinimized; mMinimized = isMinimized;
} }
std::shared_ptr<CommonTrackCell> Track::GetTrackView()
{
if (!mpView)
// create on demand
mpView = DoGetView::Call( *this );
return mpView;
}
std::shared_ptr<const CommonTrackCell> Track::GetTrackView() const
{
return const_cast<Track*>(this)->GetTrackView();
}
std::shared_ptr<TrackPanelCell> Track::GetTrackControls()
{
if (!mpControls)
// create on demand
mpControls = DoGetControls::Call( *this );
return mpControls;
}
std::shared_ptr<const TrackPanelCell> Track::GetTrackControls() const
{
return const_cast< Track* >( this )->GetTrackControls();
}
std::shared_ptr<TrackVRulerControls> TrackView::GetVRulerControls() std::shared_ptr<TrackVRulerControls> TrackView::GetVRulerControls()
{ {
if (!mpVRulerControls) if (!mpVRulerControls)
@ -233,3 +211,8 @@ static const AudacityProject::AttachedObjects::RegisteredFactory key{
}; };
} }
template<> auto DoGetView::Implementation() -> Function {
return nullptr;
}
static DoGetView registerDoGetView;

View File

@ -93,4 +93,15 @@ private:
int mHeight{ DefaultHeight }; int mHeight{ DefaultHeight };
}; };
#include "AttachedVirtualFunction.h"
struct DoGetViewTag;
using DoGetView =
AttachedVirtualFunction<
DoGetViewTag,
std::shared_ptr< TrackView >,
Track
>;
#endif #endif