1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-14 20:32:55 +08:00

Move delegate debounce logic to Editor itself

This commit is contained in:
Dean Herbert 2022-08-17 14:04:55 +09:00
parent ea50936d71
commit 8ce50e98a6
2 changed files with 28 additions and 17 deletions

View File

@ -24,6 +24,7 @@ using osu.Framework.Logging;
using osu.Framework.Platform;
using osu.Framework.Screens;
using osu.Framework.Testing;
using osu.Framework.Threading;
using osu.Framework.Timing;
using osu.Game.Audio;
using osu.Game.Beatmaps;
@ -231,6 +232,8 @@ namespace osu.Game.Screens.Edit
AddInternal(editorBeatmap = new EditorBeatmap(playableBeatmap, loadableBeatmap.GetSkin(), loadableBeatmap.BeatmapInfo));
dependencies.CacheAs(editorBeatmap);
editorBeatmap.UpdateInProgress.BindValueChanged(updateInProgress);
canSave = editorBeatmap.BeatmapInfo.Ruleset.CreateInstance() is ILegacyRuleset;
if (canSave)
@ -431,7 +434,7 @@ namespace osu.Game.Screens.Edit
samplePlaybackDisabled.Value = clock.SeekingOrStopped.Value
|| currentScreen is not ComposeScreen
|| editorBeatmap.UpdateInProgress;
|| temporaryMuteFromUpdateInProgress;
}
public bool OnPressed(KeyBindingPressEvent<PlatformAction> e)
@ -717,6 +720,22 @@ namespace osu.Game.Screens.Edit
this.Exit();
}
#region Mute from update application
private ScheduledDelegate temporaryMuteRestorationDelegate;
private bool temporaryMuteFromUpdateInProgress;
private void updateInProgress(ValueChangedEvent<bool> obj)
{
temporaryMuteFromUpdateInProgress = true;
// Debounce is arbitrarily high enough to avoid flip-flopping the value each other frame.
temporaryMuteRestorationDelegate?.Cancel();
temporaryMuteRestorationDelegate = Scheduler.AddDelayed(() => temporaryMuteFromUpdateInProgress = false, 50);
}
#endregion
#region Clipboard support
private EditorMenuItem cutMenuItem;

View File

@ -10,7 +10,6 @@ using System.Linq;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Threading;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Beatmaps.Legacy;
@ -24,13 +23,15 @@ namespace osu.Game.Screens.Edit
public class EditorBeatmap : TransactionalCommitComponent, IBeatmap, IBeatSnapProvider
{
/// <summary>
/// While performing updates on hitobjects, this will momentarily become true.
/// Will become <c>true</c> when a new update is queued, and <c>false</c> when all updates have been applied.
/// </summary>
/// <remarks>
/// This is intended to be used to avoid performing operations (like playback of samples)
/// while mutating hitobjects.
/// </remarks>
public bool UpdateInProgress { get; private set; }
public IBindable<bool> UpdateInProgress => updateInProgress;
private readonly BindableBool updateInProgress = new BindableBool();
/// <summary>
/// Invoked when a <see cref="HitObject"/> is added to this <see cref="EditorBeatmap"/>.
@ -236,11 +237,9 @@ namespace osu.Game.Screens.Edit
// updates are debounced regardless of whether a batch is active.
batchPendingUpdates.Add(hitObject);
advertiseUpdateInProgress();
updateInProgress.Value = true;
}
private ScheduledDelegate updateCompleteDelegate;
/// <summary>
/// Update all hit objects with potentially changed difficulty or control point data.
/// </summary>
@ -249,7 +248,7 @@ namespace osu.Game.Screens.Edit
foreach (var h in HitObjects)
batchPendingUpdates.Add(h);
advertiseUpdateInProgress();
updateInProgress.Value = true;
}
/// <summary>
@ -342,6 +341,8 @@ namespace osu.Game.Screens.Edit
foreach (var h in deletes) HitObjectRemoved?.Invoke(h);
foreach (var h in inserts) HitObjectAdded?.Invoke(h);
foreach (var h in updates) HitObjectUpdated?.Invoke(h);
updateInProgress.Value = false;
}
/// <summary>
@ -349,15 +350,6 @@ namespace osu.Game.Screens.Edit
/// </summary>
public void Clear() => RemoveRange(HitObjects.ToArray());
private void advertiseUpdateInProgress()
{
UpdateInProgress = true;
// Debounce is arbitrarily high enough to avoid flip-flopping the value each other frame.
updateCompleteDelegate?.Cancel();
updateCompleteDelegate = Scheduler.AddDelayed(() => UpdateInProgress = false, 50);
}
private void processHitObject(HitObject hitObject) => hitObject.ApplyDefaults(ControlPointInfo, PlayableBeatmap.Difficulty);
private void trackStartTime(HitObject hitObject)