1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-02 16:49:41 +02:00

Drawing sequence for overlays independent of insertion call sequence

This commit is contained in:
Paul Licameli 2019-04-28 06:33:27 -04:00
parent f123ea5faa
commit 227fb315ea
11 changed files with 51 additions and 3 deletions

View File

@ -130,6 +130,8 @@ public:
private:
AdornedRulerPanel *GetRuler() const;
unsigned SequenceNumber() const override;
std::pair<wxRect, bool> 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<wxRect, bool> 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<wxRect, bool>
AdornedRulerPanel::QuickPlayRulerOverlay::DoGetRectangle(wxSize /*size*/)
{
@ -284,6 +293,12 @@ AdornedRulerPanel::QuickPlayIndicatorOverlay::QuickPlayIndicatorOverlay(
{
}
unsigned
AdornedRulerPanel::QuickPlayIndicatorOverlay::SequenceNumber() const
{
return 30;
}
std::pair<wxRect, bool>
AdornedRulerPanel::QuickPlayIndicatorOverlay::DoGetRectangle(wxSize size)
{

View File

@ -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

View File

@ -36,6 +36,11 @@ EditCursorOverlay::EditCursorOverlay(AudacityProject *project, bool isMaster)
{
}
unsigned EditCursorOverlay::SequenceNumber() const
{
return 20;
}
std::pair<wxRect, bool> EditCursorOverlay::DoGetRectangle(wxSize size)
{
const auto &selection = mProject->GetViewInfo().selectedRegion;

View File

@ -22,6 +22,7 @@ public:
EditCursorOverlay(AudacityProject *project, bool isMaster = true);
private:
unsigned SequenceNumber() const override;
std::pair<wxRect, bool> DoGetRectangle(wxSize size) override;
void Draw(OverlayPanel &panel, wxDC &dc) override;

View File

@ -42,6 +42,11 @@ PlayIndicatorOverlayBase::~PlayIndicatorOverlayBase()
{
}
unsigned PlayIndicatorOverlayBase::SequenceNumber() const
{
return 10;
}
std::pair<wxRect, bool> PlayIndicatorOverlayBase::DoGetRectangle(wxSize size)
{
auto width = mIsMaster ? 1 : IndicatorMediumWidth;

View File

@ -28,6 +28,7 @@ public:
void Update(int newIndicatorX) { mNewIndicatorX = newIndicatorX; }
private:
unsigned SequenceNumber() const override;
std::pair<wxRect, bool> DoGetRectangle(wxSize size) override;
void Draw(OverlayPanel &panel, wxDC &dc) override;

View File

@ -886,6 +886,11 @@ ScrubbingOverlay::ScrubbingOverlay(AudacityProject *project)
this);
}
unsigned ScrubbingOverlay::SequenceNumber() const
{
return 40;
}
std::pair<wxRect, bool> ScrubbingOverlay::DoGetRectangle(wxSize)
{
wxRect rect(mLastScrubRect);

View File

@ -216,6 +216,7 @@ public:
ScrubbingOverlay(AudacityProject *project);
private:
unsigned SequenceNumber() const override;
std::pair<wxRect, bool> DoGetRectangle(wxSize size) override;
void Draw(OverlayPanel &panel, wxDC &dc) override;

View File

@ -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<wxRect, bool> GetRectangle(wxSize size);

View File

@ -23,7 +23,16 @@ OverlayPanel::OverlayPanel(wxWindow * parent, wxWindowID id,
void OverlayPanel::AddOverlay( const std::weak_ptr<Overlay> &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()

View File

@ -40,8 +40,10 @@ public:
void DrawOverlays(bool repaint_all, wxDC *pDC = nullptr);
private:
using OverlayPtr = std::weak_ptr<Overlay>;
void Compress();
std::vector< std::weak_ptr<Overlay> > mOverlays;
std::vector< OverlayPtr > mOverlays;
DECLARE_EVENT_TABLE()