AssetMenuItems.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. using UnityEngine;
  2. using UnityEditor;
  3. using Codice.CM.Common;
  4. using Codice.Client.BaseCommands.EventTracking;
  5. using PlasticGui;
  6. using PlasticGui.WorkspaceWindow.Items;
  7. using Unity.PlasticSCM.Editor.UI;
  8. namespace Unity.PlasticSCM.Editor.AssetMenu
  9. {
  10. internal class AssetMenuItems
  11. {
  12. internal static void Enable()
  13. {
  14. if (sIsEnabled)
  15. return;
  16. sIsEnabled = true;
  17. sOperations = new AssetMenuRoutingOperations();
  18. sAssetSelection = new ProjectViewAssetSelection(UpdateFilterMenuItems);
  19. sFilterMenuBuilder = new AssetFilesFilterPatternsMenuBuilder(
  20. sOperations,
  21. IGNORE_MENU_ITEMS_PRIORITY,
  22. HIDDEN_MENU_ITEMS_PRIORITY);
  23. AddMenuItems();
  24. }
  25. internal static void Disable()
  26. {
  27. sIsEnabled = false;
  28. RemoveMenuItems();
  29. if (sAssetSelection != null)
  30. sAssetSelection.Dispose();
  31. }
  32. static void AddMenuItems()
  33. {
  34. // TODO: Try removing this
  35. // Somehow first item always disappears. So this is a filler item
  36. HandleMenuItem.AddMenuItem(
  37. GetPlasticMenuItemName(PlasticLocalization.Name.PendingChangesPlasticMenu),
  38. PENDING_CHANGES_MENU_ITEM_PRIORITY,
  39. PendingChanges, ValidatePendingChanges);
  40. HandleMenuItem.AddMenuItem(
  41. GetPlasticMenuItemName(PlasticLocalization.Name.PendingChangesPlasticMenu),
  42. PENDING_CHANGES_MENU_ITEM_PRIORITY,
  43. PendingChanges, ValidatePendingChanges);
  44. HandleMenuItem.AddMenuItem(
  45. GetPlasticMenuItemName(PlasticLocalization.Name.AddPlasticMenu),
  46. ADD_MENU_ITEM_PRIORITY,
  47. Add, ValidateAdd);
  48. HandleMenuItem.AddMenuItem(
  49. GetPlasticMenuItemName(PlasticLocalization.Name.CheckoutPlasticMenu),
  50. CHECKOUT_MENU_ITEM_PRIORITY,
  51. Checkout, ValidateCheckout);
  52. HandleMenuItem.AddMenuItem(
  53. GetPlasticMenuItemName(PlasticLocalization.Name.CheckinPlasticMenu),
  54. CHECKIN_MENU_ITEM_PRIORITY,
  55. Checkin, ValidateCheckin);
  56. HandleMenuItem.AddMenuItem(
  57. GetPlasticMenuItemName(PlasticLocalization.Name.UndoPlasticMenu),
  58. UNDO_MENU_ITEM_PRIORITY,
  59. Undo, ValidateUndo);
  60. UpdateFilterMenuItems();
  61. HandleMenuItem.AddMenuItem(
  62. GetPlasticMenuItemName(PlasticLocalization.Name.DiffPlasticMenu),
  63. GetPlasticShortcut.ForAssetDiff(),
  64. DIFF_MENU_ITEM_PRIORITY,
  65. Diff, ValidateDiff);
  66. HandleMenuItem.AddMenuItem(
  67. GetPlasticMenuItemName(PlasticLocalization.Name.HistoryPlasticMenu),
  68. GetPlasticShortcut.ForHistory(),
  69. HISTORY_MENU_ITEM_PRIORITY,
  70. History, ValidateHistory);
  71. HandleMenuItem.UpdateAllMenus();
  72. }
  73. static void UpdateFilterMenuItems()
  74. {
  75. SelectedPathsGroupInfo info = AssetsSelection.GetSelectedPathsGroupInfo(
  76. ((AssetOperations.IAssetSelection)sAssetSelection).GetSelectedAssets(),
  77. PlasticPlugin.AssetStatusCache);
  78. sFilterMenuBuilder.UpdateMenuItems(FilterMenuUpdater.GetMenuActions(info));
  79. }
  80. static string GetPlasticMenuItemName(PlasticLocalization.Name name)
  81. {
  82. return string.Format("{0}/{1}",
  83. PlasticLocalization.GetString(PlasticLocalization.Name.PrefixPlasticMenu),
  84. PlasticLocalization.GetString(name));
  85. }
  86. static void PendingChanges()
  87. {
  88. ShowWindow.Plastic();
  89. ((IAssetMenuOperations)sOperations).ShowPendingChanges();
  90. }
  91. static bool ValidatePendingChanges()
  92. {
  93. return true;
  94. }
  95. static void Add()
  96. {
  97. ((IAssetMenuOperations)sOperations).Add();
  98. }
  99. static bool ValidateAdd()
  100. {
  101. return ShouldMenuItemBeEnabled(AssetMenuOperations.Add);
  102. }
  103. static void Checkout()
  104. {
  105. ((IAssetMenuOperations)sOperations).Checkout();
  106. }
  107. static bool ValidateCheckout()
  108. {
  109. return ShouldMenuItemBeEnabled(AssetMenuOperations.Checkout);
  110. }
  111. static void Checkin()
  112. {
  113. WorkspaceInfo wkInfo = FindWorkspace.InfoForApplicationPath(
  114. Application.dataPath,
  115. PlasticApp.PlasticAPI);
  116. if (wkInfo != null)
  117. {
  118. TrackFeatureUseEvent.For(
  119. PlasticGui.Plastic.API.GetRepositorySpec(wkInfo),
  120. TrackFeatureUseEvent.Features.ContextMenuCheckinOption);
  121. }
  122. ((IAssetMenuOperations)sOperations).Checkin();
  123. }
  124. static bool ValidateCheckin()
  125. {
  126. return ShouldMenuItemBeEnabled(AssetMenuOperations.Checkin);
  127. }
  128. static void Undo()
  129. {
  130. ((IAssetMenuOperations)sOperations).Undo();
  131. }
  132. static bool ValidateUndo()
  133. {
  134. return ShouldMenuItemBeEnabled(AssetMenuOperations.Undo);
  135. }
  136. static void Diff()
  137. {
  138. ((IAssetMenuOperations)sOperations).ShowDiff();
  139. }
  140. static bool ValidateDiff()
  141. {
  142. return ShouldMenuItemBeEnabled(AssetMenuOperations.Diff);
  143. }
  144. static void History()
  145. {
  146. ShowWindow.Plastic();
  147. ((IAssetMenuOperations)sOperations).ShowHistory();
  148. }
  149. static bool ValidateHistory()
  150. {
  151. return ShouldMenuItemBeEnabled(AssetMenuOperations.History);
  152. }
  153. static bool ShouldMenuItemBeEnabled(AssetMenuOperations operation)
  154. {
  155. if (sOperations == null)
  156. return false;
  157. SelectedAssetGroupInfo selectedGroupInfo = SelectedAssetGroupInfo.
  158. BuildFromAssetList(
  159. ((AssetOperations.IAssetSelection)sAssetSelection).GetSelectedAssets(),
  160. PlasticPlugin.AssetStatusCache);
  161. AssetMenuOperations operations = AssetMenuUpdater.
  162. GetAvailableMenuOperations(selectedGroupInfo);
  163. return operations.HasFlag(operation);
  164. }
  165. static void RemoveMenuItems()
  166. {
  167. sFilterMenuBuilder.RemoveMenuItems();
  168. HandleMenuItem.RemoveMenuItem(
  169. PlasticLocalization.GetString(PlasticLocalization.Name.PrefixPlasticMenu));
  170. HandleMenuItem.UpdateAllMenus();
  171. }
  172. static AssetMenuRoutingOperations sOperations;
  173. static ProjectViewAssetSelection sAssetSelection;
  174. static AssetFilesFilterPatternsMenuBuilder sFilterMenuBuilder;
  175. static bool sIsEnabled;
  176. const int BASE_MENU_ITEM_PRIORITY = 19; // Puts Plastic SCM right below Create menu
  177. // incrementing the "order" param by 11 causes the menu system to add a separator
  178. const int PENDING_CHANGES_MENU_ITEM_PRIORITY = BASE_MENU_ITEM_PRIORITY;
  179. const int ADD_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 11;
  180. const int CHECKOUT_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 12;
  181. const int CHECKIN_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 13;
  182. const int UNDO_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 14;
  183. const int IGNORE_MENU_ITEMS_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 25;
  184. const int HIDDEN_MENU_ITEMS_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 26;
  185. const int DIFF_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 37;
  186. const int HISTORY_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 38;
  187. }
  188. }