StatusBar.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. using UnityEditor;
  2. using UnityEngine;
  3. using Codice.CM.Common;
  4. using PlasticGui;
  5. using PlasticGui.Gluon;
  6. using PlasticGui.WorkspaceWindow.Topbar;
  7. using PlasticGui.WorkspaceWindow.PendingChanges;
  8. using GluonShowIncomingChanges = PlasticGui.Gluon.WorkspaceWindow.ShowIncomingChanges;
  9. namespace Unity.PlasticSCM.Editor.UI
  10. {
  11. internal class IncomingChangesNotification
  12. {
  13. internal string InfoText;
  14. internal string ActionText;
  15. internal string TooltipText;
  16. internal bool HasUpdateAction;
  17. internal PlasticNotification.Status Status;
  18. internal void Clear()
  19. {
  20. InfoText = string.Empty;
  21. ActionText = string.Empty;
  22. TooltipText = string.Empty;
  23. HasUpdateAction = false;
  24. Status = PlasticNotification.Status.None;
  25. }
  26. }
  27. interface IIncomingChangesNotifier
  28. {
  29. bool HasNotification { get; }
  30. IncomingChangesNotification Notification { get; }
  31. }
  32. internal class StatusBar
  33. {
  34. internal StatusBar()
  35. {
  36. mCooldownNotificationClearAction = new CooldownWindowDelayer(
  37. DelayedClearNotification,
  38. UnityConstants.NOTIFICATION_CLEAR_INTERVAL);
  39. }
  40. internal void Notify(string message, MessageType type, Texture2D image)
  41. {
  42. mNotification = new Notification(message, type, image);
  43. mCooldownNotificationClearAction.Ping();
  44. }
  45. internal void OnGUI(
  46. WorkspaceInfo wkInfo,
  47. WorkspaceWindow workspaceWindow,
  48. IMergeViewLauncher mergeViewLauncher,
  49. IGluonViewSwitcher gluonViewSwitcher,
  50. IIncomingChangesNotifier incomingChangesNotifier,
  51. bool isGluonMode)
  52. {
  53. EditorGUILayout.BeginVertical(
  54. GetBarStyle(),
  55. GUILayout.Height(UnityConstants.STATUS_BAR_HEIGHT));
  56. GUILayout.FlexibleSpace();
  57. EditorGUILayout.BeginHorizontal();
  58. if (incomingChangesNotifier.HasNotification)
  59. {
  60. DrawIncomingChangesNotification(
  61. wkInfo,
  62. workspaceWindow,
  63. mergeViewLauncher,
  64. gluonViewSwitcher,
  65. incomingChangesNotifier.Notification,
  66. isGluonMode);
  67. }
  68. if (mNotification != null)
  69. DrawNotification(mNotification);
  70. GUILayout.FlexibleSpace();
  71. DrawWorkspaceStatus(workspaceWindow.WorkspaceStatus);
  72. EditorGUILayout.EndHorizontal();
  73. GUILayout.FlexibleSpace();
  74. EditorGUILayout.EndVertical();
  75. }
  76. static void DrawIncomingChangesNotification(
  77. WorkspaceInfo wkInfo,
  78. WorkspaceWindow workspaceWindow,
  79. IMergeViewLauncher mergeViewLauncher,
  80. IGluonViewSwitcher gluonViewSwitcher,
  81. IncomingChangesNotification notification,
  82. bool isGluonMode)
  83. {
  84. Texture2D icon = notification.Status == PlasticNotification.Status.Conflicts ?
  85. Images.GetConflictedIcon() :
  86. Images.GetOutOfSyncIcon();
  87. DrawIcon(icon);
  88. DrawNotificationLabel(notification.InfoText);
  89. if (DrawButton(notification.ActionText, notification.TooltipText))
  90. {
  91. if (notification.HasUpdateAction)
  92. {
  93. workspaceWindow.UpdateWorkspace();
  94. return;
  95. }
  96. ShowIncomingChangesForMode(
  97. wkInfo,
  98. mergeViewLauncher,
  99. gluonViewSwitcher,
  100. isGluonMode);
  101. }
  102. }
  103. static void DrawNotification(Notification notification)
  104. {
  105. DrawIcon(notification.Image);
  106. DrawNotificationLabel(notification.Message);
  107. }
  108. static void DrawWorkspaceStatus(WorkspaceStatusString.Data status)
  109. {
  110. DrawIcon(Images.GetBranchIcon());
  111. if (status != null)
  112. {
  113. DrawLabel(string.Format(
  114. "{0}@{1}@{2}",
  115. status.ObjectSpec,
  116. status.RepositoryName,
  117. status.Server));
  118. }
  119. }
  120. static void DrawIcon(Texture2D icon)
  121. {
  122. GUILayout.BeginVertical();
  123. GUILayout.FlexibleSpace();
  124. GUILayout.Label(
  125. icon,
  126. UnityStyles.StatusBar.Icon,
  127. GUILayout.Height(UnityConstants.STATUS_BAR_ICON_SIZE),
  128. GUILayout.Width(UnityConstants.STATUS_BAR_ICON_SIZE));
  129. GUILayout.FlexibleSpace();
  130. GUILayout.EndVertical();
  131. }
  132. static void DrawLabel(string label)
  133. {
  134. GUILayout.BeginVertical();
  135. GUILayout.FlexibleSpace();
  136. GUILayout.Label(
  137. label,
  138. UnityStyles.StatusBar.Label);
  139. GUILayout.FlexibleSpace();
  140. GUILayout.EndVertical();
  141. }
  142. static void DrawNotificationLabel(string label)
  143. {
  144. GUILayout.BeginVertical();
  145. GUILayout.FlexibleSpace();
  146. GUILayout.Label(
  147. label,
  148. UnityStyles.StatusBar.NotificationLabel);
  149. GUILayout.FlexibleSpace();
  150. GUILayout.EndVertical();
  151. }
  152. static bool DrawButton(string label, string tooltip)
  153. {
  154. GUILayout.BeginVertical();
  155. GUILayout.FlexibleSpace();
  156. bool buttonClicked = GUILayout.Button(
  157. new GUIContent(label, tooltip),
  158. UnityStyles.StatusBar.Button);
  159. GUILayout.FlexibleSpace();
  160. GUILayout.EndVertical();
  161. return buttonClicked;
  162. }
  163. static void ShowIncomingChangesForMode(
  164. WorkspaceInfo workspaceInfo,
  165. IMergeViewLauncher mergeViewLauncher,
  166. IGluonViewSwitcher gluonSwitcher,
  167. bool isGluonMode)
  168. {
  169. if (isGluonMode)
  170. {
  171. GluonShowIncomingChanges.FromNotificationBar(
  172. workspaceInfo, gluonSwitcher);
  173. return;
  174. }
  175. ShowIncomingChanges.FromNotificationBar(
  176. workspaceInfo, mergeViewLauncher);
  177. }
  178. void DelayedClearNotification()
  179. {
  180. mNotification = null;
  181. }
  182. GUIStyle GetBarStyle()
  183. {
  184. if (mBarTexture == null)
  185. mBarTexture = new Texture2D(1, 1);
  186. if (mBarStyle == null)
  187. mBarStyle = new GUIStyle();
  188. mBarTexture.SetPixel(0, 0, UnityStyles.Colors.BackgroundBar);
  189. mBarTexture.Apply();
  190. mBarStyle.normal.background = mBarTexture;
  191. return mBarStyle;
  192. }
  193. class Notification
  194. {
  195. internal string Message { get; private set; }
  196. internal MessageType MessageType { get; private set; }
  197. internal Texture2D Image { get; private set; }
  198. internal Notification(string message, MessageType messageType, Texture2D image)
  199. {
  200. Message = message;
  201. MessageType = messageType;
  202. Image = image;
  203. }
  204. }
  205. Texture2D mBarTexture;
  206. GUIStyle mBarStyle;
  207. Notification mNotification;
  208. readonly CooldownWindowDelayer mCooldownNotificationClearAction;
  209. }
  210. }