unity/EditorPlugin/FindUsages/FindUsagesModelHelper.cs (113 lines of code) (raw):

using System; using System.Diagnostics; using System.IO; using System.Linq; using JetBrains.Collections.Viewable; using JetBrains.Diagnostics; using JetBrains.Lifetimes; using JetBrains.Rider.Model.Unity.BackendUnity; using JetBrains.Rider.Unity.Editor.FindUsages.Window; using JetBrains.Rider.Unity.Editor.NonUnity; using UnityEditor; using UnityEngine; namespace JetBrains.Rider.Unity.Editor.FindUsages { internal static class FindUsagesModelHelper { private static readonly ILog ourLogger = Log.GetLog("Navigation.Initialization"); public static void Advise(Lifetime modelLifetime, BackendUnityModel model) { model.ShowUsagesInUnity.Advise(modelLifetime, findUsagesResult => { if (findUsagesResult == null) return; MainThreadDispatcher.AssertThread(); ExpandMinimizedUnityWindow(); EditorUtility.FocusProjectWindow(); switch (findUsagesResult) { case AnimatorFindUsagesResult animatorUsage: ShowUtil.ShowAnimatorUsage(animatorUsage.PathElements, animatorUsage.FilePath); return; case HierarchyFindUsagesResult _ when findUsagesResult.Extension.Equals(".prefab", StringComparison.OrdinalIgnoreCase): ShowUtil.ShowFileUsage(findUsagesResult.FilePath); break; case HierarchyFindUsagesResult hierarchyFindUsagesResult: ShowUtil.ShowUsageOnScene(findUsagesResult.FilePath, findUsagesResult.FileName, hierarchyFindUsagesResult.PathElements, hierarchyFindUsagesResult.RootIndices); break; case AnimationFindUsagesResult animationEventUsage: ShowUtil.ShowAnimationEventUsage(animationEventUsage.FilePath); break; default: ShowUtil.ShowFileUsage(findUsagesResult.FilePath); break; } }); model.SendFindUsagesSessionResult.Advise(modelLifetime, result => { MainThreadDispatcher.AssertThread(); if (result != null) { #if UNITY_CORCLR_OR_NEWER GUI.BringWindowToFront((long)(ulong)EditorWindow.GetWindow<SceneView>().GetInstanceID()); GUI.BringWindowToFront((long)(ulong)EditorWindow .GetWindow(typeof(SceneView).Assembly.GetType("UnityEditor.SceneHierarchyWindow")).GetInstanceID()); GUI.BringWindowToFront((long)(ulong)EditorWindow .GetWindow(typeof(SceneView).Assembly.GetType("UnityEditor.ProjectBrowser")).GetInstanceID()); #else GUI.BringWindowToFront(EditorWindow.GetWindow<SceneView>().GetInstanceID()); GUI.BringWindowToFront(EditorWindow .GetWindow(typeof(SceneView).Assembly.GetType("UnityEditor.SceneHierarchyWindow")).GetInstanceID()); GUI.BringWindowToFront(EditorWindow .GetWindow(typeof(SceneView).Assembly.GetType("UnityEditor.ProjectBrowser")).GetInstanceID()); #endif var window = FindUsagesWindow.GetWindow(result.Target); window.SetDataToEditor(result.Elements); } }); model.ShowFileInUnity.AdviseNotNull(modelLifetime, result => { var fullName = new FileInfo(result).FullName; // only works for Assets folder var matchedUnityPath = fullName.Substring(Directory.GetParent(Application.dataPath).FullName.Length + 1); var asset = AssetDatabase.LoadAssetAtPath(matchedUnityPath, typeof(UnityEngine.Object)); if (asset == null) { // works for any assets including local packages, but might be slow on big projects matchedUnityPath = AssetDatabase.GetAllAssetPaths() .FirstOrDefault(a => new FileInfo(Path.GetFullPath(a)).FullName == fullName); // FileInfo normalizes separators (required on Windows) if (matchedUnityPath != null) asset = AssetDatabase.LoadAssetAtPath(matchedUnityPath, typeof(UnityEngine.Object)); } if (asset != null) { ExpandMinimizedUnityWindow(); EditorUtility.FocusProjectWindow(); ShowUtil.ShowObjectUsage(asset); } else { ourLogger.Warn($"ShowFileInUnity attempt failed. No asset matched for path {result}"); } }); } private static void ExpandMinimizedUnityWindow() { if (PluginSettings.SystemInfoRiderPlugin.OS == PathLocator.OS.Windows) { var topLevelWindows = User32Dll.GetTopLevelWindowHandles(); var windowHandles = topLevelWindows .Where(hwnd => User32Dll.GetWindowProcessId(hwnd) == Process.GetCurrentProcess().Id).ToArray(); foreach (var windowHandle in windowHandles) { if (User32Dll.IsIconic(windowHandle)) { User32Dll.ShowWindow(windowHandle, 9); User32Dll.SetForegroundWindow(windowHandle); } } } } } }