AssetOperations.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. using System.IO;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEditor.VersionControl;
  5. using Codice.Client.Commands;
  6. using Codice.Client.Commands.WkTree;
  7. using Codice.Client.Common;
  8. using Codice.Client.Common.Threading;
  9. using Codice.CM.Common;
  10. using GluonGui;
  11. using PlasticGui;
  12. using PlasticGui.Gluon;
  13. using PlasticGui.WorkspaceWindow;
  14. using PlasticGui.WorkspaceWindow.Diff;
  15. using PlasticGui.WorkspaceWindow.Items;
  16. using Unity.PlasticSCM.Editor.AssetMenu.Dialogs;
  17. using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
  18. using Unity.PlasticSCM.Editor.AssetUtils;
  19. using Unity.PlasticSCM.Editor.UI;
  20. using GluonCheckoutOperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.CheckoutOperation;
  21. using GluonUndoCheckoutOperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.UndoCheckoutOperation;
  22. using GluonAddoperation = GluonGui.WorkspaceWindow.Views.WorkspaceExplorer.Explorer.Operations.AddOperation;
  23. using Unity.PlasticSCM.Editor.Tool;
  24. namespace Unity.PlasticSCM.Editor.AssetMenu
  25. {
  26. internal class AssetOperations : IAssetMenuOperations
  27. {
  28. internal interface IAssetSelection
  29. {
  30. AssetList GetSelectedAssets();
  31. }
  32. internal AssetOperations(
  33. WorkspaceInfo wkInfo,
  34. IWorkspaceWindow workspaceWindow,
  35. IViewSwitcher viewSwitcher,
  36. IHistoryViewLauncher historyViewLauncher,
  37. ViewHost viewHost,
  38. NewIncomingChangesUpdater newIncomingChangesUpdater,
  39. IAssetStatusCache assetStatusCache,
  40. IMergeViewLauncher mergeViewLauncher,
  41. IGluonViewSwitcher gluonViewSwitcher,
  42. EditorWindow parentWindow,
  43. IAssetSelection assetSelection,
  44. bool isGluonMode)
  45. {
  46. mWkInfo = wkInfo;
  47. mWorkspaceWindow = workspaceWindow;
  48. mViewSwitcher = viewSwitcher;
  49. mHistoryViewLauncher = historyViewLauncher;
  50. mViewHost = viewHost;
  51. mNewIncomingChangesUpdater = newIncomingChangesUpdater;
  52. mAssetStatusCache = assetStatusCache;
  53. mMergeViewLauncher = mergeViewLauncher;
  54. mGluonViewSwitcher = gluonViewSwitcher;
  55. mAssetSelection = assetSelection;
  56. mIsGluonMode = isGluonMode;
  57. mParentWindow = parentWindow;
  58. mGuiMessage = new UnityPlasticGuiMessage(parentWindow);
  59. mProgressControls = new EditorProgressControls(mGuiMessage);
  60. }
  61. void IAssetMenuOperations.ShowPendingChanges()
  62. {
  63. mViewSwitcher.ShowPendingChanges();
  64. }
  65. void IAssetMenuOperations.Add()
  66. {
  67. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  68. mAssetSelection,
  69. mAssetStatusCache,
  70. AssetMenuOperations.Add);
  71. if (mIsGluonMode)
  72. {
  73. GluonAddoperation.Add(
  74. mViewHost,
  75. mProgressControls,
  76. mGuiMessage,
  77. selectedPaths.ToArray(),
  78. false,
  79. RefreshAsset.VersionControlCache);
  80. return;
  81. }
  82. AddOperation.Run(
  83. mWorkspaceWindow,
  84. mProgressControls,
  85. null,
  86. null,
  87. selectedPaths,
  88. false,
  89. mNewIncomingChangesUpdater,
  90. RefreshAsset.VersionControlCache);
  91. }
  92. void IAssetMenuOperations.Checkout()
  93. {
  94. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  95. mAssetSelection,
  96. mAssetStatusCache,
  97. AssetMenuOperations.Checkout);
  98. if (mIsGluonMode)
  99. {
  100. GluonCheckoutOperation.Checkout(
  101. mViewHost,
  102. mProgressControls,
  103. mGuiMessage,
  104. selectedPaths.ToArray(),
  105. false,
  106. RefreshAsset.VersionControlCache);
  107. return;
  108. }
  109. CheckoutOperation.Checkout(
  110. mWorkspaceWindow,
  111. null,
  112. mProgressControls,
  113. selectedPaths,
  114. mNewIncomingChangesUpdater,
  115. RefreshAsset.VersionControlCache);
  116. }
  117. void IAssetMenuOperations.Checkin()
  118. {
  119. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  120. mAssetSelection,
  121. mAssetStatusCache,
  122. AssetMenuOperations.Checkin);
  123. if (!CheckinDialog.CheckinPaths(
  124. mWkInfo,
  125. selectedPaths,
  126. mAssetStatusCache,
  127. mIsGluonMode,
  128. mParentWindow,
  129. mWorkspaceWindow,
  130. mViewHost,
  131. mGuiMessage,
  132. mMergeViewLauncher,
  133. mGluonViewSwitcher))
  134. return;
  135. RefreshAsset.UnityAssetDatabase();
  136. }
  137. void IAssetMenuOperations.Undo()
  138. {
  139. List<string> selectedPaths = GetSelectedPaths.ForOperation(
  140. mAssetSelection,
  141. mAssetStatusCache,
  142. AssetMenuOperations.Undo);
  143. SaveAssets.ForPathsWithoutConfirmation(selectedPaths);
  144. if (mIsGluonMode)
  145. {
  146. GluonUndoCheckoutOperation.UndoCheckout(
  147. mWkInfo,
  148. mViewHost,
  149. mProgressControls,
  150. mGuiMessage,
  151. selectedPaths.ToArray(),
  152. false,
  153. RefreshAsset.UnityAssetDatabase);
  154. return;
  155. }
  156. UndoCheckoutOperation.Run(
  157. mWorkspaceWindow,
  158. null,
  159. mProgressControls,
  160. selectedPaths,
  161. mNewIncomingChangesUpdater,
  162. RefreshAsset.UnityAssetDatabase);
  163. }
  164. void IAssetMenuOperations.ShowDiff()
  165. {
  166. if (LaunchTool.ShowDownloadPlasticExeWindow(mIsGluonMode))
  167. return;
  168. string selectedPath = AssetsSelection.GetSelectedPath(
  169. mAssetSelection.GetSelectedAssets());
  170. DiffInfo diffInfo = null;
  171. IThreadWaiter waiter = ThreadWaiter.GetWaiter(10);
  172. waiter.Execute(
  173. /*threadOperationDelegate*/ delegate
  174. {
  175. string symbolicName = GetSymbolicName(selectedPath);
  176. string extension = Path.GetExtension(selectedPath);
  177. diffInfo = PlasticGui.Plastic.API.BuildDiffInfoForDiffWithPrevious(
  178. selectedPath, symbolicName, selectedPath, extension, mWkInfo);
  179. },
  180. /*afterOperationDelegate*/ delegate
  181. {
  182. if (waiter.Exception != null)
  183. {
  184. ExceptionsHandler.DisplayException(waiter.Exception);
  185. return;
  186. }
  187. DiffOperation.DiffWithPrevious(
  188. diffInfo,
  189. null,
  190. null);
  191. });
  192. }
  193. void IAssetMenuOperations.ShowHistory()
  194. {
  195. if (LaunchTool.ShowDownloadPlasticExeWindow(mIsGluonMode))
  196. return;
  197. AssetList assetList = mAssetSelection.GetSelectedAssets();
  198. Asset selectedAsset = AssetsSelection.GetSelectedAsset(
  199. assetList);
  200. string selectedPath = AssetsSelection.GetSelectedPath(
  201. assetList);
  202. WorkspaceTreeNode node = PlasticGui.Plastic.API.
  203. GetWorkspaceTreeNode(selectedPath);
  204. mHistoryViewLauncher.ShowHistoryView(
  205. node.RepSpec,
  206. node.RevInfo.ItemId,
  207. selectedPath,
  208. selectedAsset.isFolder);
  209. }
  210. static string GetSymbolicName(string selectedPath)
  211. {
  212. WorkspaceTreeNode node = PlasticGui.Plastic.API.
  213. GetWorkspaceTreeNode(selectedPath);
  214. string branchName = string.Empty;
  215. BranchInfoCache.TryGetBranchName(
  216. node.RepSpec, node.RevInfo.BranchId, out branchName);
  217. string userName = PlasticGui.Plastic.API.GetUserName(
  218. node.RepSpec.Server, node.RevInfo.Owner);
  219. string symbolicName = string.Format(
  220. "cs:{0}@{1} {2} {3}",
  221. node.RevInfo.Changeset,
  222. string.Format("br:{0}", branchName),
  223. userName,
  224. "Workspace Revision");
  225. return symbolicName;
  226. }
  227. readonly WorkspaceInfo mWkInfo;
  228. readonly IViewSwitcher mViewSwitcher;
  229. readonly IHistoryViewLauncher mHistoryViewLauncher;
  230. readonly IWorkspaceWindow mWorkspaceWindow;
  231. readonly ViewHost mViewHost;
  232. readonly NewIncomingChangesUpdater mNewIncomingChangesUpdater;
  233. readonly IAssetStatusCache mAssetStatusCache;
  234. readonly IMergeViewLauncher mMergeViewLauncher;
  235. readonly IGluonViewSwitcher mGluonViewSwitcher;
  236. readonly bool mIsGluonMode;
  237. readonly GuiMessage.IGuiMessage mGuiMessage;
  238. readonly EditorProgressControls mProgressControls;
  239. readonly EditorWindow mParentWindow;
  240. readonly IAssetSelection mAssetSelection;
  241. static class GetSelectedPaths
  242. {
  243. internal static List<string> ForOperation(
  244. IAssetSelection assetSelection,
  245. IAssetStatusCache assetStatusCache,
  246. AssetMenuOperations operation)
  247. {
  248. List<string> selectedPaths = AssetsSelection.GetSelectedPaths(
  249. assetSelection.GetSelectedAssets());
  250. List<string> result = new List<string>(selectedPaths);
  251. foreach (string path in selectedPaths)
  252. {
  253. if (MetaPath.IsMetaPath(path))
  254. continue;
  255. string metaPath = MetaPath.GetMetaPath(path);
  256. if (!File.Exists(metaPath))
  257. continue;
  258. if (result.Contains(metaPath))
  259. continue;
  260. if (!IsApplicableForOperation(
  261. metaPath, false, operation, assetStatusCache))
  262. continue;
  263. result.Add(metaPath);
  264. }
  265. return result;
  266. }
  267. static bool IsApplicableForOperation(
  268. string path,
  269. bool isDirectory,
  270. AssetMenuOperations operation,
  271. IAssetStatusCache assetStatusCache)
  272. {
  273. SelectedAssetGroupInfo info = SelectedAssetGroupInfo.BuildFromSingleFile(
  274. path, isDirectory, assetStatusCache);
  275. return AssetMenuUpdater.GetAvailableMenuOperations(info).HasFlag(operation);
  276. }
  277. }
  278. }
  279. }