1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-10-29 16:53:51 +01:00

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 TimeTrack;
class TrackControls; class TrackControls;
class TrackVRulerControls; class TrackVRulerControls;
class TrackPanelResizerCell;
class WaveTrack; class WaveTrack;
class NoteTrack; class NoteTrack;
class AudacityProject; class AudacityProject;
@@ -144,6 +145,10 @@ class AUDACITY_DLL_API Track /* not final */
// mouse actions for the vertical ruler // mouse actions for the vertical ruler
std::shared_ptr<TrackPanelCell> GetVRulerControl(); 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 // This just returns a constant and can be overriden by subclasses
// to specify a different height for the case that the track is minimized. // to specify a different height for the case that the track is minimized.
virtual int GetMinimizedHeight() const; virtual int GetMinimizedHeight() const;
@@ -302,6 +307,7 @@ protected:
// These hold the controls: // These hold the controls:
std::shared_ptr<TrackControls> mpControls; std::shared_ptr<TrackControls> mpControls;
std::shared_ptr<TrackVRulerControls> mpVRulerContols; std::shared_ptr<TrackVRulerControls> mpVRulerContols;
std::shared_ptr<TrackPanelResizerCell> mpResizer;
}; };
class AUDACITY_DLL_API AudioTrack /* not final */ : public Track class AUDACITY_DLL_API AudioTrack /* not final */ : public Track

View File

@@ -3118,9 +3118,7 @@ TrackPanelCellIterator &TrackPanelCellIterator::operator++ ()
mpCell = mpTrack->GetVRulerControl().get(); mpCell = mpTrack->GetVRulerControl().get();
break; break;
case CellType::Resizer: { case CellType::Resizer: {
auto instance = &TrackPanelResizerCell::Instance(); mpCell = mpTrack->GetResizer().get();
instance->mpTrack = mpTrack;
mpCell = instance;
break; break;
} }
default: default:

View File

@@ -384,11 +384,9 @@ UIHandle::Result TrackPanelResizeHandle::Cancel(AudacityProject *pProject)
return RefreshCode::RefreshAll; return RefreshCode::RefreshAll;
} }
TrackPanelResizerCell &TrackPanelResizerCell::Instance() TrackPanelResizerCell::TrackPanelResizerCell( std::shared_ptr<Track> pTrack )
{ : mpTrack{ pTrack }
static TrackPanelResizerCell instance; {}
return instance;
}
HitTestResult TrackPanelResizerCell::HitTest HitTestResult TrackPanelResizerCell::HitTest
(const TrackPanelMouseEvent &event, const AudacityProject *pProject) (const TrackPanelMouseEvent &event, const AudacityProject *pProject)

View File

@@ -68,20 +68,21 @@ private:
class TrackPanelResizerCell : public CommonTrackPanelCell class TrackPanelResizerCell : public CommonTrackPanelCell
{ {
TrackPanelResizerCell() {}
TrackPanelResizerCell(const TrackPanelResizerCell&) = delete; TrackPanelResizerCell(const TrackPanelResizerCell&) = delete;
TrackPanelResizerCell &operator= (const TrackPanelResizerCell&) = delete; TrackPanelResizerCell &operator= (const TrackPanelResizerCell&) = delete;
public: public:
static TrackPanelResizerCell &Instance();
explicit
TrackPanelResizerCell( std::shared_ptr<Track> pTrack );
HitTestResult HitTest HitTestResult HitTest
(const TrackPanelMouseEvent &event, (const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override; const AudacityProject *pProject) override;
Track *FindTrack() override { return mpTrack; }; Track *FindTrack() override { return mpTrack.lock().get(); };
private: private:
friend class TrackPanelCellIterator; friend class TrackPanelCellIterator;
Track *mpTrack {}; std::weak_ptr<Track> mpTrack;
bool mBetweenTracks {}; bool mBetweenTracks {};
}; };

View File

@@ -74,3 +74,12 @@ std::shared_ptr<TrackPanelCell> Track::GetVRulerControl()
mpVRulerContols = GetVRulerControls(); mpVRulerContols = GetVRulerControls();
return mpVRulerContols; 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;
}