AssetMenuItems.cs 7.7 KB

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