暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

WelcomeView.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using UnityEditor;
  2. using UnityEngine;
  3. using Codice.Client.Common;
  4. using PlasticGui;
  5. using PlasticGui.WebApi;
  6. using Unity.PlasticSCM.Editor.AssetUtils;
  7. using Unity.PlasticSCM.Editor.UI;
  8. using Unity.PlasticSCM.Editor.Views.CreateWorkspace;
  9. using Unity.PlasticSCM.Editor.UI.Progress;
  10. using Unity.PlasticSCM.Editor.Configuration.CloudEdition.Welcome;
  11. using Codice.Client.BaseCommands;
  12. using Unity.PlasticSCM.Editor.Configuration.TeamEdition;
  13. using Codice.CM.Common;
  14. namespace Unity.PlasticSCM.Editor.Views.Welcome
  15. {
  16. internal class WelcomeView
  17. {
  18. internal WelcomeView(
  19. PlasticWindow parentWindow,
  20. CreateWorkspaceView.ICreateWorkspaceListener createWorkspaceListener,
  21. IPlasticAPI plasticApi,
  22. IPlasticWebRestApi plasticWebRestApi,
  23. CmConnection cmConnection)
  24. {
  25. mParentWindow = parentWindow;
  26. mCreateWorkspaceListener = createWorkspaceListener;
  27. mPlasticApi = plasticApi;
  28. mPlasticWebRestApi = plasticWebRestApi;
  29. mCmConnection = cmConnection;
  30. mGuiMessage = new UnityPlasticGuiMessage();
  31. mConfigureProgress = new ProgressControlsForViews();
  32. mInstallerFile = GetInstallerTmpFileName.ForPlatform();
  33. autoLoginState = AutoLogin.State.Off;
  34. }
  35. internal void Update()
  36. {
  37. if (mCreateWorkspaceView != null)
  38. mCreateWorkspaceView.Update();
  39. mConfigureProgress.UpdateDeterminateProgress(mParentWindow);
  40. }
  41. internal void OnGUI(bool clientNeedsConfiguration)
  42. {
  43. GUILayout.BeginHorizontal();
  44. GUILayout.Space(LEFT_MARGIN);
  45. DoContentViewArea(
  46. clientNeedsConfiguration,
  47. mIsCreateWorkspaceButtonClicked,
  48. mInstallerFile,
  49. mGuiMessage,
  50. mConfigureProgress);
  51. GUILayout.EndHorizontal();
  52. }
  53. internal void OnUserClosedConfigurationWindow()
  54. {
  55. ((IProgressControls)mConfigureProgress).HideProgress();
  56. ClientConfig.Reset();
  57. CmConnection.Reset();
  58. ClientHandlers.Register();
  59. }
  60. void DoContentViewArea(
  61. bool clientNeedsConfiguration,
  62. bool isCreateWorkspaceButtonClicked,
  63. string installerFile,
  64. GuiMessage.IGuiMessage guiMessage,
  65. ProgressControlsForViews configureProgress)
  66. {
  67. GUILayout.BeginVertical();
  68. GUILayout.Space(TOP_MARGIN);
  69. if (isCreateWorkspaceButtonClicked)
  70. GetCreateWorkspaceView().OnGUI();
  71. else
  72. DoSetupViewArea(
  73. clientNeedsConfiguration,
  74. mInstallerFile,
  75. mGuiMessage,
  76. mConfigureProgress);
  77. GUILayout.EndVertical();
  78. }
  79. void DoSetupViewArea(
  80. bool clientNeedsConfiguration,
  81. string installerFile,
  82. GuiMessage.IGuiMessage guiMessage,
  83. ProgressControlsForViews configureProgress)
  84. {
  85. DoTitleLabel();
  86. GUILayout.Space(STEPS_TOP_MARGIN);
  87. bool isStep1Completed =
  88. !clientNeedsConfiguration &&
  89. !configureProgress.ProgressData.IsOperationRunning;
  90. DoStepsArea(isStep1Completed, configureProgress.ProgressData);
  91. GUILayout.Space(BUTTON_MARGIN);
  92. DoActionButtonsArea(
  93. isStep1Completed,
  94. installerFile,
  95. guiMessage,
  96. configureProgress);
  97. DoNotificationArea(configureProgress.ProgressData);
  98. }
  99. void DoActionButtonsArea(
  100. bool isStep1Completed,
  101. string installerFile,
  102. GuiMessage.IGuiMessage guiMessage,
  103. ProgressControlsForViews configureProgress)
  104. {
  105. DoActionButton(
  106. isStep1Completed,
  107. installerFile,
  108. guiMessage,
  109. configureProgress);
  110. }
  111. void DoActionButton(
  112. bool isStep1Completed,
  113. string installerFile,
  114. GuiMessage.IGuiMessage guiMessage,
  115. ProgressControlsForViews configureProgress)
  116. {
  117. if (!isStep1Completed)
  118. {
  119. DoConfigureButton(configureProgress);
  120. return;
  121. }
  122. if (GUILayout.Button(
  123. PlasticLocalization.GetString(PlasticLocalization.Name.CreateWorkspace),
  124. GUILayout.Width(BUTTON_WIDTH)))
  125. mIsCreateWorkspaceButtonClicked = true;
  126. }
  127. void DoConfigureButton(ProgressControlsForViews configureProgress)
  128. {
  129. bool isAutoLoginRunning = autoLoginState > AutoLogin.State.Running && autoLoginState <= AutoLogin.State.InitializingPlastic;
  130. GUI.enabled = !(configureProgress.ProgressData.IsOperationRunning || isAutoLoginRunning);
  131. if (GUILayout.Button(PlasticLocalization.GetString(
  132. PlasticLocalization.Name.LoginOrSignUp),
  133. GUILayout.Width(BUTTON_WIDTH)))
  134. {
  135. if (autoLoginState > AutoLogin.State.Off && autoLoginState <= AutoLogin.State.InitializingPlastic)
  136. {
  137. autoLoginState = AutoLogin.State.Running;
  138. AutoLogin autoLogin = new AutoLogin();
  139. autoLogin.Run();
  140. }
  141. if (autoLoginState != AutoLogin.State.ErrorNoToken)
  142. {
  143. return;
  144. }
  145. ((IProgressControls)configureProgress).ShowProgress(string.Empty);
  146. // Login button defaults to Cloud sign up
  147. CloudEditionWelcomeWindow.ShowWindow(
  148. mPlasticWebRestApi,
  149. mCmConnection,
  150. this);
  151. GUIUtility.ExitGUI();
  152. }
  153. // If client configuration cannot be determined, keep login button default as Cloud
  154. // sign in window, but show Enterprise option as well
  155. GUILayout.FlexibleSpace();
  156. var anchorStyle = new GUIStyle(GUI.skin.label);
  157. anchorStyle.normal.textColor = new Color(0.129f, 0.588f, 0.953f);
  158. anchorStyle.hover.textColor = new Color(0.239f, 0.627f, 0.949f);
  159. anchorStyle.active.textColor = new Color(0.239f, 0.627f, 0.949f);
  160. if (GUILayout.Button(
  161. PlasticLocalization.GetString(
  162. PlasticLocalization.Name.NeedEnterprise),
  163. anchorStyle,
  164. GUILayout.Width(BUTTON_WIDTH),
  165. GUILayout.Height(20)))
  166. TeamEditionConfigurationWindow.ShowWindow(mPlasticWebRestApi, this);
  167. GUILayout.Space(BUTTON_MARGIN);
  168. GUI.enabled = true;
  169. }
  170. static void DoStepsArea(
  171. bool isStep1Completed,
  172. ProgressControlsForViews.Data configureProgressData)
  173. {
  174. DoLoginOrSignUpStep(isStep1Completed, configureProgressData);
  175. DoCreatePlasticWorkspaceStep();
  176. }
  177. static void DoLoginOrSignUpStep(
  178. bool isStep1Completed,
  179. ProgressControlsForViews.Data progressData)
  180. {
  181. Texture2D stepImage = (isStep1Completed) ? Images.GetStepOkIcon() : Images.GetStep1Icon();
  182. string stepText = GetConfigurationStepText(progressData, isStep1Completed);
  183. GUIStyle style = new GUIStyle(EditorStyles.label);
  184. style.richText = true;
  185. GUILayout.BeginHorizontal();
  186. DoStepLabel(stepText, stepImage, style);
  187. GUILayout.EndHorizontal();
  188. }
  189. static void DoCreatePlasticWorkspaceStep()
  190. {
  191. GUILayout.BeginHorizontal();
  192. DoStepLabel(
  193. PlasticLocalization.GetString(PlasticLocalization.Name.CreateAUnityVersionControlWorkspace),
  194. Images.GetStep2Icon(),
  195. EditorStyles.label);
  196. GUILayout.EndHorizontal();
  197. }
  198. static void DoStepLabel(
  199. string text,
  200. Texture2D image,
  201. GUIStyle style)
  202. {
  203. GUILayout.Space(STEPS_LEFT_MARGIN);
  204. GUIContent stepLabelContent = new GUIContent(
  205. string.Format(" {0}", text),
  206. image);
  207. GUILayout.Label(
  208. stepLabelContent,
  209. style,
  210. GUILayout.Height(STEP_LABEL_HEIGHT));
  211. }
  212. static void DoTitleLabel()
  213. {
  214. GUIContent labelContent = new GUIContent(
  215. PlasticLocalization.GetString(PlasticLocalization.Name.NextStepsToSetup),
  216. Images.GetInfoIcon());
  217. GUILayout.Label(labelContent, EditorStyles.boldLabel);
  218. }
  219. static void DoNotificationArea(ProgressControlsForViews.Data configureProgressData)
  220. {
  221. if (!string.IsNullOrEmpty(configureProgressData.NotificationMessage))
  222. DrawProgressForViews.ForNotificationArea(configureProgressData);
  223. }
  224. static string GetConfigurationStepText(
  225. ProgressControlsForViews.Data progressData,
  226. bool isStep1Completed)
  227. {
  228. string result = PlasticLocalization.GetString(
  229. PlasticLocalization.Name.LoginOrSignUpUnityVersionControl);
  230. if (isStep1Completed)
  231. return result;
  232. if (!progressData.IsOperationRunning)
  233. return result;
  234. return string.Format("<b>{0}</b>", result);
  235. }
  236. CreateWorkspaceView GetCreateWorkspaceView()
  237. {
  238. if (mCreateWorkspaceView != null)
  239. return mCreateWorkspaceView;
  240. string workspacePath = ProjectPath.FromApplicationDataPath(
  241. ApplicationDataPath.Get());
  242. mCreateWorkspaceView = new CreateWorkspaceView(
  243. mParentWindow,
  244. mCreateWorkspaceListener,
  245. mPlasticApi,
  246. mPlasticWebRestApi,
  247. workspacePath);
  248. return mCreateWorkspaceView;
  249. }
  250. internal AutoLogin.State autoLoginState = AutoLogin.State.Off;
  251. string mInstallerFile;
  252. bool mIsCreateWorkspaceButtonClicked = false;
  253. CreateWorkspaceView mCreateWorkspaceView;
  254. readonly ProgressControlsForViews mConfigureProgress;
  255. readonly GuiMessage.IGuiMessage mGuiMessage;
  256. readonly CmConnection mCmConnection;
  257. readonly IPlasticAPI mPlasticApi;
  258. readonly IPlasticWebRestApi mPlasticWebRestApi;
  259. readonly CreateWorkspaceView.ICreateWorkspaceListener mCreateWorkspaceListener;
  260. readonly PlasticWindow mParentWindow;
  261. const int LEFT_MARGIN = 30;
  262. const int TOP_MARGIN = 20;
  263. const int STEPS_TOP_MARGIN = 5;
  264. const int STEPS_LEFT_MARGIN = 12;
  265. const int BUTTON_MARGIN = 10;
  266. const int STEP_LABEL_HEIGHT = 20;
  267. const int BUTTON_WIDTH = 170;
  268. const string DOWNLOAD_URL = @"https://www.plasticscm.com/download";
  269. }
  270. }