untangle-puzzlegame/Library/PackageCache/com.unity.collab-proxy@50ac96531b63/Editor/Inspector/DrawInspectorOperations.cs
2025-04-17 17:33:08 -04:00

338 lines
11 KiB
C#

using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEditor;
using UnityEditor.VersionControl;
using Codice.CM.Common;
using Codice.LogWrapper;
using PlasticGui;
using PlasticGui.WorkspaceWindow;
using Unity.PlasticSCM.Editor.AssetMenu;
using Unity.PlasticSCM.Editor.AssetsOverlays;
using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
using Unity.PlasticSCM.Editor.AssetUtils;
using Unity.PlasticSCM.Editor.AssetUtils.Processor;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.Tool;
namespace Unity.PlasticSCM.Editor.Inspector
{
static class DrawInspectorOperations
{
internal static void Enable(
string wkPath,
IAssetStatusCache assetStatusCache)
{
if (mIsEnabled)
return;
mLog.Debug("Enable");
mWkPath = wkPath;
mAssetStatusCache = assetStatusCache;
mIsEnabled = true;
mAssetSelection = new InspectorAssetSelection();
UnityEditor.Editor.finishedDefaultHeaderGUI +=
Editor_finishedDefaultHeaderGUI;
RepaintInspector.All();
}
internal static void Disable()
{
mLog.Debug("Disable");
mIsEnabled = false;
UnityEditor.Editor.finishedDefaultHeaderGUI -=
Editor_finishedDefaultHeaderGUI;
RepaintInspector.All();
mWkPath = null;
mAssetStatusCache = null;
mAssetSelection = null;
mOperations = null;
}
internal static void BuildOperations(
WorkspaceInfo wkInfo,
WorkspaceWindow workspaceWindow,
IViewSwitcher viewSwitcher,
IHistoryViewLauncher historyViewLauncher,
GluonGui.ViewHost viewHost,
WorkspaceOperationsMonitor workspaceOperationsMonitor,
PlasticGui.WorkspaceWindow.NewIncomingChangesUpdater incomingChangesUpdater,
ShelvedChangesUpdater shelvedChangesUpdater,
IAssetStatusCache assetStatusCache,
IMergeViewLauncher mergeViewLauncher,
PlasticGui.Gluon.IGluonViewSwitcher gluonViewSwitcher,
LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
bool isGluonMode)
{
if (!mIsEnabled)
Enable(wkInfo.ClientPath, assetStatusCache);
mOperations = new AssetVcsOperations(
wkInfo,
workspaceWindow,
viewSwitcher,
historyViewLauncher,
viewHost,
workspaceOperationsMonitor,
incomingChangesUpdater,
shelvedChangesUpdater,
mAssetStatusCache,
mergeViewLauncher,
gluonViewSwitcher,
mAssetSelection,
showDownloadPlasticExeWindow,
isGluonMode);
}
static void Editor_finishedDefaultHeaderGUI(UnityEditor.Editor inspector)
{
if (!mIsEnabled)
return;
if (!FindWorkspace.HasWorkspace(ApplicationDataPath.Get()))
{
Disable();
return;
}
mAssetSelection.SetActiveInspector(inspector);
AssetList assetList = ((AssetVcsOperations.IAssetSelection)
mAssetSelection).GetSelectedAssets();
if (assetList.Count == 0)
return;
SelectedAssetGroupInfo selectedGroupInfo = SelectedAssetGroupInfo.
BuildFromAssetList(mWkPath, assetList, mAssetStatusCache);
if (assetList.Count != selectedGroupInfo.SelectedCount)
return;
AssetsOverlays.AssetStatus assetStatus;
LockStatusData lockStatusData;
GetAssetStatusToDraw(
assetList[0].path, assetList.Count,
mAssetStatusCache,
out assetStatus,
out lockStatusData);
AssetMenuOperations assetOperations = AssetMenuUpdater.
GetAvailableMenuOperations(selectedGroupInfo);
bool guiEnabledBck = GUI.enabled;
GUI.enabled = true;
try
{
DrawBackRectangle(guiEnabledBck);
GUILayout.BeginHorizontal();
DrawStatusLabel(assetStatus, lockStatusData);
DrawButtons(assetOperations);
GUILayout.EndHorizontal();
}
finally
{
GUI.enabled = guiEnabledBck;
}
}
static void DrawBackRectangle(bool isEnabled)
{
// when the inspector is disabled, there is a separator line
// that breaks the visual style. Draw an empty rectangle
// matching the background color to cover it
GUILayout.Space(UnityConstants.INSPECTOR_ACTIONS_BACK_RECTANGLE_TOP_MARGIN);
GUIStyle targetStyle = (isEnabled) ?
UnityStyles.Inspector.HeaderBackgroundStyle :
UnityStyles.Inspector.DisabledHeaderBackgroundStyle;
Rect rect = GUILayoutUtility.GetRect(
GUIContent.none, targetStyle);
// extra space to cover the inspector full width
rect.x -= 20;
rect.width += 80;
GUI.Box(rect, GUIContent.none, targetStyle);
// now reset the space used by the rectangle
GUILayout.Space(
-UnityConstants.INSPECTOR_ACTIONS_HEADER_BACK_RECTANGLE_HEIGHT
- UnityConstants.INSPECTOR_ACTIONS_BACK_RECTANGLE_TOP_MARGIN);
}
static void DrawButtons(AssetMenuOperations assetOperations)
{
var operationsAvailability = new Dictionary<AssetMenuOperations, bool>
{
{ AssetMenuOperations.Add, assetOperations.HasFlag(AssetMenuOperations.Add) },
{ AssetMenuOperations.Checkout, assetOperations.HasFlag(AssetMenuOperations.Checkout) },
{ AssetMenuOperations.Checkin, assetOperations.HasFlag(AssetMenuOperations.Checkin) },
{ AssetMenuOperations.Undo, assetOperations.HasFlag(AssetMenuOperations.Undo) }
};
// GUILayout reserves space for controls, which might lead to unexpected layout behavior
// when controls are hidden dynamically. We keep consistency by adding flex spaces for inactive operations.
foreach (var unused in operationsAvailability.Values.Where(activeOperation => !activeOperation))
{
GUILayout.FlexibleSpace();
}
if (operationsAvailability[AssetMenuOperations.Add])
{
DoAddButton();
}
if (operationsAvailability[AssetMenuOperations.Checkout])
{
DoCheckoutButton();
}
if (operationsAvailability[AssetMenuOperations.Checkin])
{
DoCheckinButton();
}
if (operationsAvailability[AssetMenuOperations.Undo])
{
DoUndoButton();
}
}
static void DrawStatusLabel(
AssetsOverlays.AssetStatus assetStatus,
LockStatusData lockStatusData)
{
Texture overlayIcon = DrawAssetOverlay.DrawOverlayIcon.
GetOverlayIcon(assetStatus);
if (overlayIcon == null)
return;
string statusText = DrawAssetOverlay.
GetStatusString(assetStatus);
string tooltipText = DrawAssetOverlay.GetTooltipText(
assetStatus, lockStatusData);
Rect selectionRect = GUILayoutUtility.GetRect(
new GUIContent(statusText + EXTRA_SPACE, overlayIcon),
GUIStyle.none);
selectionRect.height = UnityConstants.OVERLAY_STATUS_ICON_SIZE;
Rect overlayRect = OverlayRect.GetCenteredRect(selectionRect);
GUI.DrawTexture(
overlayRect,
overlayIcon,
ScaleMode.ScaleToFit);
selectionRect.x += UnityConstants.OVERLAY_STATUS_ICON_SIZE;
selectionRect.width -= UnityConstants.OVERLAY_STATUS_ICON_SIZE;
GUI.Label(
selectionRect,
new GUIContent(statusText, tooltipText));
}
static void DoAddButton()
{
string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.AddButton);
if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
{
if (mOperations == null)
ShowWindow.Plastic();
mOperations.Add();
}
}
static void DoCheckoutButton()
{
string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.CheckoutButton);
if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
{
if (mOperations == null)
ShowWindow.Plastic();
mOperations.Checkout();
}
}
static void DoCheckinButton()
{
string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.CheckinButton);
if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
{
if (mOperations == null)
ShowWindow.Plastic();
mOperations.Checkin();
EditorGUIUtility.ExitGUI();
}
}
static void DoUndoButton()
{
string buttonText = PlasticLocalization.GetString(PlasticLocalization.Name.UndoButton);
if (GUILayout.Button(string.Format("{0}", buttonText), EditorStyles.miniButton))
{
if (mOperations == null)
ShowWindow.Plastic();
mOperations.Undo();
EditorGUIUtility.ExitGUI();
}
}
static void GetAssetStatusToDraw(
string selectedPath,
int selectedCount,
IAssetStatusCache statusCache,
out AssetsOverlays.AssetStatus assetStatus,
out LockStatusData lockStatusData)
{
assetStatus = AssetsOverlays.AssetStatus.None;
lockStatusData = null;
if (selectedCount > 1)
return;
string selectedFullPath = Path.GetFullPath(selectedPath);
assetStatus = statusCache.GetStatus(selectedFullPath);
lockStatusData = statusCache.GetLockStatusData(selectedFullPath);
}
static IAssetMenuVCSOperations mOperations;
static InspectorAssetSelection mAssetSelection;
static bool mIsEnabled;
static IAssetStatusCache mAssetStatusCache;
static string mWkPath;
const string EXTRA_SPACE = " ";
static readonly ILog mLog = PlasticApp.GetLogger("DrawInspectorOperations");
}
}