DrawAssetOverlay.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using System;
  2. using UnityEditor;
  3. using UnityEngine;
  4. using PlasticGui;
  5. using Unity.PlasticSCM.Editor.UI;
  6. namespace Unity.PlasticSCM.Editor.AssetsOverlays
  7. {
  8. internal static class DrawAssetOverlay
  9. {
  10. internal static void Enable()
  11. {
  12. if (sIsEnabled)
  13. return;
  14. sIsEnabled = true;
  15. sRepaintProjectWindow = ProjectWindow.Repaint;
  16. EditorApplication.projectWindowItemOnGUI += OnProjectWindowItemGUI;
  17. sRepaintProjectWindow();
  18. }
  19. internal static void Disable()
  20. {
  21. sIsEnabled = false;
  22. EditorApplication.projectWindowItemOnGUI -= OnProjectWindowItemGUI;
  23. sRepaintProjectWindow();
  24. }
  25. internal static void ClearCache()
  26. {
  27. PlasticPlugin.AssetStatusCache.Clear();
  28. sRepaintProjectWindow();
  29. }
  30. internal static string GetStatusString(AssetStatus assetStatus)
  31. {
  32. if (ClassifyAssetStatus.IsPrivate(assetStatus))
  33. return PlasticLocalization.GetString(
  34. PlasticLocalization.Name.Private);
  35. if (ClassifyAssetStatus.IsIgnored(assetStatus))
  36. return PlasticLocalization.GetString(
  37. PlasticLocalization.Name.StatusIgnored);
  38. if (ClassifyAssetStatus.IsAdded(assetStatus))
  39. return PlasticLocalization.GetString(
  40. PlasticLocalization.Name.StatusAdded);
  41. if (ClassifyAssetStatus.IsConflicted(assetStatus))
  42. return PlasticLocalization.GetString(
  43. PlasticLocalization.Name.StatusConflicted);
  44. if (ClassifyAssetStatus.IsDeletedOnServer(assetStatus))
  45. return PlasticLocalization.GetString(
  46. PlasticLocalization.Name.StatusDeletedOnServer);
  47. if (ClassifyAssetStatus.IsLockedRemote(assetStatus))
  48. return PlasticLocalization.GetString(
  49. PlasticLocalization.Name.StatusLockedRemote);
  50. if (ClassifyAssetStatus.IsOutOfDate(assetStatus))
  51. return PlasticLocalization.GetString(
  52. PlasticLocalization.Name.StatusOutOfDate);
  53. if (ClassifyAssetStatus.IsLocked(assetStatus))
  54. return PlasticLocalization.GetString(
  55. PlasticLocalization.Name.StatusLockedMe);
  56. if (ClassifyAssetStatus.IsCheckedOut(assetStatus))
  57. return PlasticLocalization.GetString(
  58. PlasticLocalization.Name.StatusCheckout);
  59. return string.Empty;
  60. }
  61. internal static string GetTooltipText(
  62. AssetStatus statusValue,
  63. LockStatusData lockStatusData)
  64. {
  65. string statusText = GetStatusString(statusValue);
  66. if (lockStatusData == null)
  67. return statusText;
  68. // example:
  69. // Changed by:
  70. // * dani_pen@hotmail.com
  71. // * workspace wkLocal"
  72. char bulletCharacter = '\u25cf';
  73. string line1 = PlasticLocalization.GetString(
  74. PlasticLocalization.Name.AssetOverlayTooltipStatus, statusText);
  75. string line2 = string.Format("{0} {1}",
  76. bulletCharacter,
  77. lockStatusData.LockedBy);
  78. string line3 = string.Format("{0} {1}",
  79. bulletCharacter,
  80. PlasticLocalization.GetString(
  81. PlasticLocalization.Name.AssetOverlayTooltipWorkspace,
  82. lockStatusData.WorkspaceName));
  83. return string.Format(
  84. "{0}" + Environment.NewLine +
  85. "{1}" + Environment.NewLine +
  86. "{2}",
  87. line1,
  88. line2,
  89. line3);
  90. }
  91. static void OnProjectWindowItemGUI(string guid, Rect selectionRect)
  92. {
  93. if (string.IsNullOrEmpty(guid))
  94. return;
  95. if (Event.current.type != EventType.Repaint)
  96. return;
  97. AssetStatus assetStatus = PlasticPlugin.AssetStatusCache.GetStatusForGuid(guid);
  98. LockStatusData lockStatusData =
  99. ClassifyAssetStatus.IsLockedRemote(assetStatus) ?
  100. PlasticPlugin.AssetStatusCache.GetLockStatusData(guid) :
  101. null;
  102. string tooltipText = GetTooltipText(
  103. assetStatus,
  104. lockStatusData);
  105. DrawOverlayIcon.ForStatus(
  106. selectionRect,
  107. assetStatus,
  108. tooltipText);
  109. }
  110. internal static class DrawOverlayIcon
  111. {
  112. internal static void ForStatus(
  113. Rect selectionRect,
  114. AssetStatus status,
  115. string tooltipText)
  116. {
  117. Texture overlayIcon = GetOverlayIcon(status);
  118. if (overlayIcon == null)
  119. return;
  120. Rect overlayRect = OverlayRect.GetOverlayRect(
  121. selectionRect,
  122. OVERLAY_ICON_OFFSET);
  123. GUI.DrawTexture(
  124. overlayRect, overlayIcon, ScaleMode.ScaleToFit);
  125. Rect tooltipRect = GetTooltipRect(selectionRect, overlayRect);
  126. GUI.Label(tooltipRect, new GUIContent(string.Empty, tooltipText));
  127. }
  128. internal static Texture GetOverlayIcon(AssetStatus assetStatus)
  129. {
  130. if (ClassifyAssetStatus.IsPrivate(assetStatus))
  131. return Images.GetPrivatedOverlayIcon();
  132. if (ClassifyAssetStatus.IsIgnored(assetStatus))
  133. return Images.GetIgnoredOverlayIcon();
  134. if (ClassifyAssetStatus.IsAdded(assetStatus))
  135. return Images.GetAddedOverlayIcon();
  136. if (ClassifyAssetStatus.IsConflicted(assetStatus))
  137. return Images.GetConflictedOverlayIcon();
  138. if (ClassifyAssetStatus.IsDeletedOnServer(assetStatus))
  139. return Images.GetDeletedRemoteOverlayIcon();
  140. if (ClassifyAssetStatus.IsLockedRemote(assetStatus))
  141. return Images.GetLockedRemoteOverlayIcon();
  142. if (ClassifyAssetStatus.IsOutOfDate(assetStatus))
  143. return Images.GetOutOfSyncOverlayIcon();
  144. if (ClassifyAssetStatus.IsLocked(assetStatus))
  145. return Images.GetLockedLocalOverlayIcon();
  146. if (ClassifyAssetStatus.IsCheckedOut(assetStatus))
  147. return Images.GetCheckedOutOverlayIcon();
  148. return null;
  149. }
  150. static Rect Inflate(Rect rect, float width, float height)
  151. {
  152. return new Rect(
  153. rect.x - width,
  154. rect.y - height,
  155. rect.width + 2f * width,
  156. rect.height + 2f * height);
  157. }
  158. static Rect GetTooltipRect(
  159. Rect selectionRect,
  160. Rect overlayRect)
  161. {
  162. if (selectionRect.width > selectionRect.height)
  163. {
  164. return overlayRect;
  165. }
  166. return Inflate(overlayRect, 3f, 3f);
  167. }
  168. }
  169. static Action sRepaintProjectWindow;
  170. static bool sIsEnabled;
  171. const float OVERLAY_ICON_OFFSET = 20f;
  172. }
  173. }