From 18ba27a641f4ae292d35d6b121d2dafad8b3b98b Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 18 Jun 2019 12:19:03 -0400 Subject: [PATCH] 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. --- src/Track.h | 8 ++++---- src/TrackPanel.cpp | 13 ++++++++----- src/tracks/ui/CommonTrackControls.cpp | 8 ++------ src/tracks/ui/TrackControls.cpp | 13 +++++++++++++ src/tracks/ui/TrackControls.h | 4 ++++ src/tracks/ui/TrackVRulerControls.cpp | 10 ++++++++++ src/tracks/ui/TrackVRulerControls.h | 4 ++++ src/tracks/ui/TrackView.cpp | 14 +++++++------- 8 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/Track.h b/src/Track.h index fc5871e25..637ddc44c 100644 --- a/src/Track.h +++ b/src/Track.h @@ -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 GetTrackControl(); - std::shared_ptr GetTrackControl() const; + std::shared_ptr GetTrackControls(); + std::shared_ptr GetTrackControls() const; // Return another, associated TrackPanelCell object that implements the // mouse actions for the vertical ruler - std::shared_ptr GetVRulerControl(); - std::shared_ptr GetVRulerControl() const; + std::shared_ptr GetVRulerControls(); + std::shared_ptr GetVRulerControls() const; // Return another, associated TrackPanelCell object that implements the // click and drag to resize diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 3e6f9b227..6fc8e6332 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -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 ) } } }; } diff --git a/src/tracks/ui/CommonTrackControls.cpp b/src/tracks/ui/CommonTrackControls.cpp index 632d6b5e1..133da02bf 100644 --- a/src/tracks/ui/CommonTrackControls.cpp +++ b/src/tracks/ui/CommonTrackControls.cpp @@ -38,11 +38,7 @@ std::vector CommonTrackControls::HitTest UIHandlePtr result; std::vector results; - auto pTrack = FindTrack(); - // shared pointer to this: - auto sThis = - std::static_pointer_cast( 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 CommonTrackControls::HitTest if (results.empty()) { if (NULL != (result = TrackSelectHandle::HitAnywhere( - mSelectHandle, pTrack))) + mSelectHandle, FindTrack()))) results.push_back(result); } diff --git a/src/tracks/ui/TrackControls.cpp b/src/tracks/ui/TrackControls.cpp index 31d4b3275..0c850ec59 100644 --- a/src/tracks/ui/TrackControls.cpp +++ b/src/tracks/ui/TrackControls.cpp @@ -11,6 +11,8 @@ Paul Licameli split from TrackPanel.cpp #include "../../Audacity.h" #include "TrackControls.h" +#include "../../Track.h" + TrackControls::TrackControls( std::shared_ptr pTrack ) : CommonTrackCell{ pTrack } { @@ -19,3 +21,14 @@ TrackControls::TrackControls( std::shared_ptr pTrack ) TrackControls::~TrackControls() { } + +TrackControls &TrackControls::Get( Track &track ) +{ + return *static_cast( track.GetTrackControls().get() ); +} + +const TrackControls &TrackControls::Get( const Track &track ) +{ + return *static_cast( track.GetTrackControls().get() ); +} + diff --git a/src/tracks/ui/TrackControls.h b/src/tracks/ui/TrackControls.h index 230922b9b..317548343 100644 --- a/src/tracks/ui/TrackControls.h +++ b/src/tracks/ui/TrackControls.h @@ -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 pTrack ); diff --git a/src/tracks/ui/TrackVRulerControls.cpp b/src/tracks/ui/TrackVRulerControls.cpp index 9096e2a29..377729fbe 100644 --- a/src/tracks/ui/TrackVRulerControls.cpp +++ b/src/tracks/ui/TrackVRulerControls.cpp @@ -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 TrackVRulerControls::DoFindTrack() { return mwTrack.lock(); diff --git a/src/tracks/ui/TrackVRulerControls.h b/src/tracks/ui/TrackVRulerControls.h index 7e3f2e10e..175f16b19 100644 --- a/src/tracks/ui/TrackVRulerControls.h +++ b/src/tracks/ui/TrackVRulerControls.h @@ -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 HitTest (const TrackPanelMouseState &state, diff --git a/src/tracks/ui/TrackView.cpp b/src/tracks/ui/TrackView.cpp index 31ee1e41d..6c07d7a25 100644 --- a/src/tracks/ui/TrackView.cpp +++ b/src/tracks/ui/TrackView.cpp @@ -75,10 +75,10 @@ std::vector Track::HitTest std::shared_ptr Track::ContextMenuDelegate() { - return FindTrack()->GetTrackControl(); + return TrackControls::Get( *this ).shared_from_this(); } -std::shared_ptr Track::GetTrackControl() +std::shared_ptr Track::GetTrackControls() { if (!mpControls) // create on demand @@ -86,12 +86,12 @@ std::shared_ptr Track::GetTrackControl() return mpControls; } -std::shared_ptr Track::GetTrackControl() const +std::shared_ptr Track::GetTrackControls() const { - return const_cast< Track* >( this )->GetTrackControl(); + return const_cast< Track* >( this )->GetTrackControls(); } -std::shared_ptr Track::GetVRulerControl() +std::shared_ptr Track::GetVRulerControls() { if (!mpVRulerContols) // create on demand @@ -99,9 +99,9 @@ std::shared_ptr Track::GetVRulerControl() return mpVRulerContols; } -std::shared_ptr Track::GetVRulerControl() const +std::shared_ptr Track::GetVRulerControls() const { - return const_cast< Track* >( this )->GetVRulerControl(); + return const_cast< Track* >( this )->GetVRulerControls(); } #include "../../TrackPanelResizeHandle.h"