A game about forced loneliness, made by TACStudios
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}