PendingChangesViewMenu.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. using UnityEditor;
  2. using UnityEngine;
  3. using PlasticGui;
  4. using PlasticGui.WorkspaceWindow.Items;
  5. using PlasticGui.WorkspaceWindow.Open;
  6. using PlasticGui.WorkspaceWindow.PendingChanges;
  7. using Unity.PlasticSCM.Editor.UI;
  8. using Unity.PlasticSCM.Editor.Tool;
  9. namespace Unity.PlasticSCM.Editor.Views.PendingChanges
  10. {
  11. internal class PendingChangesViewMenu
  12. {
  13. internal interface IMetaMenuOperations
  14. {
  15. void DiffMeta();
  16. void OpenMeta();
  17. void OpenMetaWith();
  18. void OpenMetaInExplorer();
  19. void HistoryMeta();
  20. bool SelectionHasMeta();
  21. }
  22. internal PendingChangesViewMenu(
  23. IPendingChangesMenuOperations pendingChangesMenuOperations,
  24. IOpenMenuOperations openMenuOperations,
  25. IMetaMenuOperations metaMenuOperations,
  26. IFilesFilterPatternsMenuOperations filterMenuOperations,
  27. bool isGluonMode)
  28. {
  29. mPendingChangesMenuOperations = pendingChangesMenuOperations;
  30. mOpenMenuOperations = openMenuOperations;
  31. mMetaMenuOperations = metaMenuOperations;
  32. mIsGluonMode = isGluonMode;
  33. mFilterMenuBuilder = new FilesFilterPatternsMenuBuilder(filterMenuOperations);
  34. BuildComponents();
  35. }
  36. internal void Popup()
  37. {
  38. GenericMenu menu = new GenericMenu();
  39. UpdateMenuItems(menu);
  40. menu.ShowAsContext();
  41. }
  42. internal bool ProcessKeyActionIfNeeded(Event e)
  43. {
  44. PendingChangesMenuOperations operationToExecute =
  45. GetPendingChangesMenuOperation(e);
  46. OpenMenuOperations openOperationToExecute =
  47. GetOpenMenuOperation(e);
  48. if (operationToExecute == PendingChangesMenuOperations.None &&
  49. openOperationToExecute == OpenMenuOperations.None)
  50. return false;
  51. SelectedChangesGroupInfo info =
  52. mPendingChangesMenuOperations.GetSelectedChangesGroupInfo();
  53. if (operationToExecute != PendingChangesMenuOperations.None)
  54. return ProcessKeyActionForPendingChangesMenu(
  55. operationToExecute, mPendingChangesMenuOperations, info, mIsGluonMode);
  56. return ProcessKeyActionForOpenMenu(
  57. openOperationToExecute, mOpenMenuOperations, info);
  58. }
  59. void OpenMenuItem_Click()
  60. {
  61. mOpenMenuOperations.Open();
  62. }
  63. void OpenWithMenuItem_Click()
  64. {
  65. mOpenMenuOperations.OpenWith();
  66. }
  67. void OpenInExplorerMenuItem_Click()
  68. {
  69. mOpenMenuOperations.OpenInExplorer();
  70. }
  71. void OpenMetaMenuItem_Click()
  72. {
  73. mMetaMenuOperations.OpenMeta();
  74. }
  75. void OpenMetaWithMenuItem_Click()
  76. {
  77. mMetaMenuOperations.OpenMetaWith();
  78. }
  79. void OpenMetaInExplorerMenuItem_Click()
  80. {
  81. mMetaMenuOperations.OpenMetaInExplorer();
  82. }
  83. void DiffMenuItem_Click()
  84. {
  85. mPendingChangesMenuOperations.Diff();
  86. }
  87. void DiffMetaMenuItem_Click()
  88. {
  89. mMetaMenuOperations.DiffMeta();
  90. }
  91. void UndoChangesMenuItem_Click()
  92. {
  93. mPendingChangesMenuOperations.UndoChanges();
  94. }
  95. void CheckoutMenuItem_Click()
  96. {
  97. mPendingChangesMenuOperations.ApplyLocalChanges();
  98. }
  99. void DeleteMenuItem_Click()
  100. {
  101. mPendingChangesMenuOperations.Delete();
  102. }
  103. void HistoryMenuItem_Click()
  104. {
  105. mPendingChangesMenuOperations.History();
  106. }
  107. void HistoryMetaMenuItem_Click()
  108. {
  109. mMetaMenuOperations.HistoryMeta();
  110. }
  111. void UpdateMenuItems(GenericMenu menu)
  112. {
  113. SelectedChangesGroupInfo info =
  114. mPendingChangesMenuOperations.GetSelectedChangesGroupInfo();
  115. PendingChangesMenuOperations operations =
  116. PendingChangesMenuUpdater.GetAvailableMenuOperations(info);
  117. OpenMenuOperations openOperations =
  118. GetOpenMenuOperations.ForPendingChanges(info);
  119. if (operations == PendingChangesMenuOperations.None &&
  120. openOperations == OpenMenuOperations.None)
  121. {
  122. menu.AddDisabledItem(GetNoActionMenuItemContent());
  123. return;
  124. }
  125. UpdateOpenMenuItems(menu, openOperations);
  126. menu.AddSeparator(string.Empty);
  127. if (operations.HasFlag(PendingChangesMenuOperations.DiffWorkspaceContent))
  128. menu.AddItem(mDiffMenuItemContent, false, DiffMenuItem_Click);
  129. else
  130. menu.AddDisabledItem(mDiffMenuItemContent);
  131. if (mMetaMenuOperations.SelectionHasMeta())
  132. {
  133. if (operations.HasFlag(PendingChangesMenuOperations.DiffWorkspaceContent))
  134. menu.AddItem(mDiffMetaMenuItemContent, false, DiffMetaMenuItem_Click);
  135. else
  136. menu.AddDisabledItem(mDiffMetaMenuItemContent);
  137. }
  138. menu.AddSeparator(string.Empty);
  139. if (operations.HasFlag(PendingChangesMenuOperations.UndoChanges))
  140. menu.AddItem(mUndoChangesMenuItemContent, false, UndoChangesMenuItem_Click);
  141. else
  142. menu.AddDisabledItem(mUndoChangesMenuItemContent);
  143. menu.AddSeparator(string.Empty);
  144. if (operations.HasFlag(PendingChangesMenuOperations.ApplyLocalChanges))
  145. menu.AddItem(mCheckoutMenuItemContent, false, CheckoutMenuItem_Click);
  146. else
  147. menu.AddDisabledItem(mCheckoutMenuItemContent);
  148. if (operations.HasFlag(PendingChangesMenuOperations.Delete))
  149. menu.AddItem(mDeleteMenuItemContent, false, DeleteMenuItem_Click);
  150. else
  151. menu.AddDisabledItem(mDeleteMenuItemContent);
  152. menu.AddSeparator(string.Empty);
  153. mFilterMenuBuilder.UpdateMenuItems(
  154. menu, FilterMenuUpdater.GetMenuActions(info));
  155. menu.AddSeparator(string.Empty);
  156. if (operations.HasFlag(PendingChangesMenuOperations.History))
  157. menu.AddItem(mViewHistoryMenuItemContent, false, HistoryMenuItem_Click);
  158. else
  159. menu.AddDisabledItem(mViewHistoryMenuItemContent, false);
  160. if (mMetaMenuOperations.SelectionHasMeta())
  161. {
  162. if (operations.HasFlag(PendingChangesMenuOperations.History))
  163. menu.AddItem(mViewHistoryMetaMenuItemContent, false, HistoryMetaMenuItem_Click);
  164. else
  165. menu.AddDisabledItem(mViewHistoryMetaMenuItemContent);
  166. }
  167. }
  168. void UpdateOpenMenuItems(GenericMenu menu, OpenMenuOperations operations)
  169. {
  170. if (!operations.HasFlag(OpenMenuOperations.Open) &&
  171. !operations.HasFlag(OpenMenuOperations.OpenWith) &&
  172. !operations.HasFlag(OpenMenuOperations.OpenInExplorer))
  173. {
  174. menu.AddDisabledItem(mOpenSubmenuItemContent);
  175. return;
  176. }
  177. if (operations.HasFlag(OpenMenuOperations.Open))
  178. menu.AddItem(mOpenMenuItemContent, false, OpenMenuItem_Click);
  179. else
  180. menu.AddDisabledItem(mOpenMenuItemContent);
  181. if (operations.HasFlag(OpenMenuOperations.OpenWith))
  182. menu.AddItem(mOpenWithMenuItemContent, false, OpenWithMenuItem_Click);
  183. else
  184. menu.AddDisabledItem(mOpenWithMenuItemContent);
  185. if (operations.HasFlag(OpenMenuOperations.OpenInExplorer))
  186. menu.AddItem(mOpenInExplorerMenuItemContent, false, OpenInExplorerMenuItem_Click);
  187. else
  188. menu.AddDisabledItem(mOpenInExplorerMenuItemContent);
  189. if (!mMetaMenuOperations.SelectionHasMeta())
  190. return;
  191. menu.AddSeparator(PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen) + "/");
  192. if (operations.HasFlag(OpenMenuOperations.Open))
  193. menu.AddItem(mOpenMetaMenuItemContent, false, OpenMetaMenuItem_Click);
  194. else
  195. menu.AddDisabledItem(mOpenMetaMenuItemContent);
  196. if (operations.HasFlag(OpenMenuOperations.OpenWith))
  197. menu.AddItem(mOpenMetaWithMenuItemContent, false, OpenMetaWithMenuItem_Click);
  198. else
  199. menu.AddDisabledItem(mOpenMetaWithMenuItemContent);
  200. if (operations.HasFlag(OpenMenuOperations.OpenInExplorer))
  201. menu.AddItem(mOpenMetaInExplorerMenuItemContent, false, OpenMetaInExplorerMenuItem_Click);
  202. else
  203. menu.AddDisabledItem(mOpenMetaInExplorerMenuItemContent);
  204. }
  205. GUIContent GetNoActionMenuItemContent()
  206. {
  207. if (mNoActionMenuItemContent == null)
  208. {
  209. mNoActionMenuItemContent = new GUIContent(PlasticLocalization.GetString(
  210. PlasticLocalization.Name.NoActionMenuItem));
  211. }
  212. return mNoActionMenuItemContent;
  213. }
  214. void BuildComponents()
  215. {
  216. mOpenSubmenuItemContent = new GUIContent(
  217. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen));
  218. mOpenMenuItemContent = new GUIContent(
  219. UnityMenuItem.GetText(
  220. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  221. string.Format("{0} {1}",
  222. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  223. GetPlasticShortcut.ForOpen())));
  224. mOpenWithMenuItemContent = new GUIContent(
  225. UnityMenuItem.GetText(
  226. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  227. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpenWith)));
  228. mOpenInExplorerMenuItemContent = new GUIContent(
  229. UnityMenuItem.GetText(
  230. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  231. PlasticLocalization.GetString(PlasticLocalization.Name.OpenInExplorerMenuItem)));
  232. mOpenMetaMenuItemContent = new GUIContent(
  233. UnityMenuItem.GetText(
  234. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  235. PlasticLocalization.GetString(PlasticLocalization.Name.OpenMeta)));
  236. mOpenMetaWithMenuItemContent = new GUIContent(
  237. UnityMenuItem.GetText(
  238. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  239. PlasticLocalization.GetString(PlasticLocalization.Name.OpenMetaWith)));
  240. mOpenMetaInExplorerMenuItemContent = new GUIContent(
  241. UnityMenuItem.GetText(
  242. PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
  243. PlasticLocalization.GetString(PlasticLocalization.Name.OpenMetaInExplorer)));
  244. mDiffMenuItemContent = new GUIContent(string.Format("{0} {1}",
  245. PlasticLocalization.GetString(PlasticLocalization.Name.DiffMenuItem),
  246. GetPlasticShortcut.ForDiff()));
  247. mDiffMetaMenuItemContent = new GUIContent(
  248. PlasticLocalization.GetString(PlasticLocalization.Name.DiffMetaMenuItem));
  249. mUndoChangesMenuItemContent = new GUIContent(
  250. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemUndoChanges));
  251. mCheckoutMenuItemContent = new GUIContent(
  252. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemCheckout));
  253. mDeleteMenuItemContent = new GUIContent(string.Format("{0} {1}",
  254. PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemDelete),
  255. GetPlasticShortcut.ForDelete()));
  256. mViewHistoryMenuItemContent = new GUIContent(string.Format("{0} {1}",
  257. PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMenuItem),
  258. GetPlasticShortcut.ForHistory()));
  259. mViewHistoryMetaMenuItemContent = new GUIContent(
  260. PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMetaMenuItem));
  261. mFilterMenuBuilder.BuildIgnoredSubmenuItem();
  262. mFilterMenuBuilder.BuildHiddenChangesSubmenuItem();
  263. }
  264. static bool ProcessKeyActionForPendingChangesMenu(
  265. PendingChangesMenuOperations operationToExecute,
  266. IPendingChangesMenuOperations pendingChangesMenuOperations,
  267. SelectedChangesGroupInfo info,
  268. bool isGluonMode)
  269. {
  270. PendingChangesMenuOperations operations =
  271. PendingChangesMenuUpdater.GetAvailableMenuOperations(info);
  272. if (!operations.HasFlag(operationToExecute))
  273. return false;
  274. ProcessPendingChangesMenuOperation(
  275. operationToExecute, pendingChangesMenuOperations, isGluonMode);
  276. return true;
  277. }
  278. static bool ProcessKeyActionForOpenMenu(
  279. OpenMenuOperations openOperationToExecute,
  280. IOpenMenuOperations openMenuOperations,
  281. SelectedChangesGroupInfo info)
  282. {
  283. OpenMenuOperations openOperations =
  284. GetOpenMenuOperations.ForPendingChanges(info);
  285. if (!openOperations.HasFlag(openOperationToExecute))
  286. return false;
  287. ProcessOpenMenuOperation(
  288. openOperationToExecute, openMenuOperations);
  289. return true;
  290. }
  291. static void ProcessPendingChangesMenuOperation(
  292. PendingChangesMenuOperations operationToExecute,
  293. IPendingChangesMenuOperations pendingChangesMenuOperations,
  294. bool isGluonMode)
  295. {
  296. if (operationToExecute == PendingChangesMenuOperations.DiffWorkspaceContent)
  297. {
  298. if (LaunchTool.ShowDownloadPlasticExeWindow(isGluonMode))
  299. return;
  300. pendingChangesMenuOperations.Diff();
  301. return;
  302. }
  303. if (operationToExecute == PendingChangesMenuOperations.Delete)
  304. {
  305. pendingChangesMenuOperations.Delete();
  306. return;
  307. }
  308. if (operationToExecute == PendingChangesMenuOperations.History)
  309. {
  310. pendingChangesMenuOperations.History();
  311. return;
  312. }
  313. }
  314. static void ProcessOpenMenuOperation(
  315. OpenMenuOperations openOperationToExecute,
  316. IOpenMenuOperations openMenuOperations)
  317. {
  318. if (openOperationToExecute == OpenMenuOperations.Open)
  319. {
  320. openMenuOperations.Open();
  321. return;
  322. }
  323. }
  324. static PendingChangesMenuOperations GetPendingChangesMenuOperation(Event e)
  325. {
  326. if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.D))
  327. return PendingChangesMenuOperations.DiffWorkspaceContent;
  328. if (Keyboard.IsKeyPressed(e, KeyCode.Delete))
  329. return PendingChangesMenuOperations.Delete;
  330. if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.H))
  331. return PendingChangesMenuOperations.History;
  332. return PendingChangesMenuOperations.None;
  333. }
  334. static OpenMenuOperations GetOpenMenuOperation(Event e)
  335. {
  336. if (Keyboard.IsShiftPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.O))
  337. return OpenMenuOperations.Open;
  338. return OpenMenuOperations.None;
  339. }
  340. GUIContent mNoActionMenuItemContent;
  341. GUIContent mOpenSubmenuItemContent;
  342. GUIContent mOpenMenuItemContent;
  343. GUIContent mOpenWithMenuItemContent;
  344. GUIContent mOpenInExplorerMenuItemContent;
  345. GUIContent mOpenMetaMenuItemContent;
  346. GUIContent mOpenMetaWithMenuItemContent;
  347. GUIContent mOpenMetaInExplorerMenuItemContent;
  348. GUIContent mDiffMenuItemContent;
  349. GUIContent mDiffMetaMenuItemContent;
  350. GUIContent mUndoChangesMenuItemContent;
  351. GUIContent mCheckoutMenuItemContent;
  352. GUIContent mDeleteMenuItemContent;
  353. GUIContent mViewHistoryMenuItemContent;
  354. GUIContent mViewHistoryMetaMenuItemContent;
  355. FilesFilterPatternsMenuBuilder mFilterMenuBuilder;
  356. IMetaMenuOperations mMetaMenuOperations;
  357. IOpenMenuOperations mOpenMenuOperations;
  358. IPendingChangesMenuOperations mPendingChangesMenuOperations;
  359. bool mIsGluonMode;
  360. }
  361. }