From 28b40e02fbaf940152cdb07fe2d47050fce9da22 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 26 Jun 2017 16:13:56 -0400 Subject: [PATCH] Manage TrackPanelResizerCell by shared_ptr, no singleton --- src/Track.h | 6 ++++++ src/TrackPanel.cpp | 4 +--- src/TrackPanelResizeHandle.cpp | 8 +++----- src/TrackPanelResizeHandle.h | 9 +++++---- src/tracks/ui/TrackUI.cpp | 9 +++++++++ 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/Track.h b/src/Track.h index 7151f9c53..e33af36ee 100644 --- a/src/Track.h +++ b/src/Track.h @@ -38,6 +38,7 @@ class LabelTrack; class TimeTrack; class TrackControls; class TrackVRulerControls; +class TrackPanelResizerCell; class WaveTrack; class NoteTrack; class AudacityProject; @@ -144,6 +145,10 @@ class AUDACITY_DLL_API Track /* not final */ // mouse actions for the vertical ruler std::shared_ptr GetVRulerControl(); + // Return another, associated TrackPanelCell object that implements the + // click and drag to resize + std::shared_ptr GetResizer(); + // This just returns a constant and can be overriden by subclasses // to specify a different height for the case that the track is minimized. virtual int GetMinimizedHeight() const; @@ -302,6 +307,7 @@ protected: // These hold the controls: std::shared_ptr mpControls; std::shared_ptr mpVRulerContols; + std::shared_ptr mpResizer; }; class AUDACITY_DLL_API AudioTrack /* not final */ : public Track diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 47db3f728..637664722 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -3118,9 +3118,7 @@ TrackPanelCellIterator &TrackPanelCellIterator::operator++ () mpCell = mpTrack->GetVRulerControl().get(); break; case CellType::Resizer: { - auto instance = &TrackPanelResizerCell::Instance(); - instance->mpTrack = mpTrack; - mpCell = instance; + mpCell = mpTrack->GetResizer().get(); break; } default: diff --git a/src/TrackPanelResizeHandle.cpp b/src/TrackPanelResizeHandle.cpp index fd17be59d..0ad202278 100644 --- a/src/TrackPanelResizeHandle.cpp +++ b/src/TrackPanelResizeHandle.cpp @@ -384,11 +384,9 @@ UIHandle::Result TrackPanelResizeHandle::Cancel(AudacityProject *pProject) return RefreshCode::RefreshAll; } -TrackPanelResizerCell &TrackPanelResizerCell::Instance() -{ - static TrackPanelResizerCell instance; - return instance; -} +TrackPanelResizerCell::TrackPanelResizerCell( std::shared_ptr pTrack ) + : mpTrack{ pTrack } +{} HitTestResult TrackPanelResizerCell::HitTest (const TrackPanelMouseEvent &event, const AudacityProject *pProject) diff --git a/src/TrackPanelResizeHandle.h b/src/TrackPanelResizeHandle.h index 438c34406..7503a141e 100644 --- a/src/TrackPanelResizeHandle.h +++ b/src/TrackPanelResizeHandle.h @@ -68,20 +68,21 @@ private: class TrackPanelResizerCell : public CommonTrackPanelCell { - TrackPanelResizerCell() {} TrackPanelResizerCell(const TrackPanelResizerCell&) = delete; TrackPanelResizerCell &operator= (const TrackPanelResizerCell&) = delete; public: - static TrackPanelResizerCell &Instance(); + + explicit + TrackPanelResizerCell( std::shared_ptr pTrack ); HitTestResult HitTest (const TrackPanelMouseEvent &event, const AudacityProject *pProject) override; - Track *FindTrack() override { return mpTrack; }; + Track *FindTrack() override { return mpTrack.lock().get(); }; private: friend class TrackPanelCellIterator; - Track *mpTrack {}; + std::weak_ptr mpTrack; bool mBetweenTracks {}; }; diff --git a/src/tracks/ui/TrackUI.cpp b/src/tracks/ui/TrackUI.cpp index 28b8ea369..5b47aba29 100644 --- a/src/tracks/ui/TrackUI.cpp +++ b/src/tracks/ui/TrackUI.cpp @@ -74,3 +74,12 @@ std::shared_ptr Track::GetVRulerControl() mpVRulerContols = GetVRulerControls(); return mpVRulerContols; } + +#include "TrackPanelResizeHandle.h" +std::shared_ptr Track::GetResizer() +{ + if (!mpResizer) + // create on demand + mpResizer = std::make_shared( Pointer( this ) ); + return mpResizer; +}