From ac2fecf151589aaaab2978df16fcee661bd002a4 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 23 Jan 2019 14:22:10 -0500 Subject: [PATCH] Don't rely on order of Bind to EVT_TRACK_PANEL_TIMER from project... ... instead, re-process the event, and let each handler bind to the one it depends on. This still leaves a critical ordering of construction of playback scroller and play indicator overlay in AudacityProject::AudacityProject (reverse of the previous), but that will be removed by other means. --- src/Project.cpp | 23 ++++++++++------------- src/ViewInfo.cpp | 2 ++ src/tracks/ui/PlayIndicatorOverlay.cpp | 6 +++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/Project.cpp b/src/Project.cpp index 3b9577c82..863068c17 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -1178,8 +1178,6 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, mRuler); mTrackPanel->UpdatePrefs(); - mIndicatorOverlay = std::make_unique(this); - mCursorOverlay = std::make_unique(this); mBackgroundCell = std::make_shared(this); @@ -1189,16 +1187,10 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, mScrubber = std::make_unique(this); #endif - // More order dependencies here... - // This must follow construction of *mIndicatorOverlay, because it must - // attach its timer event handler later (so that its handler is invoked - // earlier) mPlaybackScroller = std::make_unique(this); - // This must follow construction of *mPlaybackScroller, - // because it must - // attach its timer event handler later (so that its handler is invoked - // earlier) + mIndicatorOverlay = std::make_unique(this); + this->Bind(EVT_TRACK_PANEL_TIMER, &ViewInfo::OnTimer, &mViewInfo); @@ -5532,9 +5524,9 @@ int AudacityProject::GetEstimatedRecordingMinsLeftOnDisk(long lCaptureChannels) AudacityProject::PlaybackScroller::PlaybackScroller(AudacityProject *project) : mProject(project) { - mProject->Bind(EVT_TRACK_PANEL_TIMER, - &PlaybackScroller::OnTimer, - this); + mProject->GetViewInfo().Bind(EVT_TRACK_PANEL_TIMER, + &PlaybackScroller::OnTimer, + this); } void AudacityProject::PlaybackScroller::OnTimer(wxCommandEvent &event) @@ -5542,6 +5534,11 @@ void AudacityProject::PlaybackScroller::OnTimer(wxCommandEvent &event) // Let other listeners get the notification event.Skip(); + auto cleanup = finally([&]{ + // Propagate the message to other listeners bound to this + this->ProcessEvent( event ); + }); + if(!mProject->IsAudioActive()) return; else if (mMode == Mode::Refresh) { diff --git a/src/ViewInfo.cpp b/src/ViewInfo.cpp index 98d1f0cce..ec0911ccf 100644 --- a/src/ViewInfo.cpp +++ b/src/ViewInfo.cpp @@ -204,4 +204,6 @@ void ViewInfo::OnTimer(wxCommandEvent &event) { mRecentStreamTime = gAudioIO->GetStreamTime(); event.Skip(); + // Propagate the message to other listeners bound to this + this->ProcessEvent( event ); } diff --git a/src/tracks/ui/PlayIndicatorOverlay.cpp b/src/tracks/ui/PlayIndicatorOverlay.cpp index 562f10afe..5d159ce35 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.cpp +++ b/src/tracks/ui/PlayIndicatorOverlay.cpp @@ -110,9 +110,9 @@ void PlayIndicatorOverlayBase::Draw(OverlayPanel &panel, wxDC &dc) PlayIndicatorOverlay::PlayIndicatorOverlay(AudacityProject *project) : PlayIndicatorOverlayBase(project, true) { - mProject->Bind(EVT_TRACK_PANEL_TIMER, - &PlayIndicatorOverlay::OnTimer, - this); + mProject->GetPlaybackScroller().Bind(EVT_TRACK_PANEL_TIMER, + &PlayIndicatorOverlay::OnTimer, + this); } PlayIndicatorOverlay::~PlayIndicatorOverlay()