From 6dc5162614685e87025b0a90c7979309fe8c50e7 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Thu, 30 May 2019 13:36:41 -0400 Subject: [PATCH] Use an event so that ProjectSettings.cpp does not need TrackPanel.h --- src/ProjectSettings.cpp | 14 ++++++++++++-- src/ProjectSettings.h | 11 +++++++++++ src/TrackPanel.cpp | 20 ++++++++++++++++++-- src/TrackPanel.h | 1 + 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/ProjectSettings.cpp b/src/ProjectSettings.cpp index 5b58b935a..7ad030641 100644 --- a/src/ProjectSettings.cpp +++ b/src/ProjectSettings.cpp @@ -13,9 +13,19 @@ Paul Licameli split from AudacityProject.cpp #include "AudioIO.h" #include "Project.h" #include "Snap.h" -#include "TrackPanel.h" #include "prefs/QualityPrefs.h" +wxDEFINE_EVENT(EVT_PROJECT_SETTINGS_CHANGE, wxCommandEvent); + +namespace { + void Notify( AudacityProject &project, ProjectSettings::EventCode code ) + { + wxCommandEvent e{ EVT_PROJECT_SETTINGS_CHANGE }; + e.SetInt( static_cast( code ) ); + project.GetEventHandler()->ProcessEvent( e ); + } +} + static const AudacityProject::AttachedObjects::RegisteredFactory sProjectSettingsKey{ []( AudacityProject &project ){ @@ -157,7 +167,7 @@ void ProjectSettings::SetSyncLock(bool flag) auto &project = mProject; if (flag != mIsSyncLocked) { mIsSyncLocked = flag; - TrackPanel::Get( project ).Refresh(false); + Notify( project, ChangedSyncLock ); } } diff --git a/src/ProjectSettings.h b/src/ProjectSettings.h index f8c2a3f66..081be0138 100644 --- a/src/ProjectSettings.h +++ b/src/ProjectSettings.h @@ -11,11 +11,17 @@ Paul Licameli split from AudacityProject.h #ifndef __AUDACITY_PROJECT_SETTINGS__ #define __AUDACITY_PROJECT_SETTINGS__ +#include // to declare custom event type + #include "ClientData.h" // to inherit #include "Prefs.h" // to inherit class AudacityProject; +// Sent to the project when certain settings change +wxDECLARE_EXPORTED_EVENT(AUDACITY_DLL_API, + EVT_PROJECT_SETTINGS_CHANGE, wxCommandEvent); + ///\brief Holds various per-project settings values, including the sample rate, /// and sends events to the project when certain values change class ProjectSettings final @@ -26,6 +32,11 @@ public: static ProjectSettings &Get( AudacityProject &project ); static const ProjectSettings &Get( const AudacityProject &project ); + // Values retrievable from GetInt() of the event for settings change + enum EventCode : int { + ChangedSyncLock, + }; + ProjectSettings( AudacityProject &project ); sampleFormat GetDefaultFormat() const { return mDefaultFormat; } diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index d58376924..e6ce05215 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -70,6 +70,7 @@ is time to refresh some aspect of the screen. #include "AdornedRulerPanel.h" #include "KeyboardCapture.h" #include "Project.h" +#include "ProjectSettings.h" #include "TrackPanelMouseEvent.h" #include "TrackPanelResizeHandle.h" //#define DEBUG_DRAW_TIMING 1 @@ -316,8 +317,11 @@ TrackPanel::TrackPanel(wxWindow * parent, wxWindowID id, &TrackPanel::OnPlayback, this); - GetProject()->Bind(EVT_ODTASK_UPDATE, &TrackPanel::OnODTask, this); - GetProject()->Bind(EVT_ODTASK_COMPLETE, &TrackPanel::OnODTask, this); + auto theProject = GetProject(); + theProject->Bind(EVT_ODTASK_UPDATE, &TrackPanel::OnODTask, this); + theProject->Bind(EVT_ODTASK_COMPLETE, &TrackPanel::OnODTask, this); + theProject->Bind( + EVT_PROJECT_SETTINGS_CHANGE, &TrackPanel::OnProjectSettingsChange, this); UpdatePrefs(); } @@ -530,6 +534,18 @@ void TrackPanel::OnODTask(wxCommandEvent & WXUNUSED(event)) Refresh(false); } +void TrackPanel::OnProjectSettingsChange( wxCommandEvent &event ) +{ + event.Skip(); + switch ( static_cast( event.GetInt() ) ) { + case ProjectSettings::ChangedSyncLock: + Refresh(false); + break; + default: + break; + } +} + double TrackPanel::GetScreenEndTime() const { int width; diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 099837d3e..0ad265bd3 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -289,6 +289,7 @@ class AUDACITY_DLL_API TrackPanel final void OnIdle(wxIdleEvent & event); void OnTimer(wxTimerEvent& event); void OnODTask(wxCommandEvent &event); + void OnProjectSettingsChange(wxCommandEvent &event); int GetLeftOffset() const { return GetLabelWidth() + 1;}