arenos-nexus/Arenos Nexus/Library/PackageCache/com.unity.collab-proxy@ab839cc7d2ad/Editor/AssetOverlays/DrawHierarchyOverlay.cs
Daniel 2e704cae70 init
Init Commit Unity
2025-09-25 22:01:28 +02:00

163 lines
4.4 KiB
C#

using System;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
using Codice.Client.Common.Threading;
using Codice.LogWrapper;
using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
using Unity.PlasticSCM.Editor.AssetUtils;
namespace Unity.PlasticSCM.Editor.AssetsOverlays
{
internal static class DrawHierarchyOverlay
{
internal interface IGetAssetPathFromInstance
{
bool TryGetAssetPath(int instanceID, out string assetPath);
}
internal static IGetAssetPathFromInstance GetSubSceneAssetPath;
internal static void Enable(
string wkPath,
IAssetStatusCache assetStatusCache)
{
if (mIsEnabled)
return;
mLog.Debug("Enable");
mWkPath = wkPath;
mAssetStatusCache = assetStatusCache;
mIsEnabled = true;
EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
RepaintEditor.HierarchyWindow();
}
internal static void Disable()
{
mLog.Debug("Disable");
mIsEnabled = false;
EditorApplication.hierarchyWindowItemOnGUI -= OnHierarchyGUI;
RepaintEditor.HierarchyWindow();
mWkPath = null;
mAssetStatusCache = null;
}
static void OnHierarchyGUI(int instanceID, Rect selectionRect)
{
if (Event.current.type != EventType.Repaint)
return;
try
{
string assetPath = GetAssetPathFromInstanceID(instanceID);
if (assetPath == null)
return;
string assetFullPath = AssetsPath.GetFullPathUnderWorkspace.ForAsset(mWkPath, assetPath);
if (assetFullPath == null)
return;
DrawOverlayForAsset(assetFullPath, selectionRect, mAssetStatusCache);
}
catch (Exception ex)
{
ExceptionsHandler.LogException(typeof(DrawHierarchyOverlay).Name, ex);
}
}
static string GetAssetPathFromInstanceID(int instanceID)
{
string sceneAssetPath;
if (TryGetAssetPathForScene(instanceID, out sceneAssetPath))
{
return sceneAssetPath;
}
string subSceneAssetPath;
if (TryGetAssetPathForSubScene(instanceID, out subSceneAssetPath))
{
return subSceneAssetPath;
}
return null;
}
static bool TryGetAssetPathForScene(int instanceID, out string assetPath)
{
assetPath = null;
if (EditorUtility.InstanceIDToObject(instanceID) != null)
return false;
assetPath = FindScenePathForHandle(instanceID);
return assetPath != null;
}
static string FindScenePathForHandle(int sceneHandle)
{
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene scene = SceneManager.GetSceneAt(i);
if (scene.handle == sceneHandle && scene.path != null)
{
return scene.path;
}
}
return null;
}
static bool TryGetAssetPathForSubScene(int instanceID, out string assetPath)
{
assetPath = null;
string subSceneAssetPath;
if (GetSubSceneAssetPath != null &&
GetSubSceneAssetPath.TryGetAssetPath(instanceID, out subSceneAssetPath))
{
assetPath = subSceneAssetPath;
}
return assetPath != null;
}
static void DrawOverlayForAsset(
string assetFullPath,
Rect selectionRect,
IAssetStatusCache assetStatusCache)
{
AssetStatus assetStatus = assetStatusCache.GetStatus(assetFullPath);
string tooltipText = AssetOverlay.GetTooltipText(
assetStatus,
assetStatusCache.GetLockStatusData(assetFullPath));
DrawAssetOverlayIcon.ForStatus(
selectionRect,
assetStatus,
tooltipText);
}
static bool mIsEnabled;
static IAssetStatusCache mAssetStatusCache;
static string mWkPath;
static readonly ILog mLog = PlasticApp.GetLogger("DrawHierarchyOverlay");
}
}