|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|