1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 16:52:54 +08:00

Expose and consume boolean covering whether an ongoing smooth seek is running

This commit is contained in:
Dean Herbert 2021-01-15 16:14:38 +09:00
parent 04fa32bc34
commit 831c06a3c7
2 changed files with 15 additions and 6 deletions

View File

@ -146,12 +146,14 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
seekTrackToCurrent();
else if (!editorClock.IsRunning)
{
// The track isn't running. There are two cases we have to be wary of:
// 1) The user flick-drags on this timeline: We want the track to follow us
// 2) The user changes the track time through some other means (scrolling in the editor or overview timeline): We want to follow the track time
// The track isn't running. There are three cases we have to be wary of:
// 1) The user flick-drags on this timeline and we are applying an interpolated seek on the clock, until interrupted by 2 or 3.
// 2) The user changes the track time through some other means (scrolling in the editor or overview timeline; clicking a hitobject etc.). We want the timeline to track the clock's time.
// 3) An ongoing seek transform is running from an external seek. We want the timeline to track the clock's time.
// The simplest way to cover both cases is by checking whether the scroll position has changed and the audio hasn't been changed externally
if (Current != lastScrollPosition && editorClock.CurrentTime == lastTrackTime)
// Checking IsSeeking covers the third case, where the transform may not have been applied yet.
if (Current != lastScrollPosition && editorClock.CurrentTime == lastTrackTime && !editorClock.IsSeeking)
seekTrackToCurrent();
else
scrollToTrackTime();

View File

@ -35,6 +35,11 @@ namespace osu.Game.Screens.Edit
private readonly Bindable<bool> seekingOrStopped = new Bindable<bool>(true);
/// <summary>
/// Whether a seek is currently in progress. True for the duration of a seek performed via <see cref="SeekSmoothlyTo"/>.
/// </summary>
public bool IsSeeking { get; private set; }
public EditorClock(WorkingBeatmap beatmap, BindableBeatDivisor beatDivisor)
: this(beatmap.Beatmap.ControlPointInfo, beatmap.Track.Length, beatDivisor)
{
@ -176,7 +181,7 @@ namespace osu.Game.Screens.Edit
public bool Seek(double position)
{
seekingOrStopped.Value = true;
seekingOrStopped.Value = IsSeeking = true;
ClearTransforms();
return underlyingClock.Seek(position);
@ -246,6 +251,8 @@ namespace osu.Game.Screens.Edit
{
if (seekingOrStopped.Value)
{
IsSeeking &= Transforms.Any();
if (track.Value?.IsRunning != true)
{
// seeking in the editor can happen while the track isn't running.
@ -256,7 +263,7 @@ namespace osu.Game.Screens.Edit
// we are either running a seek tween or doing an immediate seek.
// in the case of an immediate seek the seeking bool will be set to false after one update.
// this allows for silencing hit sounds and the likes.
seekingOrStopped.Value = Transforms.Any();
seekingOrStopped.Value = IsSeeking;
}
}