Manage TrackPanelResizerCell by shared_ptr, no singleton

This commit is contained in:
Paul Licameli 2017-06-26 16:13:56 -04:00
parent 35ce499ce1
commit 28b40e02fb
5 changed files with 24 additions and 12 deletions

View File

@ -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<TrackPanelCell> GetVRulerControl();
// Return another, associated TrackPanelCell object that implements the
// click and drag to resize
std::shared_ptr<TrackPanelCell> 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<TrackControls> mpControls;
std::shared_ptr<TrackVRulerControls> mpVRulerContols;
std::shared_ptr<TrackPanelResizerCell> mpResizer;
};
class AUDACITY_DLL_API AudioTrack /* not final */ : public Track

View File

@ -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:

View File

@ -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<Track> pTrack )
: mpTrack{ pTrack }
{}
HitTestResult TrackPanelResizerCell::HitTest
(const TrackPanelMouseEvent &event, const AudacityProject *pProject)

View File

@ -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<Track> 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<Track> mpTrack;
bool mBetweenTracks {};
};

View File

@ -74,3 +74,12 @@ std::shared_ptr<TrackPanelCell> Track::GetVRulerControl()
mpVRulerContols = GetVRulerControls();
return mpVRulerContols;
}
#include "TrackPanelResizeHandle.h"
std::shared_ptr<TrackPanelCell> Track::GetResizer()
{
if (!mpResizer)
// create on demand
mpResizer = std::make_shared<TrackPanelResizerCell>( Pointer( this ) );
return mpResizer;
}