From f8b74db76eab3eb6dc7576a750bf31de236d926e Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Mon, 26 Jun 2017 16:53:12 -0400 Subject: [PATCH] Iterators over TrackPanelCell give shared_ptr --- src/TrackPanel.cpp | 42 +++++++++++++++----------- src/TrackPanel.h | 4 +-- src/TrackPanelCellIterator.h | 8 ++--- src/tracks/ui/EditCursorOverlay.cpp | 2 +- src/tracks/ui/PlayIndicatorOverlay.cpp | 2 +- src/widgets/Ruler.cpp | 2 +- 6 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 637664722..c8cd59ea4 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -855,7 +855,7 @@ void TrackPanel::HandleCursor( wxMouseEvent *pEvent ) auto &rect = foundCell.rect; auto &pCell = foundCell.pCell; const auto size = GetSize(); - const TrackPanelMouseEvent tpmEvent{ event, rect, size, pCell }; + const TrackPanelMouseEvent tpmEvent{ event, rect, size, pCell.get() }; HandleCursor( tpmEvent ); } @@ -1382,7 +1382,7 @@ try auto &pTrack = foundCell.pTrack; const auto size = GetSize(); - TrackPanelMouseEvent tpmEvent{ event, rect, size, pCell }; + TrackPanelMouseEvent tpmEvent{ event, rect, size, pCell.get() }; #if defined(__WXMAC__) && defined(EVT_MAGNIFY) // PRL: @@ -1461,7 +1461,8 @@ try // UIHANDLE DRAG const UIHandle::Result refreshResult = mUIHandle->Drag( tpmEvent, GetProject() ); - ProcessUIHandleResult(this, mRuler, mpClickedTrack, pTrack, refreshResult); + ProcessUIHandleResult + (this, mRuler, mpClickedTrack, pTrack.get(), refreshResult); if (refreshResult & RefreshCode::Cancelled) { // Drag decided to abort itself mUIHandle = NULL; @@ -1480,7 +1481,8 @@ try mUIHandle = nullptr; UIHandle::Result refreshResult = uiHandle->Release( tpmEvent, GetProject(), this ); - ProcessUIHandleResult(this, mRuler, mpClickedTrack, pTrack, refreshResult); + ProcessUIHandleResult + (this, mRuler, mpClickedTrack, pTrack.get(), refreshResult); mpClickedTrack = NULL; // will also Uncapture() below } @@ -1508,7 +1510,7 @@ try const auto foundCell = FindCell(event.m_x, event.m_y); auto t = foundCell.pTrack; if ( t ) - EnsureVisible(t); + EnsureVisible(t.get()); } } catch( ... ) @@ -2511,7 +2513,8 @@ TrackPanel::FoundCell TrackPanel::FindCell(int mouseX, int mouseY) iter = prev; auto found = *iter; return { - static_cast( found.first )->FindTrack(), + Track::Pointer( + static_cast( found.first.get() )->FindTrack() ), found.first, found.second }; @@ -3085,12 +3088,15 @@ IteratorRange< TrackPanelCellIterator > TrackPanel::Cells() TrackPanelCellIterator::TrackPanelCellIterator(TrackPanel *trackPanel, bool begin) : mPanel{ trackPanel } , mIter{ trackPanel->GetProject() } - , mpTrack{ begin ? mIter.First() : nullptr } - , mpCell{ begin - ? ( mpTrack ? mpTrack : trackPanel->GetBackgroundCell().get() ) - : nullptr - } { + if (begin) { + mpTrack = Track::Pointer( mIter.First() ); + if (mpTrack) + mpCell = mpTrack; + else + mpCell = trackPanel->GetBackgroundCell(); + } + const auto size = mPanel->GetSize(); mRect = { 0, 0, size.x, size.y }; UpdateRect(); @@ -3100,7 +3106,7 @@ TrackPanelCellIterator &TrackPanelCellIterator::operator++ () { if ( mpTrack ) { if ( ++ mType == CellType::Background ) - mType = CellType::Track, mpTrack = mIter.Next(); + mType = CellType::Track, mpTrack = Track::Pointer( mIter.Next() ); } if ( mpTrack ) { if ( mType == CellType::Label && @@ -3112,25 +3118,25 @@ TrackPanelCellIterator &TrackPanelCellIterator::operator++ () mpCell = mpTrack; break; case CellType::Label: - mpCell = mpTrack->GetTrackControl().get(); + mpCell = mpTrack->GetTrackControl(); break; case CellType::VRuler: - mpCell = mpTrack->GetVRulerControl().get(); + mpCell = mpTrack->GetVRulerControl(); break; case CellType::Resizer: { - mpCell = mpTrack->GetResizer().get(); + mpCell = mpTrack->GetResizer(); break; } default: // should not happen - mpCell = nullptr; + mpCell.reset(); break; } } else if ( !mDidBackground ) - mpCell = mPanel->GetBackgroundCell().get(), mDidBackground = true; + mpCell = mPanel->GetBackgroundCell(), mDidBackground = true; else - mpCell = nullptr; + mpCell.reset(); UpdateRect(); diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 6e64e4303..99e9a12fb 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -366,8 +366,8 @@ protected: // Find track info by coordinate struct FoundCell { - Track *pTrack; - TrackPanelCell *pCell; + std::shared_ptr pTrack; + std::shared_ptr pCell; wxRect rect; }; FoundCell FindCell(int mouseX, int mouseY); diff --git a/src/TrackPanelCellIterator.h b/src/TrackPanelCellIterator.h index 97adad3b0..ae5022781 100644 --- a/src/TrackPanelCellIterator.h +++ b/src/TrackPanelCellIterator.h @@ -14,6 +14,7 @@ Paul Licameli #include "Track.h" #include #include +#include "MemoryX.h" class Track; class TrackPanelCell; @@ -24,7 +25,7 @@ class TrackPanel; class TrackPanelCellIterator : public std::iterator< std::forward_iterator_tag, - const std::pair + const std::pair< std::shared_ptr< TrackPanelCell >, wxRect> > { public: @@ -45,7 +46,6 @@ public: return lhs.mpCell == rhs.mpCell; } - using value_type = std::pair; value_type operator * () const; private: @@ -53,8 +53,8 @@ private: TrackPanel *mPanel; VisibleTrackIterator mIter; - Track *mpTrack; - TrackPanelCell *mpCell; + std::shared_ptr mpTrack; + std::shared_ptr mpCell; CellType mType{ CellType::Track }; bool mDidBackground{ false }; wxRect mRect; diff --git a/src/tracks/ui/EditCursorOverlay.cpp b/src/tracks/ui/EditCursorOverlay.cpp index 4f6207384..f1ed2c851 100644 --- a/src/tracks/ui/EditCursorOverlay.cpp +++ b/src/tracks/ui/EditCursorOverlay.cpp @@ -106,7 +106,7 @@ void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc) // Draw cursor in all selected tracks for ( const auto &data : tp->Cells() ) { - Track *const pTrack = dynamic_cast(data.first); + Track *const pTrack = dynamic_cast(data.first.get()); if (!pTrack) continue; if (pTrack->GetSelected() || diff --git a/src/tracks/ui/PlayIndicatorOverlay.cpp b/src/tracks/ui/PlayIndicatorOverlay.cpp index 91b8977cb..370f2ab23 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.cpp +++ b/src/tracks/ui/PlayIndicatorOverlay.cpp @@ -72,7 +72,7 @@ void PlayIndicatorOverlayBase::Draw(OverlayPanel &panel, wxDC &dc) // Draw indicator in all visible tracks for ( const auto &data : tp->Cells() ) { - Track *const pTrack = dynamic_cast(data.first); + Track *const pTrack = dynamic_cast(data.first.get()); if (!pTrack) continue; diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index a9ba2fc36..0d02d9d55 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -1841,7 +1841,7 @@ void QuickPlayIndicatorOverlay::Draw(OverlayPanel &panel, wxDC &dc) // Draw indicator in all visible tracks for ( const auto &data : static_cast(panel).Cells() ) { - Track *const pTrack = dynamic_cast(data.first); + Track *const pTrack = dynamic_cast(data.first.get()); if (!pTrack) continue; const wxRect &rect = data.second;