using System; using UnityEditor; namespace Unity.PlasticSCM.Editor.UI { internal class DelayedActionBySecondsRunner { internal static bool IsUnitTesting { get; set; } internal bool IsRunning { get { return mIsOnDelay; } } internal DelayedActionBySecondsRunner(Action action, double delaySeconds) { mAction = action; mDelaySeconds = delaySeconds; } internal void Run() { if (IsUnitTesting) { mAction(); return; } if (mIsOnDelay) { RefreshDelay(); return; } StartDelay(); } internal void Pause() { mIsPaused = true; } internal void Resume() { if (!mIsPaused) return; mIsPaused = false; mLastUpdateTime = EditorApplication.timeSinceStartup; } void RefreshDelay() { mIsOnDelay = true; mSecondsOnDelay = mDelaySeconds; } void StartDelay() { mLastUpdateTime = EditorApplication.timeSinceStartup; EditorApplication.update += OnUpdate; RefreshDelay(); } void EndDelay() { EditorApplication.update -= OnUpdate; mIsOnDelay = false; mAction(); } void OnUpdate() { if (mIsPaused) return; double updateTime = EditorApplication.timeSinceStartup; double deltaSeconds = updateTime - mLastUpdateTime; mSecondsOnDelay -= deltaSeconds; if (mSecondsOnDelay < 0) EndDelay(); mLastUpdateTime = updateTime; } bool mIsOnDelay; bool mIsPaused; double mLastUpdateTime; double mSecondsOnDelay; readonly double mDelaySeconds; readonly Action mAction; } }