From 52abbcdc4bdd1612f558688fce14416cc000b2a8 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 28 Apr 2019 07:02:40 -0400 Subject: [PATCH] static ::Get functions for overlays on TrackPanel... ... not member functions of AudacityProject. AdornedRulerPanel is not (yet) made similarly independent of its overlay code. Two .cpp files implementing overlays escape dependency cycles to higher levels. --- src/Project.cpp | 17 ----------------- src/Project.h | 10 ---------- src/tracks/ui/EditCursorOverlay.cpp | 8 ++++++++ src/tracks/ui/EditCursorOverlay.h | 5 ++++- src/tracks/ui/PlayIndicatorOverlay.cpp | 8 ++++++++ src/tracks/ui/PlayIndicatorOverlay.h | 6 +++++- src/tracks/ui/Scrubbing.cpp | 8 ++++++++ src/tracks/ui/Scrubbing.h | 5 ++++- 8 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/Project.cpp b/src/Project.cpp index 57d399b28..493c6c681 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -161,8 +161,6 @@ scroll information. It also has some status flags. #include "toolbars/ToolsToolBar.h" #include "toolbars/TranscriptionToolBar.h" -#include "tracks/ui/EditCursorOverlay.h" -#include "tracks/ui/PlayIndicatorOverlay.h" #include "tracks/ui/Scrubbing.h" #include "commands/ScriptCommandRelay.h" @@ -1228,24 +1226,9 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, this, mRuler); } - - mCursorOverlay = std::make_shared(this); - -#ifdef EXPERIMENTAL_SCRUBBING_BASIC - mScrubOverlay = std::make_shared(this); -#endif mPlaybackScroller = std::make_unique(this); - mIndicatorOverlay = std::make_shared(this); - - // Add the overlays - mTrackPanel->AddOverlay( mIndicatorOverlay ); - mTrackPanel->AddOverlay( mCursorOverlay ); -#ifdef EXPERIMENTAL_SCRUBBING_BASIC - mTrackPanel->AddOverlay( mScrubOverlay ); -#endif - MenuManager::Get( project ).CreateMenusAndCommands( project ); // LLL: When Audacity starts or becomes active after returning from diff --git a/src/Project.h b/src/Project.h index dea2a343b..6dddb5561 100644 --- a/src/Project.h +++ b/src/Project.h @@ -55,7 +55,6 @@ class AudacityProject; class AutoSaveFile; class Importer; class ODLock; -class Overlay; class RecordingRecoveryHandler; namespace ProjectFileIORegistry{ struct Entry; } class TrackList; @@ -649,15 +648,6 @@ public: private: bool mbInitializingScrollbar{ false }; - // TrackPanelOverlay objects - std::shared_ptr - mIndicatorOverlay, mCursorOverlay; - -#ifdef EXPERIMENTAL_SCRUBBING_BASIC - std::shared_ptr mScrubOverlay; -private: -#endif - public: class PlaybackScroller final : public wxEvtHandler { diff --git a/src/tracks/ui/EditCursorOverlay.cpp b/src/tracks/ui/EditCursorOverlay.cpp index 588537eb8..87e4924b7 100644 --- a/src/tracks/ui/EditCursorOverlay.cpp +++ b/src/tracks/ui/EditCursorOverlay.cpp @@ -29,6 +29,14 @@ namespace { } } +static const AudacityProject::AttachedObjects::RegisteredFactory sOverlayKey{ + []( AudacityProject &parent ){ + auto result = std::make_shared< EditCursorOverlay >( &parent ); + parent.GetTrackPanel()->AddOverlay( result ); + return result; + } +}; + EditCursorOverlay::EditCursorOverlay(AudacityProject *project, bool isMaster) : mProject(project) , mIsMaster(isMaster) diff --git a/src/tracks/ui/EditCursorOverlay.h b/src/tracks/ui/EditCursorOverlay.h index afa46c51d..0879566c2 100644 --- a/src/tracks/ui/EditCursorOverlay.h +++ b/src/tracks/ui/EditCursorOverlay.h @@ -12,11 +12,14 @@ Paul Licameli split from TrackPanel.cpp #define __AUDACITY_EDIT_CURSOR_OVERLAY__ #include +#include "../../ClientData.h" // to inherit #include "../../widgets/Overlay.h" // to inherit class AudacityProject; -class EditCursorOverlay final : public Overlay +class EditCursorOverlay final + : public Overlay + , public ClientData::Base { public: EditCursorOverlay(AudacityProject *project, bool isMaster = true); diff --git a/src/tracks/ui/PlayIndicatorOverlay.cpp b/src/tracks/ui/PlayIndicatorOverlay.cpp index b720f4bac..010deb987 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.cpp +++ b/src/tracks/ui/PlayIndicatorOverlay.cpp @@ -115,6 +115,14 @@ void PlayIndicatorOverlayBase::Draw(OverlayPanel &panel, wxDC &dc) wxASSERT(false); } +static const AudacityProject::AttachedObjects::RegisteredFactory sOverlayKey{ + []( AudacityProject &parent ){ + auto result = std::make_shared< PlayIndicatorOverlay >( &parent ); + parent.GetTrackPanel()->AddOverlay( result ); + return result; + } +}; + PlayIndicatorOverlay::PlayIndicatorOverlay(AudacityProject *project) : PlayIndicatorOverlayBase(project, true) { diff --git a/src/tracks/ui/PlayIndicatorOverlay.h b/src/tracks/ui/PlayIndicatorOverlay.h index 8129f1b63..25591e7dc 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.h +++ b/src/tracks/ui/PlayIndicatorOverlay.h @@ -13,13 +13,17 @@ Paul Licameli split from TrackPanel.cpp #include // to inherit #include "../../MemoryX.h" +#include "../../ClientData.h" #include "../../widgets/Overlay.h" // to inherit class AudacityProject; // Common class for overlaying track panel or ruler -class PlayIndicatorOverlayBase : public wxEvtHandler, public Overlay +class PlayIndicatorOverlayBase + : public wxEvtHandler + , public Overlay + , public ClientData::Base { public: PlayIndicatorOverlayBase(AudacityProject *project, bool isMaster); diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index b104c112b..eec4ce0de 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -882,6 +882,14 @@ void Scrubber::Forwarder::OnMouse(wxMouseEvent &event) /////////////////////////////////////////////////////////////////////////////// // class ScrubbingOverlay is responsible for drawing the speed numbers +static const AudacityProject::AttachedObjects::RegisteredFactory sOverlayKey{ + []( AudacityProject &parent ){ + auto result = std::make_shared< ScrubbingOverlay >( &parent ); + parent.GetTrackPanel()->AddOverlay( result ); + return result; + } +}; + ScrubbingOverlay::ScrubbingOverlay(AudacityProject *project) : mProject(project) , mLastScrubRect() diff --git a/src/tracks/ui/Scrubbing.h b/src/tracks/ui/Scrubbing.h index 845fe7590..ae5af2658 100644 --- a/src/tracks/ui/Scrubbing.h +++ b/src/tracks/ui/Scrubbing.h @@ -216,7 +216,10 @@ private: }; // Specialist in drawing the scrub speed, and listening for certain events -class ScrubbingOverlay final : public wxEvtHandler, public Overlay +class ScrubbingOverlay final + : public wxEvtHandler + , public Overlay + , public ClientData::Base { public: ScrubbingOverlay(AudacityProject *project);