225 lines
7.4 KiB
C#
225 lines
7.4 KiB
C#
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|