diff --git a/src/Track.h b/src/Track.h index 94a5dd2e6..1697ae8c1 100644 --- a/src/Track.h +++ b/src/Track.h @@ -38,7 +38,6 @@ class LabelTrack; class TimeTrack; class TrackControls; class TrackView; -class TrackPanelResizerCell; class WaveTrack; class NoteTrack; class AudacityProject; @@ -297,9 +296,6 @@ class AUDACITY_DLL_API Track /* not final */ // 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; @@ -759,7 +755,6 @@ protected: // These hold the controls: std::shared_ptr mpView; std::shared_ptr mpControls; - std::shared_ptr mpResizer; std::weak_ptr mSelectHandle; std::weak_ptr mTimeShiftHandle; diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index c435f929c..16c1d44d7 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -101,6 +101,7 @@ is time to refresh some aspect of the screen. #include "toolbars/ControlToolBar.h" #include "tracks/ui/TrackControls.h" +#include "tracks/ui/TrackView.h" #include "tracks/ui/TrackVRulerControls.h" //This loads the appropriate set of cursors, depending on platform. @@ -2224,7 +2225,8 @@ struct ChannelGroup final : TrackPanelGroup { channel->SubstitutePendingChangedTrack(); yy += substitute->GetHeight(); refinement.emplace_back( - yy - kSeparatorThickness, channel->GetResizer() ); + yy - kSeparatorThickness, + TrackView::Get( *channel ).GetResizer() ); } } @@ -2262,7 +2264,8 @@ struct ResizingChannelGroup final : TrackPanelGroup { { rect.GetTop(), std::make_shared< LabeledChannelGroup >( mpTrack, mLeftOffset ) }, { rect.GetTop() + rect.GetHeight() - kSeparatorThickness, - ( *TrackList::Channels( mpTrack.get() ).rbegin() )->GetResizer() } + TrackView::Get( **TrackList::Channels( mpTrack.get() ).rbegin() ) + .GetResizer() } } }; } std::shared_ptr< Track > mpTrack; wxCoord mLeftOffset; diff --git a/src/TrackPanelResizerCell.cpp b/src/TrackPanelResizerCell.cpp index 3af4547fa..6b2d3a6ae 100644 --- a/src/TrackPanelResizerCell.cpp +++ b/src/TrackPanelResizerCell.cpp @@ -15,11 +15,13 @@ Paul Licameli split from TrackPanel.cpp #include "TrackPanelMouseEvent.h" #include "HitTestResult.h" +#include "tracks/ui/TrackView.h" + #include TrackPanelResizerCell::TrackPanelResizerCell( - const std::shared_ptr &pTrack ) - : CommonTrackCell{ pTrack } + const std::shared_ptr &pView ) + : mwView{ pView } {} std::vector TrackPanelResizerCell::HitTest @@ -27,7 +29,7 @@ std::vector TrackPanelResizerCell::HitTest { (void)pProject;// Compiler food std::vector results; - auto pTrack = mpTrack.lock(); + auto pTrack = FindTrack(); if (pTrack) { auto result = std::make_shared( pTrack, st.state.m_y ); @@ -36,3 +38,11 @@ std::vector TrackPanelResizerCell::HitTest } return results; } + +std::shared_ptr TrackPanelResizerCell::DoFindTrack() +{ + const auto pView = mwView.lock(); + if ( pView ) + return pView->FindTrack(); + return {}; +} diff --git a/src/TrackPanelResizerCell.h b/src/TrackPanelResizerCell.h index c9bb66934..88f7bf085 100644 --- a/src/TrackPanelResizerCell.h +++ b/src/TrackPanelResizerCell.h @@ -14,25 +14,26 @@ #include "tracks/ui/CommonTrackPanelCell.h" class TrackPanelResizeHandle; +class TrackView; -class TrackPanelResizerCell : public CommonTrackCell +class TrackPanelResizerCell : public CommonTrackPanelCell { TrackPanelResizerCell(const TrackPanelResizerCell&) = delete; TrackPanelResizerCell &operator= (const TrackPanelResizerCell&) = delete; public: explicit - TrackPanelResizerCell( const std::shared_ptr &pTrack ); + TrackPanelResizerCell( const std::shared_ptr &pView ); std::vector HitTest (const TrackPanelMouseState &, const AudacityProject *) override; protected: - std::shared_ptr DoFindTrack() override - { return mpTrack.lock(); }; + std::shared_ptr DoFindTrack() override; private: - std::weak_ptr mpTrack; + // back-pointer is weak to break a cycle + std::weak_ptr mwView; std::weak_ptr mResizeHandle; }; diff --git a/src/tracks/ui/TrackView.cpp b/src/tracks/ui/TrackView.cpp index e3324e3ad..92ae344aa 100644 --- a/src/tracks/ui/TrackView.cpp +++ b/src/tracks/ui/TrackView.cpp @@ -133,10 +133,15 @@ std::shared_ptr TrackView::GetVRulerControls() const } #include "../../TrackPanelResizeHandle.h" -std::shared_ptr Track::GetResizer() +std::shared_ptr TrackView::GetResizer() { if (!mpResizer) // create on demand - mpResizer = std::make_shared( SharedPointer() ); + mpResizer = std::make_shared( shared_from_this() ); return mpResizer; } + +std::shared_ptr TrackView::GetResizer() const +{ + return const_cast(this)->GetResizer(); +} diff --git a/src/tracks/ui/TrackView.h b/src/tracks/ui/TrackView.h index b65ccd8d7..6b18e3d8b 100644 --- a/src/tracks/ui/TrackView.h +++ b/src/tracks/ui/TrackView.h @@ -16,6 +16,7 @@ Paul Licameli split from class Track class Track; class TrackVRulerControls; +class TrackPanelResizerCell; class TrackView /* not final */ : public CommonTrackCell , public std::enable_shared_from_this @@ -37,12 +38,19 @@ public: 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(); + std::shared_ptr GetResizer() const; + protected: // Private factory to make appropriate object; class TrackView handles // memory management thereafter virtual std::shared_ptr DoGetVRulerControls() = 0; std::shared_ptr mpVRulerControls; + std::shared_ptr mpResizer; }; #endif