From 227fb315ea20e19b190ff41164b445e6c11b3685 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 28 Apr 2019 06:33:27 -0400 Subject: [PATCH] Drawing sequence for overlays independent of insertion call sequence --- src/AdornedRulerPanel.cpp | 15 +++++++++++++++ src/Project.cpp | 2 +- src/tracks/ui/EditCursorOverlay.cpp | 5 +++++ src/tracks/ui/EditCursorOverlay.h | 1 + src/tracks/ui/PlayIndicatorOverlay.cpp | 5 +++++ src/tracks/ui/PlayIndicatorOverlay.h | 1 + src/tracks/ui/Scrubbing.cpp | 5 +++++ src/tracks/ui/Scrubbing.h | 1 + src/widgets/Overlay.h | 4 ++++ src/widgets/OverlayPanel.cpp | 11 ++++++++++- src/widgets/OverlayPanel.h | 4 +++- 11 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/AdornedRulerPanel.cpp b/src/AdornedRulerPanel.cpp index 43987e3e1..b0393dd52 100644 --- a/src/AdornedRulerPanel.cpp +++ b/src/AdornedRulerPanel.cpp @@ -130,6 +130,8 @@ public: private: AdornedRulerPanel *GetRuler() const; + unsigned SequenceNumber() const override; + std::pair DoGetRectangle(wxSize size) override; void Draw(OverlayPanel &panel, wxDC &dc) override; @@ -159,6 +161,7 @@ public: QuickPlayIndicatorOverlay(AudacityProject *project); private: + unsigned SequenceNumber() const override; std::pair DoGetRectangle(wxSize size) override; void Draw(OverlayPanel &panel, wxDC &dc) override; @@ -229,6 +232,12 @@ void AdornedRulerPanel::QuickPlayRulerOverlay::Update() } } +unsigned +AdornedRulerPanel::QuickPlayRulerOverlay::SequenceNumber() const +{ + return 30; +} + std::pair AdornedRulerPanel::QuickPlayRulerOverlay::DoGetRectangle(wxSize /*size*/) { @@ -284,6 +293,12 @@ AdornedRulerPanel::QuickPlayIndicatorOverlay::QuickPlayIndicatorOverlay( { } +unsigned +AdornedRulerPanel::QuickPlayIndicatorOverlay::SequenceNumber() const +{ + return 30; +} + std::pair AdornedRulerPanel::QuickPlayIndicatorOverlay::DoGetRectangle(wxSize size) { diff --git a/src/Project.cpp b/src/Project.cpp index 97e27a606..bd0f491b1 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -1310,7 +1310,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id, &ViewInfo::OnTimer, &mViewInfo); - // Add the overlays, in the sequence in which they will be painted + // Add the overlays mTrackPanel->AddOverlay( mIndicatorOverlay ); mTrackPanel->AddOverlay( mCursorOverlay ); #ifdef EXPERIMENTAL_SCRUBBING_BASIC diff --git a/src/tracks/ui/EditCursorOverlay.cpp b/src/tracks/ui/EditCursorOverlay.cpp index d6fc4b714..b40de12ac 100644 --- a/src/tracks/ui/EditCursorOverlay.cpp +++ b/src/tracks/ui/EditCursorOverlay.cpp @@ -36,6 +36,11 @@ EditCursorOverlay::EditCursorOverlay(AudacityProject *project, bool isMaster) { } +unsigned EditCursorOverlay::SequenceNumber() const +{ + return 20; +} + std::pair EditCursorOverlay::DoGetRectangle(wxSize size) { const auto &selection = mProject->GetViewInfo().selectedRegion; diff --git a/src/tracks/ui/EditCursorOverlay.h b/src/tracks/ui/EditCursorOverlay.h index 2a7115562..afa46c51d 100644 --- a/src/tracks/ui/EditCursorOverlay.h +++ b/src/tracks/ui/EditCursorOverlay.h @@ -22,6 +22,7 @@ public: EditCursorOverlay(AudacityProject *project, bool isMaster = true); private: + unsigned SequenceNumber() const override; std::pair DoGetRectangle(wxSize size) override; void Draw(OverlayPanel &panel, wxDC &dc) override; diff --git a/src/tracks/ui/PlayIndicatorOverlay.cpp b/src/tracks/ui/PlayIndicatorOverlay.cpp index 1b99d0c9f..ff96f69d4 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.cpp +++ b/src/tracks/ui/PlayIndicatorOverlay.cpp @@ -42,6 +42,11 @@ PlayIndicatorOverlayBase::~PlayIndicatorOverlayBase() { } +unsigned PlayIndicatorOverlayBase::SequenceNumber() const +{ + return 10; +} + std::pair PlayIndicatorOverlayBase::DoGetRectangle(wxSize size) { auto width = mIsMaster ? 1 : IndicatorMediumWidth; diff --git a/src/tracks/ui/PlayIndicatorOverlay.h b/src/tracks/ui/PlayIndicatorOverlay.h index 729b9e662..8129f1b63 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.h +++ b/src/tracks/ui/PlayIndicatorOverlay.h @@ -28,6 +28,7 @@ public: void Update(int newIndicatorX) { mNewIndicatorX = newIndicatorX; } private: + unsigned SequenceNumber() const override; std::pair DoGetRectangle(wxSize size) override; void Draw(OverlayPanel &panel, wxDC &dc) override; diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index 2a2e1c059..d4d29abab 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -886,6 +886,11 @@ ScrubbingOverlay::ScrubbingOverlay(AudacityProject *project) this); } +unsigned ScrubbingOverlay::SequenceNumber() const +{ + return 40; +} + std::pair ScrubbingOverlay::DoGetRectangle(wxSize) { wxRect rect(mLastScrubRect); diff --git a/src/tracks/ui/Scrubbing.h b/src/tracks/ui/Scrubbing.h index 6f95b6564..4845c76f9 100644 --- a/src/tracks/ui/Scrubbing.h +++ b/src/tracks/ui/Scrubbing.h @@ -216,6 +216,7 @@ public: ScrubbingOverlay(AudacityProject *project); private: + unsigned SequenceNumber() const override; std::pair DoGetRectangle(wxSize size) override; void Draw(OverlayPanel &panel, wxDC &dc) override; diff --git a/src/widgets/Overlay.h b/src/widgets/Overlay.h index 914c28027..ba4f5f16d 100644 --- a/src/widgets/Overlay.h +++ b/src/widgets/Overlay.h @@ -93,6 +93,10 @@ class Overlay public: virtual ~Overlay() = 0; + ///\brief This number determines an ordering of overlays, so that those + /// with higher numbers overpaint those with lower numbers that intersect + virtual unsigned SequenceNumber() const = 0; + // nonvirtual wrapper std::pair GetRectangle(wxSize size); diff --git a/src/widgets/OverlayPanel.cpp b/src/widgets/OverlayPanel.cpp index 6235ea44b..c367ed48b 100644 --- a/src/widgets/OverlayPanel.cpp +++ b/src/widgets/OverlayPanel.cpp @@ -23,7 +23,16 @@ OverlayPanel::OverlayPanel(wxWindow * parent, wxWindowID id, void OverlayPanel::AddOverlay( const std::weak_ptr &pOverlay) { - mOverlays.push_back(pOverlay); + if (pOverlay.expired()) + return; + Compress(); + auto iter = std::lower_bound( mOverlays.begin(), mOverlays.end(), + pOverlay.lock()->SequenceNumber(), + []( const OverlayPtr &p, unsigned value ) { + return p.expired() || p.lock()->SequenceNumber() < value; + } + ); + mOverlays.insert(iter, pOverlay); } void OverlayPanel::ClearOverlays() diff --git a/src/widgets/OverlayPanel.h b/src/widgets/OverlayPanel.h index 93d4cae9d..e2ee3bdfa 100644 --- a/src/widgets/OverlayPanel.h +++ b/src/widgets/OverlayPanel.h @@ -40,8 +40,10 @@ public: void DrawOverlays(bool repaint_all, wxDC *pDC = nullptr); private: + using OverlayPtr = std::weak_ptr; + void Compress(); - std::vector< std::weak_ptr > mOverlays; + std::vector< OverlayPtr > mOverlays; DECLARE_EVENT_TABLE()