Manage TrackPanelResizerCell by shared_ptr, no singleton
This commit is contained in:
parent
35ce499ce1
commit
28b40e02fb
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {};
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue