228 lines
7.3 KiB
C#
228 lines
7.3 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
using UnityEditor.VersionControl;
|
|
|
|
using Codice;
|
|
using Codice.Client.Commands.WkTree;
|
|
|
|
using PlasticGui;
|
|
using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
|
|
using Unity.PlasticSCM.Editor.AssetsOverlays;
|
|
|
|
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(
|
|
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)
|
|
{
|
|
if (string.IsNullOrEmpty(asset.path))
|
|
continue;
|
|
|
|
SelectedAssetGroupInfo singleFileGroupInfo = BuildFromSingleFile(
|
|
asset.path,
|
|
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 path,
|
|
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;
|
|
|
|
string assetPath = Path.GetFullPath(path);
|
|
|
|
WorkspaceTreeNode wkTreeNode =
|
|
PlasticGui.Plastic.API.GetWorkspaceTreeNode(assetPath);
|
|
|
|
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;
|
|
|
|
AssetsOverlays.AssetStatus assetStatus = statusCache.GetStatusForPath(assetPath);
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|