A game about forced loneliness, made by TACStudios
1using System;
2
3using UnityEditor;
4using UnityEngine;
5
6using Codice.Client.Common.Authentication;
7using PlasticGui;
8
9namespace Unity.PlasticSCM.Editor.UI.Progress
10{
11 class ProgressControlsForDialogs : IProgressControls, IAuthenticationProgressControls
12 {
13 internal class Data
14 {
15 internal bool IsWaitingAsyncResult;
16 internal float ProgressPercent;
17 internal string ProgressMessage;
18
19 internal MessageType StatusType;
20 internal string StatusMessage;
21
22 internal void CopyInto(Data other)
23 {
24 other.IsWaitingAsyncResult = IsWaitingAsyncResult;
25 other.ProgressPercent = ProgressPercent;
26 other.ProgressMessage = ProgressMessage;
27 other.StatusType = StatusType;
28 other.StatusMessage = StatusMessage;
29 }
30 }
31
32 internal Data ProgressData { get { return mData; } }
33
34 internal void ForcedUpdateProgress(EditorWindow dialog)
35 {
36 double updateTime;
37 float progressPercent;
38 GetUpdateProgress(
39 mLastUpdateTime, mData.ProgressPercent,
40 out updateTime, out progressPercent);
41
42 mLastUpdateTime = updateTime;
43
44 if (!mData.IsWaitingAsyncResult)
45 return;
46
47 mData.ProgressPercent = progressPercent;
48
49 if (Event.current.type == EventType.Repaint)
50 dialog.Repaint();
51 }
52
53 void IProgressControls.HideProgress()
54 {
55 InternalHideProgress();
56 }
57
58 void IAuthenticationProgressControls.HideProgress()
59 {
60 InternalHideProgress();
61 }
62
63 void InternalHideProgress()
64 {
65 mData.IsWaitingAsyncResult = false;
66 mData.ProgressMessage = string.Empty;
67 }
68
69 void IProgressControls.ShowProgress(string message)
70 {
71 InternalShowProgress(message);
72 }
73
74 void IAuthenticationProgressControls.ShowProgress(string message)
75 {
76 InternalShowProgress(message);
77 }
78
79 void InternalShowProgress(string message)
80 {
81 CleanStatusMessage(mData);
82
83 mData.IsWaitingAsyncResult = true;
84 mData.ProgressPercent = 0f;
85 mData.ProgressMessage = message;
86 }
87
88 void IProgressControls.ShowError(string message)
89 {
90 mData.StatusMessage = message;
91 mData.StatusType = MessageType.Error;
92 }
93
94 void IProgressControls.ShowNotification(string message)
95 {
96 mData.StatusMessage = message;
97 mData.StatusType = MessageType.Info;
98 }
99
100 void IProgressControls.ShowSuccess(string message)
101 {
102 mData.StatusMessage = message;
103 mData.StatusType = MessageType.Info;
104 }
105
106 void IProgressControls.ShowWarning(string message)
107 {
108 mData.StatusMessage = message;
109 mData.StatusType = MessageType.Warning;
110 }
111
112 static void CleanStatusMessage(Data data)
113 {
114 data.StatusMessage = string.Empty;
115 data.StatusType = MessageType.None;
116 }
117
118 static void GetUpdateProgress(
119 double lastUpdateTime, float lastProgressPercent,
120 out double updateTime, out float progressPercent)
121 {
122 updateTime = EditorApplication.timeSinceStartup;
123
124 double deltaTime = Math.Min(0.1, updateTime - lastUpdateTime);
125 double deltaPercent = (deltaTime / 0.1) * PERCENT_PER_SECONDS;
126
127 progressPercent = Mathf.Repeat(
128 lastProgressPercent + (float)deltaPercent, 1f);
129 }
130
131 double mLastUpdateTime = 0.0;
132
133 Data mData = new Data();
134
135 const double PERCENT_PER_SECONDS = 0.06;
136 }
137}