// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using osu.Framework.Allocation; using osu.Framework.Bindables; namespace osu.Game.Screens.OnlinePlay { /// /// Utility class to track ongoing online operations' progress. /// Can be used to disable interactivity while waiting for a response from online sources. /// public class OngoingOperationTracker { /// /// Whether there is an online operation in progress. /// public IBindable InProgress => inProgress; private readonly Bindable inProgress = new BindableBool(); private LeasedBindable leasedInProgress; /// /// Begins tracking a new online operation. /// /// /// An that will automatically mark the operation as ended on disposal. /// /// An operation has already been started. public IDisposable BeginOperation() { if (leasedInProgress != null) throw new InvalidOperationException("Cannot begin operation while another is in progress."); leasedInProgress = inProgress.BeginLease(true); leasedInProgress.Value = true; return new InvokeOnDisposal(endOperation); } /// /// Ends tracking an online operation. /// Does nothing if an operation has not been begun yet. /// private void endOperation() { leasedInProgress?.Return(); leasedInProgress = null; } } }