暫無描述
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.

AssetMenuItems.cs 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. using UnityEditor;
  2. using UnityEditor.VersionControl;
  3. using Codice.CM.Common;
  4. using Codice.Client.BaseCommands.EventTracking;
  5. using PlasticGui;
  6. using PlasticGui.WorkspaceWindow.Items;
  7. using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
  8. using Unity.PlasticSCM.Editor.UI;
  9. using Unity.PlasticSCM.Editor.Tool;
  10. namespace Unity.PlasticSCM.Editor.AssetMenu
  11. {
  12. internal class AssetMenuItems
  13. {
  14. internal static void Enable(
  15. WorkspaceInfo wkInfo,
  16. IAssetStatusCache assetStatusCache)
  17. {
  18. if (mIsEnabled)
  19. return;
  20. mWkInfo = wkInfo;
  21. mAssetStatusCache = assetStatusCache;
  22. mIsEnabled = true;
  23. mAssetSelection = new ProjectViewAssetSelection(UpdateFilterMenuItems);
  24. mFilterMenuBuilder = new AssetFilesFilterPatternsMenuBuilder(
  25. IGNORE_MENU_ITEMS_PRIORITY,
  26. HIDDEN_MENU_ITEMS_PRIORITY);
  27. AddMenuItems();
  28. }
  29. internal static void Disable()
  30. {
  31. mIsEnabled = false;
  32. RemoveMenuItems();
  33. if (mAssetSelection != null)
  34. mAssetSelection.Dispose();
  35. mWkInfo = null;
  36. mAssetStatusCache = null;
  37. mAssetSelection = null;
  38. mFilterMenuBuilder = null;
  39. mOperations = null;
  40. }
  41. internal static void BuildOperations(
  42. WorkspaceInfo wkInfo,
  43. WorkspaceWindow workspaceWindow,
  44. IViewSwitcher viewSwitcher,
  45. IHistoryViewLauncher historyViewLauncher,
  46. GluonGui.ViewHost viewHost,
  47. PlasticGui.WorkspaceWindow.NewIncomingChangesUpdater incomingChangesUpdater,
  48. IAssetStatusCache assetStatusCache,
  49. IMergeViewLauncher mergeViewLauncher,
  50. PlasticGui.Gluon.IGluonViewSwitcher gluonViewSwitcher,
  51. LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
  52. EditorWindow parentWindow,
  53. bool isGluonMode)
  54. {
  55. if (!mIsEnabled)
  56. Enable(wkInfo, assetStatusCache);
  57. AssetOperations assetOperations = new AssetOperations(
  58. wkInfo,
  59. workspaceWindow,
  60. viewSwitcher,
  61. historyViewLauncher,
  62. viewHost,
  63. incomingChangesUpdater,
  64. mAssetStatusCache,
  65. mergeViewLauncher,
  66. gluonViewSwitcher,
  67. parentWindow,
  68. mAssetSelection,
  69. showDownloadPlasticExeWindow,
  70. isGluonMode);
  71. mOperations = assetOperations;
  72. mFilterMenuBuilder.SetOperations(assetOperations);
  73. }
  74. static void RemoveMenuItems()
  75. {
  76. mFilterMenuBuilder.RemoveMenuItems();
  77. HandleMenuItem.RemoveMenuItem(
  78. PlasticLocalization.GetString(PlasticLocalization.Name.PrefixPlasticMenu));
  79. HandleMenuItem.UpdateAllMenus();
  80. }
  81. static void UpdateFilterMenuItems()
  82. {
  83. AssetList assetList = ((AssetOperations.IAssetSelection)
  84. mAssetSelection).GetSelectedAssets();
  85. SelectedPathsGroupInfo info = AssetsSelection.GetSelectedPathsGroupInfo(
  86. mWkInfo.ClientPath, assetList, mAssetStatusCache);
  87. FilterMenuActions actions =
  88. assetList.Count != info.SelectedCount ?
  89. new FilterMenuActions() :
  90. FilterMenuUpdater.GetMenuActions(info);
  91. mFilterMenuBuilder.UpdateMenuItems(actions);
  92. }
  93. static void AddMenuItems()
  94. {
  95. // TODO: Try removing this
  96. // Somehow first item always disappears. So this is a filler item
  97. HandleMenuItem.AddMenuItem(
  98. GetPlasticMenuItemName(PlasticLocalization.Name.PendingChangesPlasticMenu),
  99. PENDING_CHANGES_MENU_ITEM_PRIORITY,
  100. PendingChanges, ValidatePendingChanges);
  101. HandleMenuItem.AddMenuItem(
  102. GetPlasticMenuItemName(PlasticLocalization.Name.PendingChangesPlasticMenu),
  103. PENDING_CHANGES_MENU_ITEM_PRIORITY,
  104. PendingChanges, ValidatePendingChanges);
  105. HandleMenuItem.AddMenuItem(
  106. GetPlasticMenuItemName(PlasticLocalization.Name.AddPlasticMenu),
  107. ADD_MENU_ITEM_PRIORITY,
  108. Add, ValidateAdd);
  109. HandleMenuItem.AddMenuItem(
  110. GetPlasticMenuItemName(PlasticLocalization.Name.CheckoutPlasticMenu),
  111. CHECKOUT_MENU_ITEM_PRIORITY,
  112. Checkout, ValidateCheckout);
  113. HandleMenuItem.AddMenuItem(
  114. GetPlasticMenuItemName(PlasticLocalization.Name.CheckinPlasticMenu),
  115. CHECKIN_MENU_ITEM_PRIORITY,
  116. Checkin, ValidateCheckin);
  117. HandleMenuItem.AddMenuItem(
  118. GetPlasticMenuItemName(PlasticLocalization.Name.UndoPlasticMenu),
  119. UNDO_MENU_ITEM_PRIORITY,
  120. Undo, ValidateUndo);
  121. UpdateFilterMenuItems();
  122. HandleMenuItem.AddMenuItem(
  123. GetPlasticMenuItemName(PlasticLocalization.Name.DiffPlasticMenu),
  124. GetPlasticShortcut.ForAssetDiff(),
  125. DIFF_MENU_ITEM_PRIORITY,
  126. Diff, ValidateDiff);
  127. HandleMenuItem.AddMenuItem(
  128. GetPlasticMenuItemName(PlasticLocalization.Name.HistoryPlasticMenu),
  129. GetPlasticShortcut.ForHistory(),
  130. HISTORY_MENU_ITEM_PRIORITY,
  131. History, ValidateHistory);
  132. HandleMenuItem.UpdateAllMenus();
  133. }
  134. static void PendingChanges()
  135. {
  136. ShowWindow.Plastic();
  137. mOperations.ShowPendingChanges();
  138. }
  139. static bool ValidatePendingChanges()
  140. {
  141. return true;
  142. }
  143. static void Add()
  144. {
  145. if (mOperations == null)
  146. ShowWindow.Plastic();
  147. mOperations.Add();
  148. }
  149. static bool ValidateAdd()
  150. {
  151. return ShouldMenuItemBeEnabled(
  152. mWkInfo.ClientPath, mAssetSelection, mAssetStatusCache,
  153. AssetMenuOperations.Add);
  154. }
  155. static void Checkout()
  156. {
  157. if (mOperations == null)
  158. ShowWindow.Plastic();
  159. mOperations.Checkout();
  160. }
  161. static bool ValidateCheckout()
  162. {
  163. return ShouldMenuItemBeEnabled(
  164. mWkInfo.ClientPath, mAssetSelection, mAssetStatusCache,
  165. AssetMenuOperations.Checkout);
  166. }
  167. static void Checkin()
  168. {
  169. TrackFeatureUseEvent.For(
  170. PlasticGui.Plastic.API.GetRepositorySpec(mWkInfo),
  171. TrackFeatureUseEvent.Features.ContextMenuCheckinOption);
  172. if (mOperations == null)
  173. ShowWindow.Plastic();
  174. mOperations.Checkin();
  175. }
  176. static bool ValidateCheckin()
  177. {
  178. return ShouldMenuItemBeEnabled(
  179. mWkInfo.ClientPath, mAssetSelection, mAssetStatusCache,
  180. AssetMenuOperations.Checkin);
  181. }
  182. static void Undo()
  183. {
  184. if (mOperations == null)
  185. ShowWindow.Plastic();
  186. mOperations.Undo();
  187. }
  188. static bool ValidateUndo()
  189. {
  190. return ShouldMenuItemBeEnabled(
  191. mWkInfo.ClientPath, mAssetSelection, mAssetStatusCache,
  192. AssetMenuOperations.Undo);
  193. }
  194. static void Diff()
  195. {
  196. if (mOperations == null)
  197. ShowWindow.Plastic();
  198. mOperations.ShowDiff();
  199. }
  200. static bool ValidateDiff()
  201. {
  202. return ShouldMenuItemBeEnabled(
  203. mWkInfo.ClientPath, mAssetSelection, mAssetStatusCache,
  204. AssetMenuOperations.Diff);
  205. }
  206. static void History()
  207. {
  208. ShowWindow.Plastic();
  209. mOperations.ShowHistory();
  210. }
  211. static bool ValidateHistory()
  212. {
  213. return ShouldMenuItemBeEnabled(
  214. mWkInfo.ClientPath, mAssetSelection, mAssetStatusCache,
  215. AssetMenuOperations.History);
  216. }
  217. static bool ShouldMenuItemBeEnabled(
  218. string wkPath,
  219. AssetOperations.IAssetSelection assetSelection,
  220. IAssetStatusCache statusCache,
  221. AssetMenuOperations operation)
  222. {
  223. AssetList assetList = assetSelection.GetSelectedAssets();
  224. if (assetList.Count == 0)
  225. return false;
  226. SelectedAssetGroupInfo selectedGroupInfo = SelectedAssetGroupInfo.
  227. BuildFromAssetList(wkPath, assetList, statusCache);
  228. if (assetList.Count != selectedGroupInfo.SelectedCount)
  229. return false;
  230. AssetMenuOperations operations = AssetMenuUpdater.
  231. GetAvailableMenuOperations(selectedGroupInfo);
  232. return operations.HasFlag(operation);
  233. }
  234. static string GetPlasticMenuItemName(PlasticLocalization.Name name)
  235. {
  236. return string.Format("{0}/{1}",
  237. PlasticLocalization.GetString(PlasticLocalization.Name.PrefixPlasticMenu),
  238. PlasticLocalization.GetString(name));
  239. }
  240. static IAssetMenuOperations mOperations;
  241. static ProjectViewAssetSelection mAssetSelection;
  242. static AssetFilesFilterPatternsMenuBuilder mFilterMenuBuilder;
  243. static bool mIsEnabled;
  244. static IAssetStatusCache mAssetStatusCache;
  245. static WorkspaceInfo mWkInfo;
  246. const int BASE_MENU_ITEM_PRIORITY = 19; // Puts Plastic SCM right below Create menu
  247. // incrementing the "order" param by 11 causes the menu system to add a separator
  248. const int PENDING_CHANGES_MENU_ITEM_PRIORITY = BASE_MENU_ITEM_PRIORITY;
  249. const int ADD_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 11;
  250. const int CHECKOUT_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 12;
  251. const int CHECKIN_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 13;
  252. const int UNDO_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 14;
  253. const int IGNORE_MENU_ITEMS_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 25;
  254. const int HIDDEN_MENU_ITEMS_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 26;
  255. const int DIFF_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 37;
  256. const int HISTORY_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 38;
  257. }
  258. }