A game about forced loneliness, made by TACStudios
1using UnityEditor.VersionControl; 2 3using Codice.CM.Common; 4using Codice.Client.Common.EventTracking; 5using Codice.LogWrapper; 6using PlasticGui; 7using PlasticGui.WorkspaceWindow; 8using PlasticGui.WorkspaceWindow.Items; 9using Unity.PlasticSCM.Editor.AssetsOverlays.Cache; 10using Unity.PlasticSCM.Editor.AssetUtils; 11using Unity.PlasticSCM.Editor.AssetUtils.Processor; 12using Unity.PlasticSCM.Editor.UI; 13using Unity.PlasticSCM.Editor.Tool; 14 15namespace Unity.PlasticSCM.Editor.AssetMenu 16{ 17 internal class AssetMenuItems 18 { 19 internal static void Enable( 20 WorkspaceInfo wkInfo, 21 IPlasticAPI plasticApi, 22 IAssetStatusCache assetStatusCache) 23 { 24 if (mIsEnabled) 25 return; 26 27 mLog.Debug("Enable"); 28 29 mWkInfo = wkInfo; 30 mPlasticAPI = plasticApi; 31 mAssetStatusCache = assetStatusCache; 32 33 mIsEnabled = true; 34 35 mAssetSelection = new ProjectViewAssetSelection(UpdateFilterMenuItems); 36 37 mAssetMenuCopyPathOperation = new AssetCopyPathOperation( 38 wkInfo, mPlasticAPI, assetStatusCache, mAssetSelection); 39 40 mFilterMenuBuilder = new AssetFilesFilterPatternsMenuBuilder( 41 IGNORE_MENU_ITEMS_PRIORITY, 42 HIDDEN_MENU_ITEMS_PRIORITY); 43 44 AddMenuItems(); 45 } 46 47 internal static void Disable() 48 { 49 mLog.Debug("Disable"); 50 51 mIsEnabled = false; 52 53 RemoveMenuItems(); 54 55 if (mAssetSelection != null) 56 mAssetSelection.Dispose(); 57 58 mWkInfo = null; 59 mAssetStatusCache = null; 60 mAssetSelection = null; 61 mFilterMenuBuilder = null; 62 mAssetMenuVcsOperations = null; 63 mAssetMenuCopyPathOperation = null; 64 } 65 66 internal static void BuildOperations( 67 WorkspaceInfo wkInfo, 68 IPlasticAPI plasticApi, 69 WorkspaceWindow workspaceWindow, 70 IViewSwitcher viewSwitcher, 71 IHistoryViewLauncher historyViewLauncher, 72 GluonGui.ViewHost viewHost, 73 WorkspaceOperationsMonitor workspaceOperationsMonitor, 74 ISaveAssets saveAssets, 75 PlasticGui.WorkspaceWindow.NewIncomingChangesUpdater incomingChangesUpdater, 76 ShelvedChangesUpdater shelvedChangesUpdater, 77 IAssetStatusCache assetStatusCache, 78 IMergeViewLauncher mergeViewLauncher, 79 PlasticGui.Gluon.IGluonViewSwitcher gluonViewSwitcher, 80 LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow, 81 bool isGluonMode) 82 { 83 if (!mIsEnabled) 84 Enable(wkInfo, plasticApi, assetStatusCache); 85 86 AssetVcsOperations assetVcsOperations = new AssetVcsOperations( 87 wkInfo, 88 plasticApi, 89 workspaceWindow, 90 viewSwitcher, 91 historyViewLauncher, 92 viewHost, 93 workspaceOperationsMonitor, 94 saveAssets, 95 incomingChangesUpdater, 96 shelvedChangesUpdater, 97 mAssetStatusCache, 98 mergeViewLauncher, 99 gluonViewSwitcher, 100 mAssetSelection, 101 showDownloadPlasticExeWindow, 102 isGluonMode); 103 104 mAssetMenuVcsOperations = assetVcsOperations; 105 mFilterMenuBuilder.SetOperations(assetVcsOperations); 106 } 107 108 static void RemoveMenuItems() 109 { 110 mFilterMenuBuilder.RemoveMenuItems(); 111 112 HandleMenuItem.RemoveMenuItem( 113 PlasticLocalization.GetString(PlasticLocalization.Name.PrefixUnityVersionControlMenu)); 114 115 HandleMenuItem.UpdateAllMenus(); 116 } 117 118 static void UpdateFilterMenuItems() 119 { 120 AssetList assetList = ((AssetVcsOperations.IAssetSelection) 121 mAssetSelection).GetSelectedAssets(); 122 123 SelectedPathsGroupInfo info = AssetsSelection.GetSelectedPathsGroupInfo( 124 mWkInfo.ClientPath, assetList, mAssetStatusCache); 125 126 FilterMenuActions actions = 127 assetList.Count != info.SelectedCount ? 128 new FilterMenuActions() : 129 FilterMenuUpdater.GetMenuActions(info); 130 131 mFilterMenuBuilder.UpdateMenuItems(actions); 132 } 133 134 static void AddMenuItems() 135 { 136 // TODO: Try removing this 137 // Somehow first item always disappears. So this is a filler item 138 HandleMenuItem.AddMenuItem( 139 GetPlasticMenuItemName(PlasticLocalization.Name.PendingChangesPlasticMenu), 140 PENDING_CHANGES_MENU_ITEM_PRIORITY, 141 PendingChanges, ValidatePendingChanges); 142 HandleMenuItem.AddMenuItem( 143 GetPlasticMenuItemName(PlasticLocalization.Name.PendingChangesPlasticMenu), 144 PENDING_CHANGES_MENU_ITEM_PRIORITY, 145 PendingChanges, ValidatePendingChanges); 146 HandleMenuItem.AddMenuItem( 147 GetPlasticMenuItemName(PlasticLocalization.Name.AddPlasticMenu), 148 ADD_MENU_ITEM_PRIORITY, 149 Add, ValidateAdd); 150 HandleMenuItem.AddMenuItem( 151 GetPlasticMenuItemName(PlasticLocalization.Name.CheckoutPlasticMenu), 152 CHECKOUT_MENU_ITEM_PRIORITY, 153 Checkout, ValidateCheckout); 154 HandleMenuItem.AddMenuItem( 155 GetPlasticMenuItemName(PlasticLocalization.Name.CheckinPlasticMenu), 156 CHECKIN_MENU_ITEM_PRIORITY, 157 Checkin, ValidateCheckin); 158 HandleMenuItem.AddMenuItem( 159 GetPlasticMenuItemName(PlasticLocalization.Name.UndoPlasticMenu), 160 UNDO_MENU_ITEM_PRIORITY, 161 Undo, ValidateUndo); 162 163 HandleMenuItem.AddMenuItem( 164 GetPlasticMenuItemName(PlasticLocalization.Name.CopyFilePathMenuItem), 165 COPY_FILE_PATH_MENU_ITEM_PRIORITY, 166 CopyFilePath, 167 ValidateCopyFilePath); 168 HandleMenuItem.AddMenuItem( 169 GetPlasticMenuItemName(PlasticLocalization.Name.CopyRelativeFilePathMenuItem), 170 COPY_RELATIVE_FILE_PATH_MENU_ITEM_PRIORITY, 171 CopyRelativeFilePath, 172 ValidateCopyFilePath); 173 174 UpdateFilterMenuItems(); 175 176 HandleMenuItem.AddMenuItem( 177 GetPlasticMenuItemName(PlasticLocalization.Name.DiffPlasticMenu), 178 GetPlasticShortcut.ForAssetDiff(), 179 DIFF_MENU_ITEM_PRIORITY, 180 Diff, ValidateDiff); 181 HandleMenuItem.AddMenuItem( 182 GetPlasticMenuItemName(PlasticLocalization.Name.HistoryPlasticMenu), 183 GetPlasticShortcut.ForHistory(), 184 HISTORY_MENU_ITEM_PRIORITY, 185 History, ValidateHistory); 186 187 HandleMenuItem.UpdateAllMenus(); 188 } 189 190 static void PendingChanges() 191 { 192 ShowWindow.Plastic(); 193 194 mAssetMenuVcsOperations.ShowPendingChanges(); 195 } 196 197 static bool ValidatePendingChanges() 198 { 199 return true; 200 } 201 202 static void Add() 203 { 204 if (mAssetMenuVcsOperations == null) 205 ShowWindow.Plastic(); 206 207 mAssetMenuVcsOperations.Add(); 208 } 209 210 static bool ValidateAdd() 211 { 212 return ShouldMenuItemBeEnabled( 213 mWkInfo, mAssetSelection, mAssetStatusCache, 214 AssetMenuOperations.Add); 215 } 216 217 static void Checkout() 218 { 219 if (mAssetMenuVcsOperations == null) 220 ShowWindow.Plastic(); 221 222 mAssetMenuVcsOperations.Checkout(); 223 } 224 225 static bool ValidateCheckout() 226 { 227 return ShouldMenuItemBeEnabled( 228 mWkInfo, mAssetSelection, mAssetStatusCache, 229 AssetMenuOperations.Checkout); 230 } 231 232 static void Checkin() 233 { 234 TrackFeatureUseEvent.For( 235 PlasticGui.Plastic.API.GetRepositorySpec(mWkInfo), 236 TrackFeatureUseEvent.Features.ContextMenuCheckinOption); 237 238 if (mAssetMenuVcsOperations == null) 239 ShowWindow.Plastic(); 240 241 mAssetMenuVcsOperations.Checkin(); 242 } 243 244 static bool ValidateCheckin() 245 { 246 return ShouldMenuItemBeEnabled( 247 mWkInfo, mAssetSelection, mAssetStatusCache, 248 AssetMenuOperations.Checkin); 249 } 250 251 static void Undo() 252 { 253 if (mAssetMenuVcsOperations == null) 254 ShowWindow.Plastic(); 255 256 mAssetMenuVcsOperations.Undo(); 257 } 258 259 static bool ValidateUndo() 260 { 261 return ShouldMenuItemBeEnabled( 262 mWkInfo, mAssetSelection, mAssetStatusCache, 263 AssetMenuOperations.Undo); 264 } 265 266 static void CopyFilePath() 267 { 268 mAssetMenuCopyPathOperation.CopyFilePath(relativePath: false); 269 } 270 271 static void CopyRelativeFilePath() 272 { 273 mAssetMenuCopyPathOperation.CopyFilePath(relativePath: true); 274 } 275 276 static bool ValidateCopyFilePath() 277 { 278 return ShouldMenuItemBeEnabled( 279 mWkInfo, mAssetSelection, mAssetStatusCache, 280 AssetMenuOperations.CopyFilePath); 281 } 282 283 static void Diff() 284 { 285 if (mAssetMenuVcsOperations == null) 286 ShowWindow.Plastic(); 287 288 mAssetMenuVcsOperations.ShowDiff(); 289 } 290 291 static bool ValidateDiff() 292 { 293 return ShouldMenuItemBeEnabled( 294 mWkInfo, mAssetSelection, mAssetStatusCache, 295 AssetMenuOperations.Diff); 296 } 297 298 static void History() 299 { 300 ShowWindow.Plastic(); 301 302 mAssetMenuVcsOperations.ShowHistory(); 303 } 304 305 static bool ValidateHistory() 306 { 307 return ShouldMenuItemBeEnabled( 308 mWkInfo, mAssetSelection, mAssetStatusCache, 309 AssetMenuOperations.History); 310 } 311 312 static bool ShouldMenuItemBeEnabled( 313 WorkspaceInfo wkInfo, 314 AssetVcsOperations.IAssetSelection assetSelection, 315 IAssetStatusCache statusCache, 316 AssetMenuOperations operation) 317 { 318 AssetList assetList = assetSelection.GetSelectedAssets(); 319 320 if (assetList.Count == 0) 321 return false; 322 323 SelectedAssetGroupInfo selectedGroupInfo = SelectedAssetGroupInfo. 324 BuildFromAssetList(wkInfo, assetList, mPlasticAPI, statusCache); 325 326 if (assetList.Count != selectedGroupInfo.SelectedCount) 327 return false; 328 329 AssetMenuOperations operations = AssetMenuUpdater. 330 GetAvailableMenuOperations(selectedGroupInfo); 331 332 return operations.HasFlag(operation); 333 } 334 335 static string GetPlasticMenuItemName(PlasticLocalization.Name name) 336 { 337 return string.Format("{0}/{1}", 338 PlasticLocalization.GetString(PlasticLocalization.Name.PrefixUnityVersionControlMenu), 339 PlasticLocalization.GetString(name)); 340 } 341 342 static IAssetMenuVCSOperations mAssetMenuVcsOperations; 343 static IAssetMenuCopyPathOperation mAssetMenuCopyPathOperation; 344 345 static ProjectViewAssetSelection mAssetSelection; 346 static AssetFilesFilterPatternsMenuBuilder mFilterMenuBuilder; 347 348 static bool mIsEnabled; 349 static IAssetStatusCache mAssetStatusCache; 350 static IPlasticAPI mPlasticAPI; 351 static WorkspaceInfo mWkInfo; 352 353#if UNITY_6000_0_OR_NEWER 354 // Puts Unity Version Control in a new section, as it precedes the Create menu with the old value 355 const int BASE_MENU_ITEM_PRIORITY = 71; 356#else 357 // Puts Unity Version Control right below the Create menu 358 const int BASE_MENU_ITEM_PRIORITY = 19; 359#endif 360 361 // incrementing the "order" param by 11 causes the menu system to add a separator 362 const int PENDING_CHANGES_MENU_ITEM_PRIORITY = BASE_MENU_ITEM_PRIORITY; 363 const int ADD_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 11; 364 const int CHECKOUT_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 12; 365 const int CHECKIN_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 13; 366 const int UNDO_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 14; 367 const int COPY_FILE_PATH_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 25; 368 const int COPY_RELATIVE_FILE_PATH_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 26; 369 const int IGNORE_MENU_ITEMS_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 37; 370 const int HIDDEN_MENU_ITEMS_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 38; 371 const int DIFF_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 49; 372 const int HISTORY_MENU_ITEM_PRIORITY = PENDING_CHANGES_MENU_ITEM_PRIORITY + 50; 373 374 static readonly ILog mLog = PlasticApp.GetLogger("AssetMenuItems"); 375 } 376}