No Description
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.

DrawAssetOverlay.cs 7.8KB

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