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:
parent
f123ea5faa
commit
227fb315ea
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user