diff --git a/src/LabelTrack.h b/src/LabelTrack.h index c91756a5e..96c839ca0 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -321,7 +321,6 @@ private: protected: std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; - std::shared_ptr DoGetVRulerControls() override; friend class GetInfoCommand; // to get labels. friend class SetLabelCommand; // to set labels. diff --git a/src/NoteTrack.h b/src/NoteTrack.h index fd04b182a..2fccefff4 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -228,7 +228,6 @@ class AUDACITY_DLL_API NoteTrack final protected: std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; - std::shared_ptr DoGetVRulerControls() override; }; /// Data used to display a note track diff --git a/src/TimeTrack.h b/src/TimeTrack.h index 398746c95..5c1e1fac1 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -125,7 +125,6 @@ class TimeTrack final : public Track { protected: std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; - std::shared_ptr DoGetVRulerControls() override; }; diff --git a/src/Track.h b/src/Track.h index e8e734e6b..94a5dd2e6 100644 --- a/src/Track.h +++ b/src/Track.h @@ -38,7 +38,6 @@ class LabelTrack; class TimeTrack; class TrackControls; class TrackView; -class TrackVRulerControls; class TrackPanelResizerCell; class WaveTrack; class NoteTrack; @@ -297,11 +296,7 @@ class AUDACITY_DLL_API Track /* not final */ std::shared_ptr GetTrackControls() const; // Return another, associated TrackPanelCell object that implements the - // mouse actions for the vertical ruler - std::shared_ptr GetVRulerControls(); - std::shared_ptr GetVRulerControls() const; - // Return another, associated TrackPanelCell object that implements the // click and drag to resize std::shared_ptr GetResizer(); @@ -760,12 +755,10 @@ protected: // These are called to create controls on demand: virtual std::shared_ptr DoGetView() = 0; virtual std::shared_ptr DoGetControls() = 0; - virtual std::shared_ptr DoGetVRulerControls() = 0; // These hold the controls: std::shared_ptr mpView; std::shared_ptr mpControls; - std::shared_ptr mpVRulerContols; std::shared_ptr mpResizer; std::weak_ptr mSelectHandle; diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 6fc8e6332..c435f929c 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -101,7 +101,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 +#include "tracks/ui/TrackVRulerControls.h" //This loads the appropriate set of cursors, depending on platform. #include "../images/Cursors.h" diff --git a/src/WaveTrack.h b/src/WaveTrack.h index 9aafd401e..2d434ebef 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -701,7 +701,6 @@ private: protected: std::shared_ptr DoGetView() override; std::shared_ptr DoGetControls() override; - std::shared_ptr DoGetVRulerControls() override; }; // This is meant to be a short-lived object, during whose lifetime, diff --git a/src/tracks/labeltrack/ui/LabelTrackVRulerControls.h b/src/tracks/labeltrack/ui/LabelTrackVRulerControls.h index 64555252b..b6fde72cc 100644 --- a/src/tracks/labeltrack/ui/LabelTrackVRulerControls.h +++ b/src/tracks/labeltrack/ui/LabelTrackVRulerControls.h @@ -23,8 +23,8 @@ class LabelTrackVRulerControls final : public TrackVRulerControls public: explicit - LabelTrackVRulerControls( std::shared_ptr pTrack ) - : TrackVRulerControls( pTrack ) {} + LabelTrackVRulerControls( const std::shared_ptr &pTrackView ) + : TrackVRulerControls( pTrackView ) {} ~LabelTrackVRulerControls(); }; diff --git a/src/tracks/labeltrack/ui/LabelTrackView.cpp b/src/tracks/labeltrack/ui/LabelTrackView.cpp index 53009caae..8123dbd34 100644 --- a/src/tracks/labeltrack/ui/LabelTrackView.cpp +++ b/src/tracks/labeltrack/ui/LabelTrackView.cpp @@ -15,6 +15,7 @@ Paul Licameli split from TrackPanel.cpp #include "LabelTrackVRulerControls.h" #include "LabelGlyphHandle.h" #include "LabelTextHandle.h" +#include "LabelTrackVRulerControls.h" #include "../../../HitTestResult.h" #include "../../../TrackPanelMouseEvent.h" @@ -54,7 +55,8 @@ std::shared_ptr LabelTrack::DoGetControls() return std::make_shared( SharedPointer() ); } -std::shared_ptr LabelTrack::DoGetVRulerControls() +std::shared_ptr LabelTrackView::DoGetVRulerControls() { - return std::make_shared( SharedPointer() ); + return + std::make_shared( shared_from_this() ); } diff --git a/src/tracks/labeltrack/ui/LabelTrackView.h b/src/tracks/labeltrack/ui/LabelTrackView.h index 02762f29f..519495cdd 100644 --- a/src/tracks/labeltrack/ui/LabelTrackView.h +++ b/src/tracks/labeltrack/ui/LabelTrackView.h @@ -23,6 +23,9 @@ public: LabelTrackView( const std::shared_ptr &pTrack ) : CommonTrackView{ pTrack } {} ~LabelTrackView() override; + +private: + std::shared_ptr DoGetVRulerControls() override; }; #endif diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.h b/src/tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.h index 322e09927..a371b1982 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.h +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackVRulerControls.h @@ -22,8 +22,8 @@ class NoteTrackVRulerControls final : public TrackVRulerControls public: explicit - NoteTrackVRulerControls( std::shared_ptr pTrack ) - : TrackVRulerControls( pTrack ) {} + NoteTrackVRulerControls( const std::shared_ptr &pTrackView ) + : TrackVRulerControls( pTrackView ) {} ~NoteTrackVRulerControls(); std::vector HitTest diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp index 5460f942a..936da0bad 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.cpp @@ -57,8 +57,10 @@ std::shared_ptr NoteTrack::DoGetControls() return std::make_shared( SharedPointer() ); } -std::shared_ptr NoteTrack::DoGetVRulerControls() +std::shared_ptr NoteTrackView::DoGetVRulerControls() { - return std::make_shared( SharedPointer() ); + return + std::make_shared( shared_from_this() ); } + #endif diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h index 0f02d05e9..6b21da0c4 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackView.h @@ -23,6 +23,8 @@ public: NoteTrackView( const std::shared_ptr &pTrack ) : CommonTrackView{ pTrack } {} ~NoteTrackView() override; + + std::shared_ptr DoGetVRulerControls() override; }; #endif diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.h index 2bb291c34..2006564f8 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVRulerControls.h @@ -22,8 +22,8 @@ class WaveTrackVRulerControls final : public TrackVRulerControls public: explicit - WaveTrackVRulerControls( std::shared_ptr pTrack ) - : TrackVRulerControls( pTrack ) {} + WaveTrackVRulerControls( const std::shared_ptr &pTrackView ) + : TrackVRulerControls( pTrackView ) {} ~WaveTrackVRulerControls(); std::vector HitTest diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp index 8c40d5054..f8f3441a9 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.cpp @@ -14,6 +14,7 @@ Paul Licameli split from TrackPanel.cpp #include "WaveTrackControls.h" #include "WaveTrackVRulerControls.h" +#include "WaveTrackVRulerControls.h" #include "../../../../HitTestResult.h" #include "../../../../TrackPanelMouseEvent.h" @@ -116,7 +117,8 @@ std::shared_ptr WaveTrack::DoGetControls() return std::make_shared( SharedPointer() ); } -std::shared_ptr WaveTrack::DoGetVRulerControls() +std::shared_ptr WaveTrackView::DoGetVRulerControls() { - return std::make_shared( SharedPointer() ); + return + std::make_shared( shared_from_this() ); } diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h index 2e2896618..2942eec23 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackView.h @@ -23,6 +23,8 @@ public: WaveTrackView( const std::shared_ptr &pTrack ) : CommonTrackView{ pTrack } {} ~WaveTrackView() override; + + std::shared_ptr DoGetVRulerControls() override; }; #endif diff --git a/src/tracks/timetrack/ui/TimeTrackVRulerControls.h b/src/tracks/timetrack/ui/TimeTrackVRulerControls.h index dc0965d6c..96df01c62 100644 --- a/src/tracks/timetrack/ui/TimeTrackVRulerControls.h +++ b/src/tracks/timetrack/ui/TimeTrackVRulerControls.h @@ -22,8 +22,8 @@ class TimeTrackVRulerControls final : public TrackVRulerControls public: explicit - TimeTrackVRulerControls( std::shared_ptr pTrack ) - : TrackVRulerControls( pTrack ) {} + TimeTrackVRulerControls( const std::shared_ptr &pTrackView ) + : TrackVRulerControls( pTrackView ) {} ~TimeTrackVRulerControls(); }; diff --git a/src/tracks/timetrack/ui/TimeTrackView.cpp b/src/tracks/timetrack/ui/TimeTrackView.cpp index 0bd4f5df1..73ff534d9 100644 --- a/src/tracks/timetrack/ui/TimeTrackView.cpp +++ b/src/tracks/timetrack/ui/TimeTrackView.cpp @@ -14,6 +14,7 @@ Paul Licameli split from TrackPanel.cpp #include "TimeTrackControls.h" #include "TimeTrackVRulerControls.h" +#include "TimeTrackVRulerControls.h" #include "../../../HitTestResult.h" #include "../../../TrackPanelMouseEvent.h" @@ -45,7 +46,8 @@ std::shared_ptr TimeTrack::DoGetControls() return std::make_shared( SharedPointer() ); } -std::shared_ptr TimeTrack::DoGetVRulerControls() +std::shared_ptr TimeTrackView::DoGetVRulerControls() { - return std::make_shared( SharedPointer() ); + return + std::make_shared( shared_from_this() ); } diff --git a/src/tracks/timetrack/ui/TimeTrackView.h b/src/tracks/timetrack/ui/TimeTrackView.h index 57f858634..a9f767132 100644 --- a/src/tracks/timetrack/ui/TimeTrackView.h +++ b/src/tracks/timetrack/ui/TimeTrackView.h @@ -23,6 +23,9 @@ public: TimeTrackView( const std::shared_ptr &pTrack ) : CommonTrackView{ pTrack } {} ~TimeTrackView() override; + + std::shared_ptr DoGetVRulerControls() override; + }; #endif diff --git a/src/tracks/ui/TrackVRulerControls.cpp b/src/tracks/ui/TrackVRulerControls.cpp index 377729fbe..8b7ce9717 100644 --- a/src/tracks/ui/TrackVRulerControls.cpp +++ b/src/tracks/ui/TrackVRulerControls.cpp @@ -11,6 +11,8 @@ Paul Licameli split from TrackPanel.cpp #include "../../Audacity.h" #include "TrackVRulerControls.h" +#include "TrackView.h" + #include "../../Track.h" #include "../../ViewInfo.h" @@ -18,8 +20,9 @@ Paul Licameli split from TrackPanel.cpp #include #include -TrackVRulerControls::TrackVRulerControls( std::shared_ptr pTrack ) - : mwTrack{ pTrack } +TrackVRulerControls::TrackVRulerControls( + const std::shared_ptr &pTrackView ) + : mwTrackView{ pTrackView } { } @@ -29,17 +32,30 @@ TrackVRulerControls::~TrackVRulerControls() TrackVRulerControls &TrackVRulerControls::Get( Track &track ) { - return *track.GetVRulerControls(); + return *TrackView::Get( track ).GetVRulerControls(); } const TrackVRulerControls &TrackVRulerControls::Get( const Track &track ) { - return *track.GetVRulerControls(); + return *TrackView::Get( track ).GetVRulerControls(); +} + +TrackVRulerControls &TrackVRulerControls::Get( TrackView &trackView ) +{ + return *trackView.GetVRulerControls(); +} + +const TrackVRulerControls &TrackVRulerControls::Get( const TrackView &trackView ) +{ + return *trackView.GetVRulerControls(); } std::shared_ptr TrackVRulerControls::DoFindTrack() { - return mwTrack.lock(); + const auto pView = mwTrackView.lock(); + if ( pView ) + return pView->FindTrack(); + return {}; } std::vector TrackVRulerControls::HitTest diff --git a/src/tracks/ui/TrackVRulerControls.h b/src/tracks/ui/TrackVRulerControls.h index 175f16b19..692233f8f 100644 --- a/src/tracks/ui/TrackVRulerControls.h +++ b/src/tracks/ui/TrackVRulerControls.h @@ -14,6 +14,7 @@ Paul Licameli split from TrackPanel.cpp #include "CommonTrackPanelCell.h" class Track; +class TrackView; class wxDC; const int kGuard = 5; // 5 pixels to reduce risk of VZooming accidentally @@ -23,13 +24,16 @@ class TrackVRulerControls /* not final */ : public CommonTrackPanelCell { public: explicit - TrackVRulerControls( std::shared_ptr pTrack ); + TrackVRulerControls( const std::shared_ptr &pTrackView ); virtual ~TrackVRulerControls() = 0; static TrackVRulerControls &Get( Track& ); static const TrackVRulerControls &Get( const Track& ); + static TrackVRulerControls &Get( TrackView& ); + static const TrackVRulerControls &Get( const TrackView& ); + // Define a default hit test method, just for message and cursor std::vector HitTest (const TrackPanelMouseState &state, @@ -44,7 +48,7 @@ protected: Track *GetTrack() const; - std::weak_ptr mwTrack; + std::weak_ptr mwTrackView; }; #endif diff --git a/src/tracks/ui/TrackView.cpp b/src/tracks/ui/TrackView.cpp index 1e7efef86..e3324e3ad 100644 --- a/src/tracks/ui/TrackView.cpp +++ b/src/tracks/ui/TrackView.cpp @@ -119,17 +119,17 @@ std::shared_ptr Track::GetTrackControls() const return const_cast< Track* >( this )->GetTrackControls(); } -std::shared_ptr Track::GetVRulerControls() +std::shared_ptr TrackView::GetVRulerControls() { - if (!mpVRulerContols) + if (!mpVRulerControls) // create on demand - mpVRulerContols = DoGetVRulerControls(); - return mpVRulerContols; + mpVRulerControls = DoGetVRulerControls(); + return mpVRulerControls; } -std::shared_ptr Track::GetVRulerControls() const +std::shared_ptr TrackView::GetVRulerControls() const { - return const_cast< Track* >( this )->GetVRulerControls(); + return const_cast< TrackView* >( this )->GetVRulerControls(); } #include "../../TrackPanelResizeHandle.h" diff --git a/src/tracks/ui/TrackView.h b/src/tracks/ui/TrackView.h index 8e999e3f7..b65ccd8d7 100644 --- a/src/tracks/ui/TrackView.h +++ b/src/tracks/ui/TrackView.h @@ -15,8 +15,10 @@ Paul Licameli split from class Track #include "CommonTrackPanelCell.h" // to inherit class Track; +class TrackVRulerControls; class TrackView /* not final */ : public CommonTrackCell + , public std::enable_shared_from_this { TrackView( const TrackView& ) = delete; TrackView &operator=( const TrackView& ) = delete; @@ -29,6 +31,18 @@ public: static TrackView &Get( Track & ); static const TrackView &Get( const Track & ); + + // Return another, associated TrackPanelCell object that implements the + // mouse actions for the vertical ruler + std::shared_ptr GetVRulerControls(); + std::shared_ptr GetVRulerControls() const; + +protected: + // Private factory to make appropriate object; class TrackView handles + // memory management thereafter + virtual std::shared_ptr DoGetVRulerControls() = 0; + + std::shared_ptr mpVRulerControls; }; #endif