CooldownWindowDelayer.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using UnityEditor;
  3. namespace Unity.PlasticSCM.Editor.UI
  4. {
  5. internal class CooldownWindowDelayer
  6. {
  7. internal CooldownWindowDelayer(Action action, double cooldownSeconds)
  8. {
  9. mAction = action;
  10. mCooldownSeconds = cooldownSeconds;
  11. }
  12. internal void Ping()
  13. {
  14. if (mIsOnCooldown)
  15. {
  16. RefreshCooldown();
  17. return;
  18. }
  19. StartCooldown();
  20. }
  21. void RefreshCooldown()
  22. {
  23. mIsOnCooldown = true;
  24. mSecondsOnCooldown = mCooldownSeconds;
  25. }
  26. void StartCooldown()
  27. {
  28. mLastUpdateTime = EditorApplication.timeSinceStartup;
  29. EditorApplication.update += OnUpdate;
  30. RefreshCooldown();
  31. }
  32. void EndCooldown()
  33. {
  34. EditorApplication.update -= OnUpdate;
  35. mIsOnCooldown = false;
  36. mAction();
  37. }
  38. void OnUpdate()
  39. {
  40. double updateTime = EditorApplication.timeSinceStartup;
  41. double deltaSeconds = updateTime - mLastUpdateTime;
  42. mSecondsOnCooldown -= deltaSeconds;
  43. if (mSecondsOnCooldown < 0)
  44. EndCooldown();
  45. mLastUpdateTime = updateTime;
  46. }
  47. readonly Action mAction;
  48. readonly double mCooldownSeconds;
  49. double mLastUpdateTime;
  50. bool mIsOnCooldown;
  51. double mSecondsOnCooldown;
  52. }
  53. }