Maze / Library /PackageCache /com.unity.collab-proxy@2.0.4 /Editor /PlasticSCM /AssetOverlays /DrawAssetOverlay.cs
| using System; | |
| using UnityEditor; | |
| using UnityEngine; | |
| using PlasticGui; | |
| using Unity.PlasticSCM.Editor.AssetsOverlays.Cache; | |
| using Unity.PlasticSCM.Editor.AssetUtils; | |
| using Unity.PlasticSCM.Editor.UI; | |
| namespace Unity.PlasticSCM.Editor.AssetsOverlays | |
| { | |
| internal static class DrawAssetOverlay | |
| { | |
| internal static void Enable( | |
| string wkPath, | |
| IAssetStatusCache assetStatusCache) | |
| { | |
| if (mIsEnabled) | |
| return; | |
| mWkPath = wkPath; | |
| mAssetStatusCache = assetStatusCache; | |
| mIsEnabled = true; | |
| mRepaintProjectWindow = ProjectWindow.Repaint; | |
| EditorApplication.projectWindowItemOnGUI += OnProjectWindowItemGUI; | |
| mRepaintProjectWindow(); | |
| } | |
| internal static void Disable() | |
| { | |
| mIsEnabled = false; | |
| EditorApplication.projectWindowItemOnGUI -= OnProjectWindowItemGUI; | |
| mRepaintProjectWindow(); | |
| mWkPath = null; | |
| mAssetStatusCache = null; | |
| } | |
| internal static void ClearCache() | |
| { | |
| if (mAssetStatusCache != null) | |
| mAssetStatusCache.Clear(); | |
| mRepaintProjectWindow(); | |
| } | |
| internal static string GetStatusString(AssetStatus assetStatus) | |
| { | |
| if (ClassifyAssetStatus.IsPrivate(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.Private); | |
| if (ClassifyAssetStatus.IsIgnored(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusIgnored); | |
| if (ClassifyAssetStatus.IsAdded(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusAdded); | |
| if (ClassifyAssetStatus.IsConflicted(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusConflicted); | |
| if (ClassifyAssetStatus.IsDeletedOnServer(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusDeletedOnServer); | |
| if (ClassifyAssetStatus.IsLockedRemote(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusLockedRemote); | |
| if (ClassifyAssetStatus.IsOutOfDate(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusOutOfDate); | |
| if (ClassifyAssetStatus.IsLocked(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusLockedMe); | |
| if (ClassifyAssetStatus.IsCheckedOut(assetStatus)) | |
| return PlasticLocalization.GetString( | |
| PlasticLocalization.Name.StatusCheckout); | |
| return string.Empty; | |
| } | |
| internal static string GetTooltipText( | |
| AssetStatus statusValue, | |
| LockStatusData lockStatusData) | |
| { | |
| string statusText = GetStatusString(statusValue); | |
| if (lockStatusData == null) | |
| return statusText; | |
| // example: | |
| // Changed by: | |
| // * dani_pen@hotmail.com | |
| // * workspace wkLocal" | |
| char bulletCharacter = '\u25cf'; | |
| string line1 = PlasticLocalization.GetString( | |
| PlasticLocalization.Name.AssetOverlayTooltipStatus, statusText); | |
| string line2 = string.Format("{0} {1}", | |
| bulletCharacter, | |
| lockStatusData.LockedBy); | |
| string line3 = string.Format("{0} {1}", | |
| bulletCharacter, | |
| PlasticLocalization.GetString( | |
| PlasticLocalization.Name.AssetOverlayTooltipWorkspace, | |
| lockStatusData.WorkspaceName)); | |
| return string.Format( | |
| "{0}" + Environment.NewLine + | |
| "{1}" + Environment.NewLine + | |
| "{2}", | |
| line1, | |
| line2, | |
| line3); | |
| } | |
| static void OnProjectWindowItemGUI(string guid, Rect selectionRect) | |
| { | |
| if (string.IsNullOrEmpty(guid)) | |
| return; | |
| if (Event.current.type != EventType.Repaint) | |
| return; | |
| string fullPath = AssetsPath.GetFullPathUnderWorkspace. | |
| ForGuid(mWkPath, guid); | |
| if (fullPath == null) | |
| return; | |
| AssetStatus assetStatus = mAssetStatusCache.GetStatus(fullPath); | |
| LockStatusData lockStatusData = | |
| ClassifyAssetStatus.IsLockedRemote(assetStatus) ? | |
| mAssetStatusCache.GetLockStatusData(fullPath) : | |
| null; | |
| string tooltipText = GetTooltipText( | |
| assetStatus, | |
| lockStatusData); | |
| DrawOverlayIcon.ForStatus( | |
| selectionRect, | |
| assetStatus, | |
| tooltipText); | |
| } | |
| internal static class DrawOverlayIcon | |
| { | |
| internal static void ForStatus( | |
| Rect selectionRect, | |
| AssetStatus status, | |
| string tooltipText) | |
| { | |
| Texture overlayIcon = GetOverlayIcon(status); | |
| if (overlayIcon == null) | |
| return; | |
| Rect overlayRect = OverlayRect.GetOverlayRect( | |
| selectionRect, | |
| OVERLAY_ICON_OFFSET); | |
| GUI.DrawTexture( | |
| overlayRect, overlayIcon, ScaleMode.ScaleToFit); | |
| Rect tooltipRect = GetTooltipRect(selectionRect, overlayRect); | |
| GUI.Label(tooltipRect, new GUIContent(string.Empty, tooltipText)); | |
| } | |
| internal static Texture GetOverlayIcon(AssetStatus assetStatus) | |
| { | |
| if (ClassifyAssetStatus.IsPrivate(assetStatus)) | |
| return Images.GetPrivatedOverlayIcon(); | |
| if (ClassifyAssetStatus.IsIgnored(assetStatus)) | |
| return Images.GetIgnoredOverlayIcon(); | |
| if (ClassifyAssetStatus.IsAdded(assetStatus)) | |
| return Images.GetAddedOverlayIcon(); | |
| if (ClassifyAssetStatus.IsConflicted(assetStatus)) | |
| return Images.GetConflictedOverlayIcon(); | |
| if (ClassifyAssetStatus.IsDeletedOnServer(assetStatus)) | |
| return Images.GetDeletedRemoteOverlayIcon(); | |
| if (ClassifyAssetStatus.IsLockedRemote(assetStatus)) | |
| return Images.GetLockedRemoteOverlayIcon(); | |
| if (ClassifyAssetStatus.IsOutOfDate(assetStatus)) | |
| return Images.GetOutOfSyncOverlayIcon(); | |
| if (ClassifyAssetStatus.IsLocked(assetStatus)) | |
| return Images.GetLockedLocalOverlayIcon(); | |
| if (ClassifyAssetStatus.IsCheckedOut(assetStatus)) | |
| return Images.GetCheckedOutOverlayIcon(); | |
| return null; | |
| } | |
| static Rect Inflate(Rect rect, float width, float height) | |
| { | |
| return new Rect( | |
| rect.x - width, | |
| rect.y - height, | |
| rect.width + 2f * width, | |
| rect.height + 2f * height); | |
| } | |
| static Rect GetTooltipRect( | |
| Rect selectionRect, | |
| Rect overlayRect) | |
| { | |
| if (selectionRect.width > selectionRect.height) | |
| { | |
| return overlayRect; | |
| } | |
| return Inflate(overlayRect, 3f, 3f); | |
| } | |
| } | |
| static Action mRepaintProjectWindow; | |
| static bool mIsEnabled; | |
| static IAssetStatusCache mAssetStatusCache; | |
| static string mWkPath; | |
| const float OVERLAY_ICON_OFFSET = 20f; | |
| } | |
| } | |