A game about forced loneliness, made by TACStudios
at master 2.3 kB view raw
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Reflection; 5 6using UnityEditor; 7using UnityEngine; 8 9namespace Unity.PlasticSCM.Editor.UI 10{ 11 internal static class FindEditorWindow 12 { 13 internal static EditorWindow ProjectWindow() 14 { 15 Type projectBrowserType = typeof(EditorWindow).Assembly.GetType( 16 "UnityEditor.ProjectBrowser"); 17 18 UnityEngine.Object[] windows = Resources.FindObjectsOfTypeAll( 19 projectBrowserType); 20 21 if (windows.Length == 0) 22 return null; 23 24 return windows[0] as EditorWindow; 25 } 26 27 internal static EditorWindow ToDock<T>() 28 { 29 List<EditorWindow> windows = GetAvailableWindows(); 30 31 IEnumerable<EditorWindow> candidateWindows = windows 32 .Where(w => !(w is T)) 33 .Where(w => w.position.width > 400 && w.position.height > 300) 34 .OrderByDescending(w => w.position.width * w.position.height); 35 36 return candidateWindows.FirstOrDefault(); 37 } 38 39 static List<EditorWindow> GetAvailableWindows() 40 { 41 List<EditorWindow> result = new List<EditorWindow>(); 42 43 var hostViewField = typeof(EditorWindow).GetField( 44 "m_Parent", BindingFlags.Instance | BindingFlags.NonPublic); 45 46 if (hostViewField == null) 47 return null; 48 49 var hostViewType = hostViewField.FieldType; 50 var actualViewField = hostViewType.GetField( 51 "m_ActualView", BindingFlags.Instance | BindingFlags.NonPublic); 52 53 if (actualViewField == null) 54 return null; 55 56 foreach (var window in Resources.FindObjectsOfTypeAll<EditorWindow>()) 57 { 58 var hostView = hostViewField.GetValue(window); 59 60 if (hostView == null) 61 continue; 62 63 EditorWindow actualDrawnWindow = actualViewField 64 .GetValue(hostView) as EditorWindow; 65 66 if (actualDrawnWindow == null) 67 continue; 68 69 if (result.Contains(actualDrawnWindow)) 70 continue; 71 72 result.Add(actualDrawnWindow); 73 } 74 75 return result; 76 } 77 } 78}