1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-09 16:41:14 +02:00

Define static accessor functions for VRulerControls and TrackControls...

... and use std::enable_shared_from_this

Temporarily putting TrackControls.cpp back into the big s.c.c, now 59 files

Future rewriting might even eliminate all mention of those classes in
the definition of the Track classes.
This commit is contained in:
Paul Licameli 2019-06-18 12:19:03 -04:00
parent 2259f12acb
commit 18ba27a641
8 changed files with 52 additions and 22 deletions

View File

@ -287,13 +287,13 @@ class AUDACITY_DLL_API Track /* not final */
// Return another, associated TrackPanelCell object that implements the
// drop-down, close and minimize buttons, etc.
std::shared_ptr<TrackPanelCell> GetTrackControl();
std::shared_ptr<const TrackPanelCell> GetTrackControl() const;
std::shared_ptr<TrackPanelCell> GetTrackControls();
std::shared_ptr<const TrackPanelCell> GetTrackControls() const;
// Return another, associated TrackPanelCell object that implements the
// mouse actions for the vertical ruler
std::shared_ptr<TrackVRulerControls> GetVRulerControl();
std::shared_ptr<const TrackVRulerControls> GetVRulerControl() const;
std::shared_ptr<TrackVRulerControls> GetVRulerControls();
std::shared_ptr<const TrackVRulerControls> GetVRulerControls() const;
// Return another, associated TrackPanelCell object that implements the
// click and drag to resize

View File

