317 lines
10 KiB
C#
317 lines
10 KiB
C#
using UnityEditor;
|
|
using UnityEditor.SceneManagement;
|
|
using UnityEditor.VersionControl;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
using Codice.Client.Common.EventTracking;
|
|
using Codice.CM.Common;
|
|
using Codice.LogWrapper;
|
|
using PlasticGui;
|
|
using PlasticGui.WorkspaceWindow;
|
|
using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
|
|
using Unity.PlasticSCM.Editor.AssetUtils;
|
|
using Unity.PlasticSCM.Editor.AssetUtils.Processor;
|
|
using Unity.PlasticSCM.Editor.Tool;
|
|
using Unity.PlasticSCM.Editor.UI;
|
|
using GluonIncomingChangesUpdater = PlasticGui.Gluon.WorkspaceWindow.IncomingChangesUpdater;
|
|
|
|
namespace Unity.PlasticSCM.Editor.AssetMenu
|
|
{
|
|
internal static class HierarchyViewAssetMenu
|
|
{
|
|
internal static void Enable(
|
|
WorkspaceInfo wkInfo,
|
|
IPlasticAPI plasticApi,
|
|
IAssetStatusCache assetStatusCache)
|
|
{
|
|
if (mIsEnabled)
|
|
return;
|
|
|
|
mLog.Debug("Enable");
|
|
|
|
mWkInfo = wkInfo;
|
|
mPlasticAPI = plasticApi;
|
|
mAssetStatusCache = assetStatusCache;
|
|
|
|
mIsEnabled = true;
|
|
|
|
mAssetSelection = new HierarchyViewAssetSelection();
|
|
|
|
mAssetMenuCopyPathOperation = new AssetCopyPathOperation(
|
|
wkInfo, mPlasticAPI, assetStatusCache, mAssetSelection);
|
|
|
|
SceneHierarchyHooks.addItemsToSceneHeaderContextMenu += OnSceneHeaderContextMenu;
|
|
SceneHierarchyHooks.addItemsToSubSceneHeaderContextMenu += OnSubSceneHeaderContextMenu;
|
|
}
|
|
|
|
internal static void Disable()
|
|
{
|
|
mLog.Debug("Enable");
|
|
|
|
mIsEnabled = false;
|
|
|
|
mWkInfo = null;
|
|
mPlasticAPI = null;
|
|
mAssetStatusCache = null;
|
|
mAssetSelection = null;
|
|
mAssetMenuUVCSOperations = null;
|
|
mAssetMenuCopyPathOperation = null;
|
|
|
|
SceneHierarchyHooks.addItemsToSceneHeaderContextMenu -= OnSceneHeaderContextMenu;
|
|
SceneHierarchyHooks.addItemsToSubSceneHeaderContextMenu -= OnSubSceneHeaderContextMenu;
|
|
}
|
|
|
|
internal static void BuildOperations(
|
|
WorkspaceInfo wkInfo,
|
|
IPlasticAPI plasticApi,
|
|
GluonGui.ViewHost viewHost,
|
|
WorkspaceWindow workspaceWindow,
|
|
IViewSwitcher viewSwitcher,
|
|
PlasticGui.Gluon.IGluonViewSwitcher gluonViewSwitcher,
|
|
IMergeViewLauncher mergeViewLauncher,
|
|
IHistoryViewLauncher historyViewLauncher,
|
|
IAssetStatusCache assetStatusCache,
|
|
ISaveAssets saveAssets,
|
|
LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
|
|
WorkspaceOperationsMonitor workspaceOperationsMonitor,
|
|
PendingChangesUpdater pendingChangesUpdater,
|
|
IncomingChangesUpdater developerIncomingChangesUpdater,
|
|
GluonIncomingChangesUpdater gluonIncomingChangesUpdater,
|
|
ShelvedChangesUpdater shelvedChangesUpdater,
|
|
bool isGluonMode)
|
|
{
|
|
if (!mIsEnabled)
|
|
Enable(wkInfo, plasticApi, assetStatusCache);
|
|
|
|
AssetUVCSOperations assetUVCSOperations = new AssetUVCSOperations(
|
|
wkInfo,
|
|
plasticApi,
|
|
viewHost,
|
|
workspaceWindow,
|
|
viewSwitcher,
|
|
gluonViewSwitcher,
|
|
mergeViewLauncher,
|
|
historyViewLauncher,
|
|
assetStatusCache,
|
|
mAssetSelection,
|
|
saveAssets,
|
|
showDownloadPlasticExeWindow,
|
|
workspaceOperationsMonitor,
|
|
pendingChangesUpdater,
|
|
developerIncomingChangesUpdater,
|
|
gluonIncomingChangesUpdater,
|
|
shelvedChangesUpdater,
|
|
isGluonMode);
|
|
|
|
mAssetMenuUVCSOperations = assetUVCSOperations;
|
|
}
|
|
|
|
static void OnSceneHeaderContextMenu(GenericMenu menu, Scene scene)
|
|
{
|
|
LoadMenuForAssetPath(menu, scene.path);
|
|
}
|
|
|
|
static void OnSubSceneHeaderContextMenu(GenericMenu menu, SceneHierarchyHooks.SubSceneInfo subSceneInfo)
|
|
{
|
|
LoadMenuForAssetPath(menu, subSceneInfo.scene.path);
|
|
}
|
|
|
|
static void LoadMenuForAssetPath(GenericMenu menu, string assetPath)
|
|
{
|
|
string assetFullPath = AssetsPath.GetFullPathUnderWorkspace.ForAsset(mWkInfo.ClientPath, assetPath);
|
|
|
|
if (assetFullPath == null)
|
|
return;
|
|
|
|
mAssetSelection.SetActiveAsset(new Asset(assetFullPath));
|
|
|
|
AddItemsToMenu(menu);
|
|
}
|
|
|
|
static void AddItemsToMenu(GenericMenu menu)
|
|
{
|
|
menu.AddSeparator(string.Empty);
|
|
|
|
menu.AddItem(
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.PendingChangesPlasticMenu),
|
|
false,
|
|
PendingChanges);
|
|
|
|
menu.AddSeparator(GetSubMenuName());
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.AddPlasticMenu),
|
|
Add,
|
|
AssetMenuOperations.Add
|
|
);
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.CheckoutPlasticMenu),
|
|
Checkout,
|
|
AssetMenuOperations.Checkout
|
|
);
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.CheckinPlasticMenu),
|
|
Checkin,
|
|
AssetMenuOperations.Checkin
|
|
);
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.UndoPlasticMenu),
|
|
Undo,
|
|
AssetMenuOperations.Undo
|
|
);
|
|
|
|
menu.AddSeparator(GetSubMenuName());
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.CopyFilePathMenuItem),
|
|
CopyFilePath,
|
|
AssetMenuOperations.CopyFilePath
|
|
);
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.CopyRelativeFilePathMenuItem),
|
|
CopyRelativeFilePath,
|
|
AssetMenuOperations.CopyFilePath
|
|
);
|
|
|
|
menu.AddSeparator(GetSubMenuName());
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.DiffPlasticMenu),
|
|
Diff,
|
|
AssetMenuOperations.Diff
|
|
);
|
|
|
|
AddMenuItemForConditionalOperation(
|
|
menu,
|
|
GetPlasticMenuItemContent(PlasticLocalization.Name.HistoryPlasticMenu),
|
|
History,
|
|
AssetMenuOperations.History
|
|
);
|
|
}
|
|
|
|
static void AddMenuItemForConditionalOperation(
|
|
GenericMenu menu,
|
|
GUIContent menuContent,
|
|
GenericMenu.MenuFunction menuAction,
|
|
AssetMenuOperations operation)
|
|
{
|
|
if (ValidateOperation(operation))
|
|
{
|
|
menu.AddItem(menuContent, false, menuAction);
|
|
}
|
|
else
|
|
{
|
|
menu.AddDisabledItem(menuContent);
|
|
}
|
|
}
|
|
|
|
static void PendingChanges()
|
|
{
|
|
ShowWindow.UVCS();
|
|
mAssetMenuUVCSOperations.ShowPendingChanges();
|
|
}
|
|
|
|
static void Add()
|
|
{
|
|
if (mAssetMenuUVCSOperations == null)
|
|
ShowWindow.UVCS();
|
|
|
|
mAssetMenuUVCSOperations.Add();
|
|
}
|
|
|
|
static void Checkout()
|
|
{
|
|
if (mAssetMenuUVCSOperations == null)
|
|
ShowWindow.UVCS();
|
|
|
|
mAssetMenuUVCSOperations.Checkout();
|
|
}
|
|
|
|
static void Checkin()
|
|
{
|
|
TrackFeatureUseEvent.For(
|
|
PlasticGui.Plastic.API.GetRepositorySpec(mWkInfo),
|
|
TrackFeatureUseEvent.Features.UnityPackage.HierarchyContextMenuCheckinOption);
|
|
|
|
if (mAssetMenuUVCSOperations == null)
|
|
ShowWindow.UVCS();
|
|
|
|
mAssetMenuUVCSOperations.Checkin();
|
|
}
|
|
|
|
static void Undo()
|
|
{
|
|
if (mAssetMenuUVCSOperations == null)
|
|
ShowWindow.UVCS();
|
|
|
|
mAssetMenuUVCSOperations.Undo();
|
|
}
|
|
|
|
static void CopyFilePath()
|
|
{
|
|
mAssetMenuCopyPathOperation.CopyFilePath(relativePath: false);
|
|
}
|
|
|
|
static void CopyRelativeFilePath()
|
|
{
|
|
mAssetMenuCopyPathOperation.CopyFilePath(relativePath: true);
|
|
}
|
|
|
|
static void Diff()
|
|
{
|
|
if (mAssetMenuUVCSOperations == null)
|
|
ShowWindow.UVCS();
|
|
|
|
mAssetMenuUVCSOperations.ShowDiff();
|
|
}
|
|
|
|
static void History()
|
|
{
|
|
ShowWindow.UVCS();
|
|
mAssetMenuUVCSOperations.ShowHistory();
|
|
}
|
|
|
|
static bool ValidateOperation(AssetMenuOperations operation)
|
|
{
|
|
return AssetMenuUpdater.ShouldMenuOperationBeEnabled(
|
|
mWkInfo, mPlasticAPI, mAssetSelection, mAssetStatusCache, operation);
|
|
}
|
|
|
|
static GUIContent GetPlasticMenuItemContent(PlasticLocalization.Name name)
|
|
{
|
|
string menuText = string.Format("{0}{1}",
|
|
GetSubMenuName(),
|
|
name.GetString());
|
|
|
|
return EditorGUIUtility.TrTextContent(menuText);
|
|
}
|
|
|
|
static string GetSubMenuName()
|
|
{
|
|
return PlasticLocalization.Name.UnityVersionControl.GetString() + "/";
|
|
}
|
|
|
|
static bool mIsEnabled;
|
|
static WorkspaceInfo mWkInfo;
|
|
static IPlasticAPI mPlasticAPI;
|
|
static IAssetStatusCache mAssetStatusCache;
|
|
static HierarchyViewAssetSelection mAssetSelection;
|
|
static IAssetMenuUVCSOperations mAssetMenuUVCSOperations;
|
|
static IAssetMenuCopyPathOperation mAssetMenuCopyPathOperation;
|
|
|
|
static readonly ILog mLog = PlasticApp.GetLogger("HierarchyViewMenu");
|
|
}
|
|
}
|