Няма описание
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.

PendingChangesViewPendingChangeMenu.cs 18KB

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