using System; using UnityEditor.VersionControl; using Codice; using Codice.Client.Commands.WkTree; using Unity.PlasticSCM.Editor.AssetsOverlays.Cache; using Unity.PlasticSCM.Editor.AssetsOverlays; using Unity.PlasticSCM.Editor.AssetUtils; namespace Unity.PlasticSCM.Editor.AssetMenu { [Flags] internal enum AssetMenuOperations : byte { None = 0, Checkout = 1 << 0, Diff = 1 << 1, History = 1 << 2, Add = 1 << 3, Checkin = 1 << 4, Undo = 1 << 5, } internal class SelectedAssetGroupInfo { internal int SelectedCount; internal bool IsControlledSelection; internal bool IsCheckedInSelection; internal bool IsCheckedOutSelection; internal bool IsPrivateSelection; internal bool IsAddedSelection; internal bool IsFileSelection; internal bool HasAnyAddedInSelection; internal bool HasAnyRemoteLockedInSelection; internal static SelectedAssetGroupInfo BuildFromAssetList( string wkPath, AssetList assetList, IAssetStatusCache statusCache) { bool isCheckedInSelection = true; bool isControlledSelection = true; bool isCheckedOutSelection = true; bool isPrivateSelection = true; bool isAddedSelection = true; bool isFileSelection = true; bool hasAnyAddedInSelection = false; bool hasAnyRemoteLockedInSelection = false; int selectedCount = 0; foreach (Asset asset in assetList) { string fullPath = AssetsPath.GetFullPathUnderWorkspace. ForAsset(wkPath, asset.path); if (fullPath == null) continue; SelectedAssetGroupInfo singleFileGroupInfo = BuildFromSingleFile( fullPath, asset.isFolder, statusCache); if (!singleFileGroupInfo.IsCheckedInSelection) isCheckedInSelection = false; if (!singleFileGroupInfo.IsControlledSelection) isControlledSelection = false; if (!singleFileGroupInfo.IsCheckedOutSelection) isCheckedOutSelection = false; if (!singleFileGroupInfo.IsPrivateSelection) isPrivateSelection = false; if (!singleFileGroupInfo.IsAddedSelection) isAddedSelection = false; if (!singleFileGroupInfo.IsFileSelection) isFileSelection = false; if (singleFileGroupInfo.HasAnyAddedInSelection) hasAnyAddedInSelection = true; if (singleFileGroupInfo.HasAnyRemoteLockedInSelection) hasAnyRemoteLockedInSelection = true; selectedCount++; } return new SelectedAssetGroupInfo() { IsCheckedInSelection = isCheckedInSelection, IsCheckedOutSelection = isCheckedOutSelection, IsControlledSelection = isControlledSelection, IsPrivateSelection = isPrivateSelection, IsAddedSelection = isAddedSelection, IsFileSelection = isFileSelection, HasAnyAddedInSelection = hasAnyAddedInSelection, HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection, SelectedCount = selectedCount, }; } internal static SelectedAssetGroupInfo BuildFromSingleFile( string fullPath, bool isDirectory, IAssetStatusCache statusCache) { bool isCheckedInSelection = true; bool isControlledSelection = true; bool isCheckedOutSelection = true; bool isPrivateSelection = true; bool isAddedSelection = true; bool isFileSelection = true; bool hasAnyAddedInSelection = false; bool hasAnyRemoteLockedInSelection = false; WorkspaceTreeNode wkTreeNode = PlasticGui.Plastic.API.GetWorkspaceTreeNode(fullPath); if (isDirectory) isFileSelection = false; if (CheckWorkspaceTreeNodeStatus.IsPrivate(wkTreeNode)) isControlledSelection = false; else isPrivateSelection = false; if (CheckWorkspaceTreeNodeStatus.IsCheckedOut(wkTreeNode)) isCheckedInSelection = false; else isCheckedOutSelection = false; if (CheckWorkspaceTreeNodeStatus.IsAdded(wkTreeNode)) hasAnyAddedInSelection = true; else isAddedSelection = false; AssetStatus assetStatus = statusCache.GetStatus(fullPath); if (ClassifyAssetStatus.IsLockedRemote(assetStatus)) hasAnyRemoteLockedInSelection = true; return new SelectedAssetGroupInfo() { IsCheckedInSelection = isCheckedInSelection, IsCheckedOutSelection = isCheckedOutSelection, IsControlledSelection = isControlledSelection, IsPrivateSelection = isPrivateSelection, IsAddedSelection = isAddedSelection, IsFileSelection = isFileSelection, HasAnyAddedInSelection = hasAnyAddedInSelection, HasAnyRemoteLockedInSelection = hasAnyRemoteLockedInSelection, SelectedCount = 1, }; } } internal interface IAssetMenuOperations { void ShowPendingChanges(); void Add(); void Checkout(); void Checkin(); void Undo(); void ShowDiff(); void ShowHistory(); } internal static class AssetMenuUpdater { internal static AssetMenuOperations GetAvailableMenuOperations( SelectedAssetGroupInfo info) { AssetMenuOperations result = AssetMenuOperations.None; if (info.SelectedCount == 0) { return result; } if (info.IsControlledSelection && info.IsCheckedInSelection && info.IsFileSelection && !info.HasAnyRemoteLockedInSelection) { result |= AssetMenuOperations.Checkout; } if (info.IsFileSelection && info.IsPrivateSelection) { result |= AssetMenuOperations.Add; } if (info.IsFileSelection && info.IsControlledSelection && info.IsCheckedOutSelection) { result |= AssetMenuOperations.Checkin; result |= AssetMenuOperations.Undo; } if (info.SelectedCount == 1 && info.IsControlledSelection && !info.HasAnyAddedInSelection && info.IsFileSelection) { result |= AssetMenuOperations.Diff; } if (info.SelectedCount == 1 && info.IsControlledSelection && !info.HasAnyAddedInSelection) { result |= AssetMenuOperations.History; } return result; } } }