A game about forced loneliness, made by TACStudios
at master 8.8 kB view raw
1using System; 2 3using UnityEditor.VersionControl; 4 5using Codice; 6using Codice.Client.Commands.Tree; 7using Codice.Client.Commands.WkTree; 8using Codice.CM.Common; 9using PlasticGui; 10using Unity.PlasticSCM.Editor.AssetsOverlays.Cache; 11using Unity.PlasticSCM.Editor.AssetsOverlays; 12using Unity.PlasticSCM.Editor.AssetUtils; 13 14namespace Unity.PlasticSCM.Editor.AssetMenu 15{ 16 [Flags] 17 internal enum AssetMenuOperations : byte 18 { 19 None = 0, 20 Checkout = 1 << 0, 21 Diff = 1 << 1, 22 History = 1 << 2, 23 Add = 1 << 3, 24 Checkin = 1 << 4, 25 Undo = 1 << 5, 26 CopyFilePath = 1 << 6 27 } 28 29 internal class SelectedAssetGroupInfo 30 { 31 internal int SelectedCount; 32 33 internal bool IsControlledSelection; 34 internal bool IsCheckedInSelection; 35 internal bool IsCheckedOutSelection; 36 internal bool IsPrivateSelection; 37 internal bool IsAddedSelection; 38 internal bool IsFileSelection; 39 internal bool IsMovedSelection; 40 internal bool HasAnyAddedInSelection; 41 internal bool HasAnyRemoteLockedInSelection; 42 43 internal static SelectedAssetGroupInfo BuildFromAssetList( 44 WorkspaceInfo wkInfo, 45 AssetList assetList, 46 IPlasticAPI plasticApi, 47 IAssetStatusCache statusCache) 48 { 49 bool isCheckedInSelection = true; 50 bool isControlledSelection = true; 51 bool isCheckedOutSelection = true; 52 bool isPrivateSelection = true; 53 bool isAddedSelection = true; 54 bool isFileSelection = true; 55 bool isMovedSelection = true; 56 bool hasAnyAddedInSelection = false; 57 bool hasAnyRemoteLockedInSelection = false; 58 59 int selectedCount = 0; 60 61 foreach (Asset asset in assetList) 62 { 63 string fullPath = AssetsPath.GetFullPathUnderWorkspace. 64 ForAsset(wkInfo.ClientPath, asset.path); 65 66 if (fullPath == null) 67 continue; 68 69 SelectedAssetGroupInfo singleFileGroupInfo = BuildFromSingleFile( 70 fullPath, asset.isFolder, wkInfo, plasticApi, statusCache); 71 72 if (!singleFileGroupInfo.IsCheckedInSelection) 73 isCheckedInSelection = false; 74 75 if (!singleFileGroupInfo.IsControlledSelection) 76 isControlledSelection = false; 77 78 if (!singleFileGroupInfo.IsCheckedOutSelection) 79 isCheckedOutSelection = false; 80 81 if (!singleFileGroupInfo.IsPrivateSelection) 82 isPrivateSelection = false; 83 84 if (!singleFileGroupInfo.IsAddedSelection) 85 isAddedSelection = false; 86 87 if (!singleFileGroupInfo.IsFileSelection) 88 isFileSelection = false; 89 90 if (!singleFileGroupInfo.IsMovedSelection) 91 isMovedSelection = false; 92 93 if (singleFileGroupInfo.HasAnyAddedInSelection) 94 hasAnyAddedInSelection = true; 95 96 if (singleFileGroupInfo.HasAnyRemoteLockedInSelection) 97 hasAnyRemoteLockedInSelection = true; 98 99 selectedCount++; 100 } 101 102 return new SelectedAssetGroupInfo() 103 { 104 IsCheckedInSelection = isCheckedInSelection, 105 IsCheckedOutSelection = isCheckedOutSelection, 106 IsControlledSelection = isControlledSelection, 107 IsPrivateSelection = isPrivateSelection, 108 IsAddedSelection = isAddedSelection, 109 IsFileSelection = isFileSelection, 110 IsMovedSelection = isMovedSelection, 111 HasAnyAddedInSelection = hasAnyAddedInSelection, 112 HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection, 113 SelectedCount = selectedCount, 114 }; 115 } 116 117 internal static SelectedAssetGroupInfo BuildFromSingleFile( 118 string fullPath, 119 bool isDirectory, 120 WorkspaceInfo wkInfo, 121 IPlasticAPI plasticApi, 122 IAssetStatusCache statusCache) 123 { 124 bool isCheckedInSelection = true; 125 bool isControlledSelection = true; 126 bool isCheckedOutSelection = true; 127 bool isPrivateSelection = true; 128 bool isAddedSelection = true; 129 bool isFileSelection = true; 130 bool isMovedSelection = false; 131 bool hasAnyAddedInSelection = false; 132 bool hasAnyRemoteLockedInSelection = false; 133 134 WorkspaceTreeNode wkTreeNode = plasticApi. 135 GetWorkspaceTreeNode(fullPath); 136 137 if (isDirectory) 138 isFileSelection = false; 139 140 if (CheckWorkspaceTreeNodeStatus.IsPrivate(wkTreeNode)) 141 isControlledSelection = false; 142 else 143 isPrivateSelection = false; 144 145 if (CheckWorkspaceTreeNodeStatus.IsCheckedOut(wkTreeNode)) 146 isCheckedInSelection = false; 147 else 148 isCheckedOutSelection = false; 149 150 if (CheckWorkspaceTreeNodeStatus.IsAdded(wkTreeNode)) 151 hasAnyAddedInSelection = true; 152 else 153 isAddedSelection = false; 154 155 if (wkTreeNode != null) 156 { 157 TreeChangedNode treeChangedNode = plasticApi. 158 GetChangedNodeForPath(wkInfo, fullPath); 159 160 if (treeChangedNode != null) 161 isMovedSelection = treeChangedNode.MovedDst; 162 } 163 164 AssetStatus assetStatus = statusCache.GetStatus(fullPath); 165 166 if (ClassifyAssetStatus.IsLockedRemote(assetStatus)) 167 hasAnyRemoteLockedInSelection = true; 168 169 return new SelectedAssetGroupInfo() 170 { 171 IsCheckedInSelection = isCheckedInSelection, 172 IsCheckedOutSelection = isCheckedOutSelection, 173 IsControlledSelection = isControlledSelection, 174 IsPrivateSelection = isPrivateSelection, 175 IsAddedSelection = isAddedSelection, 176 IsFileSelection = isFileSelection, 177 IsMovedSelection = isMovedSelection, 178 HasAnyAddedInSelection = hasAnyAddedInSelection, 179 HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection, 180 SelectedCount = 1, 181 }; 182 } 183 } 184 185 internal interface IAssetMenuVCSOperations 186 { 187 void ShowPendingChanges(); 188 void Add(); 189 void Checkout(); 190 void Checkin(); 191 void Undo(); 192 void ShowDiff(); 193 void ShowHistory(); 194 } 195 196 internal interface IAssetMenuCopyPathOperation 197 { 198 void CopyFilePath(bool relativePath); 199 } 200 201 internal static class AssetMenuUpdater 202 { 203 internal static AssetMenuOperations GetAvailableMenuOperations( 204 SelectedAssetGroupInfo info) 205 { 206 AssetMenuOperations result = AssetMenuOperations.None; 207 208 if (info.SelectedCount == 0) 209 { 210 return result; 211 } 212 213 result |= AssetMenuOperations.CopyFilePath; 214 215 if (info.IsControlledSelection && 216 info.IsCheckedInSelection && 217 info.IsFileSelection && 218 !info.HasAnyRemoteLockedInSelection) 219 { 220 result |= AssetMenuOperations.Checkout; 221 } 222 223 if (info.IsFileSelection && 224 info.IsPrivateSelection) 225 { 226 result |= AssetMenuOperations.Add; 227 } 228 229 if (info.IsFileSelection && 230 info.IsControlledSelection && 231 info.IsCheckedOutSelection) 232 { 233 result |= AssetMenuOperations.Checkin; 234 } 235 236 if ((info.IsControlledSelection && 237 info.IsMovedSelection) || 238 (info.IsFileSelection && 239 info.IsControlledSelection && 240 info.IsCheckedOutSelection)) 241 { 242 result |= AssetMenuOperations.Undo; 243 } 244 245 if (info.SelectedCount == 1 && 246 info.IsControlledSelection && 247 !info.HasAnyAddedInSelection && 248 info.IsFileSelection) 249 { 250 result |= AssetMenuOperations.Diff; 251 } 252 253 if (info.SelectedCount == 1 && 254 info.IsControlledSelection && 255 !info.HasAnyAddedInSelection) 256 { 257 result |= AssetMenuOperations.History; 258 } 259 260 return result; 261 } 262 } 263}