@ -100,6 +100,7 @@ is time to refresh some aspect of the screen.
#include "toolbars/ControlToolBar.h"
#include "tracks/ui/TrackControls.h"
#include "tracks/ui/TrackVRulerControls.h" // for inheritance relation
//This loads the appropriate set of cursors, depending on platform.
@ -339,7 +340,7 @@ TrackPanel::~TrackPanel()
LWSlider *TrackPanel::GainSlider( const WaveTrack *wt )
{
auto pControls = wt->GetTrackControl();
auto pControls = &TrackControls::Get( *wt );
auto rect = FindRect( *pControls );
wxRect sliderRect;
TrackInfo::GetGainRect( rect.GetTopLeft(), sliderRect );
@ -348,7 +349,7 @@ LWSlider *TrackPanel::GainSlider( const WaveTrack *wt )
LWSlider *TrackPanel::PanSlider( const WaveTrack *wt )
{
auto pControls = wt->GetTrackControl();
auto pControls = &TrackControls::Get( *wt );
auto rect = FindRect( *pControls );
wxRect sliderRect;
TrackInfo::GetPanRect( rect.GetTopLeft(), sliderRect );
@ -358,7 +359,7 @@ LWSlider *TrackPanel::PanSlider( const WaveTrack *wt )
#ifdef EXPERIMENTAL_MIDI_OUT
LWSlider *TrackPanel::VelocitySlider( const NoteTrack *nt )
{
auto pControls = nt->GetTrackControl();
auto pControls = &TrackControls::Get( *nt );
auto rect = FindRect( *pControls );
wxRect sliderRect;
TrackInfo::GetVelocityRect( rect.GetTopLeft(), sliderRect );
@ -2194,7 +2195,8 @@ struct VRulerAndChannel final : TrackPanelGroup {
Subdivision Children( const wxRect &rect ) override
{
return { Axis::X, Refinement{
{ rect.GetLeft(), mpChannel->GetVRulerControl() },
{ rect.GetLeft(),
TrackVRulerControls::Get( *mpChannel ).shared_from_this() },
{ mLeftOffset, mpChannel }
} };
}
@ -2240,7 +2242,8 @@ struct LabeledChannelGroup final : TrackPanelGroup {
: mpTrack{ pTrack }, mLeftOffset{ leftOffset } {}
Subdivision Children( const wxRect &rect ) override
{ return { Axis::X, Refinement{
{ rect.GetLeft(), mpTrack->GetTrackControl() },
{ rect.GetLeft(),
TrackControls::Get( *mpTrack ).shared_from_this() },
{ rect.GetLeft() + kTrackInfoWidth,
std::make_shared< ChannelGroup >( mpTrack, mLeftOffset ) }
} }; }

View File

@ -38,11 +38,7 @@ std::vector<UIHandlePtr> CommonTrackControls::HitTest
UIHandlePtr result;
std::vector<UIHandlePtr> results;
auto pTrack = FindTrack();
// shared pointer to this:
auto sThis =
std::static_pointer_cast<TrackControls>( pTrack->GetTrackControl() );
wxASSERT( this == sThis.get() );
auto sThis = shared_from_this();
if (NULL != (result = CloseButtonHandle::HitTest(
mCloseHandle, state, rect, this)))
@ -62,7 +58,7 @@ std::vector<UIHandlePtr> CommonTrackControls::HitTest
if (results.empty()) {
if (NULL != (result = TrackSelectHandle::HitAnywhere(
mSelectHandle, pTrack)))
mSelectHandle, FindTrack())))
results.push_back(result);
}

View File

@ -11,6 +11,8 @@ Paul Licameli split from TrackPanel.cpp
#include "../../Audacity.h"
#include "TrackControls.h"
#include "../../Track.h"
TrackControls::TrackControls( std::shared_ptr<Track> pTrack )
: CommonTrackCell{ pTrack }
{
@ -19,3 +21,14 @@ TrackControls::TrackControls( std::shared_ptr<Track> pTrack )
TrackControls::~TrackControls()
{
}
TrackControls &TrackControls::Get( Track &track )
{
return *static_cast<TrackControls*>( track.GetTrackControls().get() );
}
const TrackControls &TrackControls::Get( const Track &track )
{
return *static_cast<const TrackControls*>( track.GetTrackControls().get() );
}

View File

@ -16,8 +16,12 @@ Paul Licameli split from TrackPanel.cpp
class Track;
class TrackControls /* not final */ : public CommonTrackCell
, public std::enable_shared_from_this< TrackControls >
{
public:
static TrackControls &Get( Track &track );
static const TrackControls &Get( const Track &track );
explicit
TrackControls( std::shared_ptr<Track> pTrack );

View File

@ -27,6 +27,16 @@ TrackVRulerControls::~TrackVRulerControls()
{
}
TrackVRulerControls &TrackVRulerControls::Get( Track &track )
{
return *track.GetVRulerControls();
}
const TrackVRulerControls &TrackVRulerControls::Get( const Track &track )
{
return *track.GetVRulerControls();
}
std::shared_ptr<Track> TrackVRulerControls::DoFindTrack()
{
return mwTrack.lock();

View File

@ -19,6 +19,7 @@ class wxDC;
const int kGuard = 5; // 5 pixels to reduce risk of VZooming accidentally
class TrackVRulerControls /* not final */ : public CommonTrackPanelCell
, public std::enable_shared_from_this< TrackVRulerControls >
{
public:
explicit
@ -26,6 +27,9 @@ public:
virtual ~TrackVRulerControls() = 0;
static TrackVRulerControls &Get( Track& );
static const TrackVRulerControls &Get( const Track& );
// Define a default hit test method, just for message and cursor
std::vector<UIHandlePtr> HitTest
(const TrackPanelMouseState &state,

View File

@ -75,10 +75,10 @@ std::vector<UIHandlePtr> Track::HitTest
std::shared_ptr<TrackPanelCell> Track::ContextMenuDelegate()
{
return FindTrack()->GetTrackControl();
return TrackControls::Get( *this ).shared_from_this();
}
std::shared_ptr<TrackPanelCell> Track::GetTrackControl()
std::shared_ptr<TrackPanelCell> Track::GetTrackControls()
{
if (!mpControls)
// create on demand
@ -86,12 +86,12 @@ std::shared_ptr<TrackPanelCell> Track::GetTrackControl()
return mpControls;
}
std::shared_ptr<const TrackPanelCell> Track::GetTrackControl() const
std::shared_ptr<const TrackPanelCell> Track::GetTrackControls() const
{
return const_cast< Track* >( this )->GetTrackControl();
return const_cast< Track* >( this )->GetTrackControls();
}
std::shared_ptr<TrackVRulerControls> Track::GetVRulerControl()
std::shared_ptr<TrackVRulerControls> Track::GetVRulerControls()
{
if (!mpVRulerContols)
// create on demand
@ -99,9 +99,9 @@ std::shared_ptr<TrackVRulerControls> Track::GetVRulerControl()
return mpVRulerContols;
}
std::shared_ptr<const TrackVRulerControls> Track::GetVRulerControl() const
std::shared_ptr<const TrackVRulerControls> Track::GetVRulerControls() const
{
return const_cast< Track* >( this )->GetVRulerControl();
return const_cast< Track* >( this )->GetVRulerControls();
}
#include "../../TrackPanelResizeHandle.h"