DrawInspectorOperations.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using PlasticGui;
  2. using System;
  3. using System.IO;
  4. using Unity.PlasticSCM.Editor.AssetMenu;
  5. using Unity.PlasticSCM.Editor.AssetsOverlays;
  6. using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
  7. using Unity.PlasticSCM.Editor.AssetUtils;
  8. using Unity.PlasticSCM.Editor.UI;
  9. using UnityEditor;
  10. using UnityEditor.VersionControl;
  11. using UnityEngine;
  12. namespace Unity.PlasticSCM.Editor.Inspector
  13. {
  14. static class DrawInspectorOperations
  15. {
  16. internal static void Enable(
  17. IAssetMenuOperations operations,
  18. IAssetStatusCache statusCache,
  19. AssetOperations.IAssetSelection assetsSelection)
  20. {
  21. mOperations = operations;
  22. mStatusCache = statusCache;
  23. mAssetsSelection = assetsSelection;
  24. mIsEnabled = true;
  25. UnityEditor.Editor.finishedDefaultHeaderGUI +=
  26. Editor_finishedDefaultHeaderGUI;
  27. RefreshAsset.RepaintInspectors();
  28. }
  29. internal static void Disable()
  30. {
  31. mIsEnabled = false;
  32. UnityEditor.Editor.finishedDefaultHeaderGUI -=
  33. Editor_finishedDefaultHeaderGUI;
  34. RefreshAsset.RepaintInspectors();
  35. }
  36. static void Editor_finishedDefaultHeaderGUI(UnityEditor.Editor obj)
  37. {
  38. if (!mIsEnabled)
  39. return;
  40. AssetList assetList = mAssetsSelection.GetSelectedAssets();
  41. if (mOperations == null ||
  42. assetList.Count == 0 ||
  43. string.IsNullOrEmpty(assetList[0].path))
  44. return;
  45. string selectionFullPath = Path.GetFullPath(assetList[0].path);
  46. AssetsOverlays.AssetStatus assetStatus = (assetList.Count > 1) ?
  47. AssetsOverlays.AssetStatus.None :
  48. mStatusCache.GetStatusForPath(selectionFullPath);
  49. LockStatusData lockStatusData = mStatusCache.GetLockStatusDataForPath(
  50. selectionFullPath);
  51. SelectedAssetGroupInfo selectedGroupInfo = SelectedAssetGroupInfo.
  52. BuildFromAssetList(assetList, mStatusCache);
  53. AssetMenuOperations assetOperations =
  54. AssetMenuUpdater.GetAvailableMenuOperations(selectedGroupInfo);
  55. bool guiEnabledBck = GUI.enabled;
  56. GUI.enabled = true;
  57. try
  58. {
  59. DrawBackRectangle(guiEnabledBck);
  60. GUILayout.BeginHorizontal();
  61. DrawStatusLabels(assetStatus, lockStatusData);
  62. GUILayout.FlexibleSpace();
  63. DrawButtons(assetList, assetOperations);
  64. GUILayout.EndHorizontal();
  65. }
  66. finally
  67. {
  68. GUI.enabled = guiEnabledBck;
  69. }
  70. }
  71. static void DrawBackRectangle(bool isEnabled)
  72. {
  73. // when the inspector is disabled, there is a separator line
  74. // that breaks the visual style. Draw an empty rectangle
  75. // matching the background color to cover it
  76. GUILayout.Space(UnityConstants.INSPECTOR_ACTIONS_BACK_RECTANGLE_TOP_MARGIN);
  77. GUIStyle targetStyle = (isEnabled) ?
  78. UnityStyles.Inspector.HeaderBackgroundStyle :
  79. UnityStyles.Inspector.DisabledHeaderBackgroundStyle;
  80. Rect rect = GUILayoutUtility.GetRect(
  81. GUIContent.none, targetStyle);
  82. // extra space to cover the inspector full width
  83. rect.x -= 20;
  84. rect.width += 80;
  85. GUI.Box(rect, GUIContent.none, targetStyle);
  86. // now reset the space used by the rectangle
  87. GUILayout.Space(
  88. -UnityConstants.INSPECTOR_ACTIONS_HEADER_BACK_RECTANGLE_HEIGHT
  89. - UnityConstants.INSPECTOR_ACTIONS_BACK_RECTANGLE_TOP_MARGIN);
  90. }
  91. static void DrawButtons(
  92. AssetList assetList,
  93. AssetMenuOperations selectedGroupInfo)
  94. {
  95. if (selectedGroupInfo.HasFlag(AssetMenuOperations.Add))
  96. DoAddButton();
  97. if (selectedGroupInfo.HasFlag(AssetMenuOperations.Checkout))
  98. DoCheckoutButton();
  99. if (selectedGroupInfo.HasFlag(AssetMenuOperations.Checkin))
  100. DoCheckinButton();
  101. if (selectedGroupInfo.HasFlag(AssetMenuOperations.Undo))
  102. DoUndoButton();
  103. }
  104. static void DrawStatusLabels(
  105. AssetsOverlays.AssetStatus assetStatus,
  106. LockStatusData lockStatusData)
  107. {
  108. AssetsOverlays.AssetStatus statusesToDraw = DrawAssetOverlay.GetStatusesToDraw(assetStatus);
  109. foreach (AssetsOverlays.AssetStatus status in Enum.GetValues(typeof(AssetsOverlays.AssetStatus)))
  110. {
  111. if (status == AssetsOverlays.AssetStatus.None)
  112. continue;
  113. if (!statusesToDraw.HasFlag(status))
  114. continue;
  115. string label = string.Format("{0}",
  116. DrawAssetOverlay.GetStatusString(status));
  117. Texture icon = DrawAssetOverlay.DrawOverlayIcon.GetOverlayIcon(
  118. status);
  119. string tooltipText = DrawAssetOverlay.GetTooltipText(
  120. status, lockStatusData);
  121. GUILayout.Label(new GUIContent(
  122. label, icon, tooltipText), GUILayout.Height(18));
  123. }
  124. }
  125. static void DoAddButton()
  126. {
  127. string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.AddButton);
  128. if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
  129. {
  130. mOperations.Add();
  131. }
  132. }
  133. static void DoCheckoutButton()
  134. {
  135. string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.CheckoutButton);
  136. if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
  137. {
  138. mOperations.Checkout();
  139. }
  140. }
  141. static void DoCheckinButton()
  142. {
  143. string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.CheckinButton);
  144. if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
  145. {
  146. mOperations.Checkin();
  147. EditorGUIUtility.ExitGUI();
  148. }
  149. }
  150. static void DoUndoButton()
  151. {
  152. string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.UndoButton);
  153. if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
  154. {
  155. mOperations.Undo();
  156. EditorGUIUtility.ExitGUI();
  157. }
  158. }
  159. static IAssetMenuOperations mOperations;
  160. static IAssetStatusCache mStatusCache;
  161. static AssetOperations.IAssetSelection mAssetsSelection;
  162. static bool mIsEnabled;
  163. }
  164. }