153{
154
159 }
160
162 auto width = viewInfo.GetTracksUsableWidth();
163
168 if (scrubber.HasMark()) {
169 auto position = scrubber.GetScrubStartPosition();
170 const auto offset = viewInfo.GetLeftOffset();
171 if(position >= viewInfo.GetLeftOffset() &&
172 position < offset + width)
174 }
175 }
176 else {
179 auto &scroller = window.GetPlaybackScroller();
180
181 const double playPos = scroller.GetRecentStreamTime();
182
184 const Mode mode = scroller.GetMode();
185 const bool pinned = ( mode == Mode::Pinned || mode == Mode::Right );
186
187
188
189 const auto tolerance = pinned
191 : 0;
192 bool onScreen = playPos >= 0.0 &&
194 playPos,
195 viewInfo.GetScreenEndTime() + tolerance);
196
199
200
201 if( viewInfo.bUpdateTrackIndicator &&
202 playPos >= 0 && !onScreen ) {
203
204
206 if (!pinned &&
208 !gAudioIO->IsPaused() &&
209
210
211
212
213 (!scrubber.IsScrubbing() || !scrubber.IsPaused())
214 )
215 {
216 auto newPos = playPos;
217 if (playPos < viewInfo.hpos) {
218
219
220
221
222 newPos = viewInfo.OffsetTimeByPixels( newPos, -width );
223 newPos = std::max(newPos, viewport.ScrollingLowerBoundTime());
224 }
225 viewport.SetHorizontalThumb(newPos);
226
227 onScreen = playPos >= 0.0 &&
229 playPos,
230 viewInfo.GetScreenEndTime());
231 }
232 }
233
234
235
236
237 viewport.UpdateScrollbarsForTracks();
238
239 if (onScreen)
241 viewInfo.TimeToPosition(playPos, viewInfo.GetLeftOffset());
242 else
244
246 }
247
250}
constexpr auto kTimerInterval
static AdornedRulerPanel & Get(AudacityProject &project)
std::shared_ptr< PlayIndicatorOverlayBase > mPartner
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
static ProjectAudioManager & Get(AudacityProject &project)
PlayMode GetLastPlayMode() const
static Scrubber & Get(AudacityProject &project)
static ViewInfo & Get(AudacityProject &project)
static Viewport & Get(AudacityProject &project)
bool between_incexc(LOW l, MID m, HIGH h)