diff --git a/src/Project.cpp b/src/Project.cpp index 2f0fbe9d6..02e85036c 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -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, diff --git a/src/tracks/ui/EditCursorOverlay.cpp b/src/tracks/ui/EditCursorOverlay.cpp index 2474ef10b..1bee3bdb0 100644 --- a/src/tracks/ui/EditCursorOverlay.cpp +++ b/src/tracks/ui/EditCursorOverlay.cpp @@ -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 EditCursorOverlay::DoGetRectangle(wxSize size) @@ -56,6 +61,7 @@ std::pair 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 EditCursorOverlay::DoGetRectangle(wxSize size) void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc) { - TrackPanel &tp = static_cast(panel); - TrackPanelCellIterator begin(&tp, true); - TrackPanelCellIterator end(&tp, false); + if (mIsMaster && !mPartner) { + auto ruler = mProject->GetRulerPanel(); + if (ruler) { + mPartner = std::make_unique(mProject, false); + ruler->AddOverlay(mPartner.get()); + } + } mLastCursorX = mNewCursorX; if (mLastCursorX == -1) @@ -78,44 +88,56 @@ void EditCursorOverlay::Draw(OverlayPanel &panel, wxDC &dc) const ZoomInfo &viewInfo = mProject->GetZoomInfo(); const bool - onScreen = between_incexc(viewInfo.h, - mCursorTime, - mProject->GetScreenEndTime()); + onScreen = between_incexc(viewInfo.h, + mCursorTime, + mProject->GetScreenEndTime()); if (!onScreen) return; - AColor::CursorColor(&dc); + if (auto tp = dynamic_cast(&panel)) { + wxASSERT(mIsMaster); + AColor::CursorColor(&dc); + TrackPanelCellIterator begin(tp, true); + TrackPanelCellIterator end(tp, false); - // Draw cursor in all selected tracks - for (; begin != end; ++begin) - { - TrackPanelCellIterator::value_type data(*begin); - Track *const pTrack = data.first; - if (!pTrack) - continue; - if (pTrack->GetSelected() || - mProject->GetTrackPanel()->GetAx().IsFocused(pTrack)) + // Draw cursor in all selected tracks + for (; begin != end; ++begin) { - 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. + TrackPanelCellIterator::value_type data(*begin); + Track *const pTrack = data.first; + if (!pTrack) + continue; + if (pTrack->GetSelected() || + mProject->GetTrackPanel()->GetAx().IsFocused(pTrack)) + { + 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. #ifdef EXPERIMENTAL_OUTPUT_DISPLAY - if (MONO_WAVE_PAN(t)){ - y = t->GetY(true) - mViewInfo->vpos + 1; - top = y + kTopInset; - bottom = y + t->GetHeight(true) - kTopInset; - AColor::Line(dc, mLastCursorX, top, mLastCursorX, bottom); - } + if (MONO_WAVE_PAN(t)){ + y = t->GetY(true) - mViewInfo->vpos + 1; + top = y + kTopInset; + bottom = y + t->GetHeight(true) - kTopInset; + AColor::Line(dc, mLastCursorX, top, mLastCursorX, bottom); + } #endif + } } + + // This updates related displays such as numbers on the status bar + mProject->TP_DisplaySelection(); } - - // 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(&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); } diff --git a/src/tracks/ui/EditCursorOverlay.h b/src/tracks/ui/EditCursorOverlay.h index 7819cab08..65dad676e 100644 --- a/src/tracks/ui/EditCursorOverlay.h +++ b/src/tracks/ui/EditCursorOverlay.h @@ -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 mPartner; int mLastCursorX; double mCursorTime; diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 72220a05f..0068ef64a 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -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. diff --git a/src/widgets/Ruler.h b/src/widgets/Ruler.h index 12a6b35d3..f65185a03 100644 --- a/src/widgets/Ruler.h +++ b/src/widgets/Ruler.h @@ -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);