diff --git a/src/Project.cpp b/src/Project.cpp index f9bf9d073..7389a3449 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -257,6 +257,9 @@ void ScrollBar::SetScrollbar(int position, int thumbSize, { // Mitigate flashing of scrollbars by refreshing only when something really changes. + // PRL: This may have been made unnecessary by other fixes for flashing, see + // commit ac05b190bee7dd0000bce56edb0e5e26185c972f + auto changed = position != GetThumbPosition() || thumbSize != GetThumbSize() || @@ -5366,7 +5369,7 @@ void AudacityProject::PlaybackScroller::OnTimer(wxCommandEvent &event) // Let other listeners get the notification event.Skip(); - if (mActive && mProject->IsAudioActive()) + if (mMode != Mode::Off && mProject->IsAudioActive()) { // Pan the view, so that we center the play indicator. @@ -5375,9 +5378,19 @@ void AudacityProject::PlaybackScroller::OnTimer(wxCommandEvent &event) const int posX = viewInfo.TimeToPosition(viewInfo.mRecentStreamTime); int width; trackPanel->GetTracksUsableArea(&width, NULL); - const int deltaX = posX - width / 2; + int deltaX; + switch (mMode) + { + default: + wxASSERT(false); + /* fallthru */ + case Mode::Centered: + deltaX = posX - width / 2; break; + case Mode::Right: + deltaX = posX - width; break; + } viewInfo.h = - viewInfo.OffsetTimeByPixels(viewInfo.h, deltaX, true); + viewInfo.OffsetTimeByPixels(viewInfo.h, deltaX, true); if (!viewInfo.bScrollBeyondZero) // Can't scroll too far left viewInfo.h = std::max(0.0, viewInfo.h); diff --git a/src/Project.h b/src/Project.h index e7e3d613e..7d9a0aacd 100644 --- a/src/Project.h +++ b/src/Project.h @@ -728,16 +728,23 @@ public: explicit PlaybackScroller(AudacityProject *project); ~PlaybackScroller(); - void Activate(bool active) + enum class Mode { + Off, + Centered, + Right, + }; + + Mode GetMode() const { return mMode; } + void Activate(Mode mode) { - mActive = active; + mMode = mode; } private: void OnTimer(wxCommandEvent &event); AudacityProject *mProject; - bool mActive { false }; + Mode mMode { Mode::Off }; }; std::unique_ptr mPlaybackScroller; diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index 1e11daf4d..a6ea3b54f 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -751,7 +751,8 @@ void ControlToolBar::OnPlay(wxCommandEvent & WXUNUSED(evt)) auto p = GetActiveProject(); if (doubleClicked) - p->GetPlaybackScroller().Activate(true); + p->GetPlaybackScroller().Activate + (AudacityProject::PlaybackScroller::Mode::Centered); else { if (!CanStopAudioStream()) return; @@ -794,7 +795,8 @@ void ControlToolBar::StopPlaying(bool stopStream /* = true*/) AudacityProject *project = GetActiveProject(); if(project) { - project->GetPlaybackScroller().Activate(false); + project->GetPlaybackScroller().Activate + (AudacityProject::PlaybackScroller::Mode::Off); // Let scrubbing code do some appearance change project->GetScrubber().StopScrubbing(); } @@ -855,7 +857,8 @@ void ControlToolBar::OnRecord(wxCommandEvent &evt) mRecord->ClearDoubleClicked(); if (doubleClicked) { - GetActiveProject()->GetPlaybackScroller().Activate(true); + GetActiveProject()->GetPlaybackScroller().Activate + (AudacityProject::PlaybackScroller::Mode::Right); return; } diff --git a/src/toolbars/TranscriptionToolBar.cpp b/src/toolbars/TranscriptionToolBar.cpp index 70ddab4e5..1b6e44165 100644 --- a/src/toolbars/TranscriptionToolBar.cpp +++ b/src/toolbars/TranscriptionToolBar.cpp @@ -480,7 +480,8 @@ void TranscriptionToolBar::OnPlaySpeed(wxCommandEvent & WXUNUSED(event)) button->ClearDoubleClicked(); if (doubleClicked) { - GetActiveProject()->GetPlaybackScroller().Activate(true); + GetActiveProject()->GetPlaybackScroller().Activate + (AudacityProject::PlaybackScroller::Mode::Centered); // Pop up the button SetButton(false, button); diff --git a/src/tracks/ui/PlayIndicatorOverlay.cpp b/src/tracks/ui/PlayIndicatorOverlay.cpp index d20c2f835..b1322cf63 100644 --- a/src/tracks/ui/PlayIndicatorOverlay.cpp +++ b/src/tracks/ui/PlayIndicatorOverlay.cpp @@ -165,9 +165,12 @@ void PlayIndicatorOverlay::OnTimer(wxCommandEvent &event) // BG: Scroll screen if option is set // msmeyer: But only if not playing looped or in one-second mode + // PRL: and not scrolling with play/record head fixed right if (viewInfo.bUpdateTrackIndicator && mProject->mLastPlayMode != PlayMode::loopedPlay && mProject->mLastPlayMode != PlayMode::oneSecondPlay && + mProject->GetPlaybackScroller().GetMode() != + AudacityProject::PlaybackScroller::Mode::Right && playPos >= 0 && !onScreen && !gAudioIO->IsPaused()) diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index 851bca8b8..f93811441 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -331,7 +331,9 @@ bool Scrubber::MaybeStartScrubbing(wxCoord xx) mScrubStartClockTimeMillis = ::wxGetLocalTimeMillis(); if (IsScrubbing()) { - mProject->GetPlaybackScroller().Activate(mSmoothScrollingScrub); + using Mode = AudacityProject::PlaybackScroller::Mode; + mProject->GetPlaybackScroller().Activate + (mSmoothScrollingScrub ? Mode::Centered : Mode::Off); mScrubHasFocus = true; mLastScrubPosition = xx; @@ -423,7 +425,8 @@ void Scrubber::StopScrubbing() UncheckAllMenuItems(); mScrubStartPosition = -1; - mProject->GetPlaybackScroller().Activate(false); + mProject->GetPlaybackScroller().Activate + (AudacityProject::PlaybackScroller::Mode::Off); mDragging = false; if (!IsScrubbing()) @@ -706,7 +709,9 @@ void Scrubber::DoScrub(bool scroll, bool seek) } else if(!match) { mSmoothScrollingScrub = scroll; - mProject->GetPlaybackScroller().Activate(scroll); + using Mode = AudacityProject::PlaybackScroller::Mode; + mProject->GetPlaybackScroller().Activate + (scroll ? Mode::Centered : Mode::Off); mAlwaysSeeking = seek; UncheckAllMenuItems(); CheckMenuItem(); diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 6522843cf..43e1cedf2 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2533,7 +2533,8 @@ void AdornedRulerPanel::OnMouseEvents(wxMouseEvent &evt) void AdornedRulerPanel::HandleQPDoubleClick(wxMouseEvent &evt, wxCoord mousePosX) { - mProject->GetPlaybackScroller().Activate(true); + mProject->GetPlaybackScroller().Activate + (AudacityProject::PlaybackScroller::Mode::Centered); } void AdornedRulerPanel::HandleQPClick(wxMouseEvent &evt, wxCoord mousePosX)