ProgressControlsForDialogs.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using PlasticGui;
  5. namespace Unity.PlasticSCM.Editor.UI.Progress
  6. {
  7. class ProgressControlsForDialogs : IProgressControls
  8. {
  9. internal class Data
  10. {
  11. internal bool IsWaitingAsyncResult;
  12. internal float ProgressPercent;
  13. internal string ProgressMessage;
  14. internal MessageType StatusType;
  15. internal string StatusMessage;
  16. internal void CopyInto(Data other)
  17. {
  18. other.IsWaitingAsyncResult = IsWaitingAsyncResult;
  19. other.ProgressPercent = ProgressPercent;
  20. other.ProgressMessage = ProgressMessage;
  21. other.StatusType = StatusType;
  22. other.StatusMessage = StatusMessage;
  23. }
  24. }
  25. internal Data ProgressData { get { return mData; } }
  26. internal void ForcedUpdateProgress(EditorWindow dialog)
  27. {
  28. double updateTime;
  29. float progressPercent;
  30. GetUpdateProgress(
  31. mLastUpdateTime, mData.ProgressPercent,
  32. out updateTime, out progressPercent);
  33. mLastUpdateTime = updateTime;
  34. if (!mData.IsWaitingAsyncResult)
  35. return;
  36. mData.ProgressPercent = progressPercent;
  37. if (Event.current.type == EventType.Repaint)
  38. dialog.Repaint();
  39. }
  40. void IProgressControls.HideProgress()
  41. {
  42. mData.IsWaitingAsyncResult = false;
  43. mData.ProgressMessage = string.Empty;
  44. }
  45. void IProgressControls.ShowProgress(string message)
  46. {
  47. CleanStatusMessage(mData);
  48. mData.IsWaitingAsyncResult = true;
  49. mData.ProgressPercent = 0f;
  50. mData.ProgressMessage = message;
  51. }
  52. void IProgressControls.ShowError(string message)
  53. {
  54. mData.StatusMessage = message;
  55. mData.StatusType = MessageType.Error;
  56. }
  57. void IProgressControls.ShowNotification(string message)
  58. {
  59. mData.StatusMessage = message;
  60. mData.StatusType = MessageType.Info;
  61. }
  62. void IProgressControls.ShowSuccess(string message)
  63. {
  64. mData.StatusMessage = message;
  65. mData.StatusType = MessageType.Info;
  66. }
  67. void IProgressControls.ShowWarning(string message)
  68. {
  69. mData.StatusMessage = message;
  70. mData.StatusType = MessageType.Warning;
  71. }
  72. static void CleanStatusMessage(Data data)
  73. {
  74. data.StatusMessage = string.Empty;
  75. data.StatusType = MessageType.None;
  76. }
  77. static void GetUpdateProgress(
  78. double lastUpdateTime, float lastProgressPercent,
  79. out double updateTime, out float progressPercent)
  80. {
  81. updateTime = EditorApplication.timeSinceStartup;
  82. double deltaTime = Math.Min(0.1, updateTime - lastUpdateTime);
  83. double deltaPercent = (deltaTime / 0.1) * PERCENT_PER_SECONDS;
  84. progressPercent = Mathf.Repeat(
  85. lastProgressPercent + (float)deltaPercent, 1f);
  86. }
  87. double mLastUpdateTime = 0.0;
  88. Data mData = new Data();
  89. const double PERCENT_PER_SECONDS = 0.06;
  90. }
  91. }