From e2f0a168393af76e2dd11979ee22300c5fcc770c Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 27 Jun 2017 20:17:44 -0400 Subject: [PATCH] TrackButtonHandle keeps weak_ptr to the cell --- src/tracks/ui/TrackButtonHandles.cpp | 8 ++++++-- src/tracks/ui/TrackButtonHandles.h | 5 +++-- src/tracks/ui/TrackControls.cpp | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/tracks/ui/TrackButtonHandles.cpp b/src/tracks/ui/TrackButtonHandles.cpp index feb573ce4..82c0e9ae2 100644 --- a/src/tracks/ui/TrackButtonHandles.cpp +++ b/src/tracks/ui/TrackButtonHandles.cpp @@ -148,11 +148,15 @@ MenuButtonHandle &MenuButtonHandle::Instance() UIHandle::Result MenuButtonHandle::CommitChanges (const wxMouseEvent &, AudacityProject *, wxWindow *pParent) { - return mpCell->DoContextMenu(mRect, pParent, NULL); + auto pCell = mpCell.lock(); + if (!pCell) + return RefreshCode::Cancelled; + return pCell->DoContextMenu(mRect, pParent, NULL); } HitTestResult MenuButtonHandle::HitTest -(const wxMouseEvent &event, const wxRect &rect, TrackPanelCell *pCell) +(const wxMouseEvent &event, const wxRect &rect, + const std::shared_ptr &pCell) { wxRect buttonRect; TrackInfo::GetTitleBarRect(rect, buttonRect); diff --git a/src/tracks/ui/TrackButtonHandles.h b/src/tracks/ui/TrackButtonHandles.h index 6c4149194..91821d16e 100644 --- a/src/tracks/ui/TrackButtonHandles.h +++ b/src/tracks/ui/TrackButtonHandles.h @@ -76,10 +76,11 @@ protected: public: static HitTestResult HitTest - (const wxMouseEvent &event, const wxRect &rect, TrackPanelCell *pCell); + (const wxMouseEvent &event, const wxRect &rect, + const std::shared_ptr &pCell); private: - TrackPanelCell *mpCell{}; + std::weak_ptr mpCell; }; #endif diff --git a/src/tracks/ui/TrackControls.cpp b/src/tracks/ui/TrackControls.cpp index b512ea9fb..653b083ed 100644 --- a/src/tracks/ui/TrackControls.cpp +++ b/src/tracks/ui/TrackControls.cpp @@ -48,7 +48,8 @@ HitTestResult TrackControls::HitTest if (NULL != (result = CloseButtonHandle::HitTest(event, rect)).handle) return result; - if (NULL != (result = MenuButtonHandle::HitTest(event, rect, this)).handle) + if (NULL != (result = MenuButtonHandle::HitTest(event, rect, + this->FindTrack()->GetTrackControl())).handle) return result; if (NULL != (result = MinimizeButtonHandle::HitTest(event, rect)).handle)