80 lines
1.7 KiB
C#
80 lines
1.7 KiB
C#
|
using System;
|
|||
|
|
|||
|
using UnityEditor;
|
|||
|
|
|||
|
namespace Unity.PlasticSCM.Editor.UI
|
|||
|
{
|
|||
|
internal class CooldownWindowDelayer
|
|||
|
{
|
|||
|
internal static bool IsUnitTesting { get; set; }
|
|||
|
|
|||
|
internal CooldownWindowDelayer(Action action, double cooldownSeconds)
|
|||
|
{
|
|||
|
mAction = action;
|
|||
|
mCooldownSeconds = cooldownSeconds;
|
|||
|
}
|
|||
|
|
|||
|
internal void Ping()
|
|||
|
{
|
|||
|
if (IsUnitTesting)
|
|||
|
{
|
|||
|
mAction();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (mIsOnCooldown)
|
|||
|
{
|
|||
|
RefreshCooldown();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
StartCooldown();
|
|||
|
}
|
|||
|
|
|||
|
void RefreshCooldown()
|
|||
|
{
|
|||
|
mIsOnCooldown = true;
|
|||
|
|
|||
|
mSecondsOnCooldown = mCooldownSeconds;
|
|||
|
}
|
|||
|
|
|||
|
void StartCooldown()
|
|||
|
{
|
|||
|
mLastUpdateTime = EditorApplication.timeSinceStartup;
|
|||
|
|
|||
|
EditorApplication.update += OnUpdate;
|
|||
|
|
|||
|
RefreshCooldown();
|
|||
|
}
|
|||
|
|
|||
|
void EndCooldown()
|
|||
|
{
|
|||
|
EditorApplication.update -= OnUpdate;
|
|||
|
|
|||
|
mIsOnCooldown = false;
|
|||
|
|
|||
|
mAction();
|
|||
|
}
|
|||
|
|
|||
|
void OnUpdate()
|
|||
|
{
|
|||
|
double updateTime = EditorApplication.timeSinceStartup;
|
|||
|
double deltaSeconds = updateTime - mLastUpdateTime;
|
|||
|
|
|||
|
mSecondsOnCooldown -= deltaSeconds;
|
|||
|
|
|||
|
if (mSecondsOnCooldown < 0)
|
|||
|
EndCooldown();
|
|||
|
|
|||
|
mLastUpdateTime = updateTime;
|
|||
|
}
|
|||
|
|
|||
|
readonly Action mAction;
|
|||
|
readonly double mCooldownSeconds;
|
|||
|
|
|||
|
double mLastUpdateTime;
|
|||
|
bool mIsOnCooldown;
|
|||
|
double mSecondsOnCooldown;
|
|||
|
}
|
|||
|
}
|