mirror of
https://github.com/cookiengineer/audacity
synced 2025-07-15 16:17:41 +02:00
Reimplement the cursor mark in the ruler as an overlay
This commit is contained in:
parent
3466e91ed1
commit
d8e42b0af4
@ -937,7 +937,7 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
|
||||
}
|
||||
bs->Layout();
|
||||
|
||||
// The right hand side translates to NEW TrackPanel(... in normal
|
||||
// The right hand side translates to NEW TrackPanel(...) in normal
|
||||
// Audacity without additional DLLs.
|
||||
mTrackPanel = TrackPanel::FactoryFunction(pPage,
|
||||
TrackPanelID,
|
||||
|
@ -15,7 +15,6 @@ Paul Licameli split from TrackPanel.cpp
|
||||
#include "../../AColor.h"
|
||||
#include "../../widgets/Ruler.h"
|
||||
#include "../../Project.h"
|
||||
//#include "../../TrackPanel.h"
|
||||
#include "../../TrackPanelCell.h"
|
||||
#include "../../TrackPanelCellIterator.h"
|
||||
#include "../../TrackPanelAx.h"
|
||||
@ -31,8 +30,9 @@ namespace {
|
||||
}
|
||||
}
|
||||
|
||||
EditCursorOverlay::EditCursorOverlay(AudacityProject *project)
|
||||
EditCursorOverlay::EditCursorOverlay(AudacityProject *project, bool isMaster)
|
||||
: mProject(project)
|
||||
, mIsMaster(isMaster)
|
||||
, mLastCursorX(-1)
|
||||
, mCursorTime(-1)
|
||||
, mNewCursorX(-1)
|
||||
@ -41,6 +41,11 @@ EditCursorOverlay::EditCursorOverlay(AudacityProject *project)
|
||||
|
||||
EditCursorOverlay::~EditCursorOverlay()
|
||||
{
|
||||
if (mIsMaster && mPartner) {
|
||||
auto ruler = mProject->GetRulerPanel();
|
||||
if (ruler)
|
||||
ruler->RemoveOverlay(mPartner.get());
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<wxRect, bool> EditCursorOverlay::DoGetRectangle(wxSize size)
|
||||
@ -56,6 +61,7 @@ std::pair<wxRect, bool> EditCursorOverlay::DoGetRectangle(wxSize size)
|
||||
(mCursorTime, mProject->GetTrackPanel()->GetLeftOffset());
|
||||
}
|
||||
|
||||
// Excessive height in case of the ruler, but it matters little.
|
||||
return std::make_pair(
|
||||
mLastCursorX == -1
|
||||
? wxRect()
|
||||
@ -67,9 +73,13 @@ std::pair<wxRect, bool> EditCursorOverlay::DoGetRectangle(wxSize size)
|
||||
|
||||
void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
|
||||
{
|
||||
TrackPanel &tp = static_cast<TrackPanel&>(panel);
|
||||
TrackPanelCellIterator begin(&tp, true);
|
||||
TrackPanelCellIterator end(&tp, false);
|
||||
if (mIsMaster && !mPartner) {
|
||||
auto ruler = mProject->GetRulerPanel();
|
||||
if (ruler) {
|
||||
mPartner = std::make_unique<EditCursorOverlay>(mProject, false);
|
||||
ruler->AddOverlay(mPartner.get());
|
||||
}
|
||||
}
|
||||
|
||||
mLastCursorX = mNewCursorX;
|
||||
if (mLastCursorX == -1)
|
||||
@ -85,7 +95,11 @@ void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
|
||||
if (!onScreen)
|
||||
return;
|
||||
|
||||
if (auto tp = dynamic_cast<TrackPanel*>(&panel)) {
|
||||
wxASSERT(mIsMaster);
|
||||
AColor::CursorColor(&dc);
|
||||
TrackPanelCellIterator begin(tp, true);
|
||||
TrackPanelCellIterator end(tp, false);
|
||||
|
||||
// Draw cursor in all selected tracks
|
||||
for (; begin != end; ++begin)
|
||||
@ -99,7 +113,8 @@ void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
|
||||
{
|
||||
const wxRect &rect = data.second;
|
||||
// AColor::Line includes both endpoints so use GetBottom()
|
||||
AColor::Line(dc, mLastCursorX, rect.GetTop(), mLastCursorX, rect.GetBottom()); // <-- The whole point of this routine.
|
||||
AColor::Line(dc, mLastCursorX, rect.GetTop(), mLastCursorX, rect.GetBottom());
|
||||
// ^^^ The whole point of this routine.
|
||||
|
||||
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY
|
||||
if (MONO_WAVE_PAN(t)){
|
||||
@ -113,9 +128,16 @@ void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc)
|
||||
}
|
||||
}
|
||||
|
||||
// AS: Ah, no, this is where we draw the blinky thing in the ruler.
|
||||
mProject->GetRulerPanel()->Refresh();
|
||||
|
||||
// This updates related displays such as numbers on the status bar
|
||||
mProject->TP_DisplaySelection();
|
||||
}
|
||||
else if (auto ruler = dynamic_cast<AdornedRulerPanel*>(&panel)) {
|
||||
wxASSERT(!mIsMaster);
|
||||
dc.SetPen(*wxBLACK_PEN);
|
||||
// AColor::Line includes both endpoints so use GetBottom()
|
||||
auto rect = ruler->GetInnerRect();
|
||||
AColor::Line(dc, mLastCursorX, rect.GetTop(), mLastCursorX, rect.GetBottom());
|
||||
}
|
||||
else
|
||||
wxASSERT(false);
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ Paul Licameli split from TrackPanel.cpp
|
||||
#ifndef __AUDACITY_EDIT_CURSOR_OVERLAY__
|
||||
#define __AUDACITY_EDIT_CURSOR_OVERLAY__
|
||||
|
||||
#include "../../MemoryX.h"
|
||||
#include "../../widgets/Overlay.h"
|
||||
|
||||
class AudacityProject;
|
||||
@ -18,7 +19,7 @@ class AudacityProject;
|
||||
class EditCursorOverlay final : public Overlay
|
||||
{
|
||||
public:
|
||||
EditCursorOverlay(AudacityProject *project);
|
||||
EditCursorOverlay(AudacityProject *project, bool isMaster = true);
|
||||
virtual ~EditCursorOverlay();
|
||||
|
||||
private:
|
||||
@ -26,6 +27,8 @@ private:
|
||||
void Draw(OverlayPanel &panel, wxDC &dc) override;
|
||||
|
||||
AudacityProject *mProject;
|
||||
bool mIsMaster;
|
||||
std::unique_ptr<EditCursorOverlay> mPartner;
|
||||
|
||||
int mLastCursorX;
|
||||
double mCursorTime;
|
||||
|
@ -2137,11 +2137,6 @@ void AdornedRulerPanel::OnPaint(wxPaintEvent & WXUNUSED(evt))
|
||||
DoDrawIndicator(&backDC, mIndTime, mIndType != 0, IndicatorMediumWidth, false);
|
||||
}
|
||||
|
||||
if (mViewInfo->selectedRegion.isPoint())
|
||||
{
|
||||
DoDrawCursor(&backDC);
|
||||
}
|
||||
|
||||
DoDrawPlayRegion(&backDC);
|
||||
|
||||
DoDrawPushbuttons(&backDC);
|
||||
@ -3471,14 +3466,6 @@ void AdornedRulerPanel::SetLeftOffset(int offset)
|
||||
mRuler.SetUseZoomInfo(offset, mViewInfo);
|
||||
}
|
||||
|
||||
void AdornedRulerPanel::DoDrawCursor(wxDC * dc)
|
||||
{
|
||||
const int x = Time2Pos(mViewInfo->selectedRegion.t0());
|
||||
|
||||
// Draw cursor in ruler
|
||||
dc->DrawLine( x, mInner.y, x, mInner.y + mInner.height );
|
||||
}
|
||||
|
||||
//
|
||||
//This draws the little triangular indicator on the
|
||||
//AdornedRulerPanel.
|
||||
|
@ -295,6 +295,7 @@ public:
|
||||
public:
|
||||
static int GetRulerHeight();
|
||||
static int GetRulerHeight(bool showScrubBar);
|
||||
wxRect GetInnerRect() const { return mInner; }
|
||||
|
||||
void SetLeftOffset(int offset);
|
||||
|
||||
@ -378,7 +379,6 @@ private:
|
||||
void DoDrawBackground(wxDC * dc);
|
||||
void DoDrawEdge(wxDC *dc);
|
||||
void DoDrawMarks(wxDC * dc, bool /*text */ );
|
||||
void DoDrawCursor(wxDC * dc);
|
||||
void DoDrawSelection(wxDC * dc);
|
||||
void DoDrawIndicator(wxDC * dc, double time, bool playing, int width, bool scrub);
|
||||
void DoEraseIndicator(wxDC *dc, int x);
|
||||
|
Loading…
x
Reference in New Issue
Block a user