Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

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