diff --git a/src/CacheObject/CacheField.cs b/src/CacheObject/CacheField.cs index 54025b3..ce003d0 100644 --- a/src/CacheObject/CacheField.cs +++ b/src/CacheObject/CacheField.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; +using Explorer.UI; namespace Explorer.CacheObject { @@ -21,6 +22,15 @@ namespace Explorer.CacheObject public override void UpdateValue() { + if (IValue is InteractiveDictionary iDict) + { + if (!iDict.EnsureDictionaryIsSupported()) + { + ReflectionException = "Not supported due to TypeInitializationException"; + return; + } + } + try { var fi = MemInfo as FieldInfo; diff --git a/src/CacheObject/CacheProperty.cs b/src/CacheObject/CacheProperty.cs index ab61ae3..1e2cea8 100644 --- a/src/CacheObject/CacheProperty.cs +++ b/src/CacheObject/CacheProperty.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; +using Explorer.UI; namespace Explorer.CacheObject { @@ -32,6 +33,15 @@ namespace Explorer.CacheObject return; } + if (IValue is InteractiveDictionary iDict) + { + if (!iDict.EnsureDictionaryIsSupported()) + { + ReflectionException = "Not supported due to TypeInitializationException"; + return; + } + } + try { var pi = MemInfo as PropertyInfo; diff --git a/src/Explorer.csproj b/src/Explorer.csproj index e9cf1e5..dbe84a7 100644 --- a/src/Explorer.csproj +++ b/src/Explorer.csproj @@ -231,7 +231,7 @@ - + diff --git a/src/ExplorerCore.cs b/src/ExplorerCore.cs index 3991c51..d88fcb1 100644 --- a/src/ExplorerCore.cs +++ b/src/ExplorerCore.cs @@ -10,7 +10,7 @@ namespace Explorer public class ExplorerCore { public const string NAME = "Explorer " + VERSION + " (" + PLATFORM + ", " + MODLOADER + ")"; - public const string VERSION = "2.0.4"; + public const string VERSION = "2.0.5"; public const string AUTHOR = "Sinai"; public const string GUID = "com.sinai.explorer"; @@ -110,27 +110,27 @@ namespace Explorer public static void Log(object message) { #if ML - MelonLoader.MelonLogger.Log(message.ToString()); + MelonLoader.MelonLogger.Log(message?.ToString()); #else - ExplorerBepInPlugin.Logging?.LogMessage(message.ToString()); + ExplorerBepInPlugin.Logging?.LogMessage(message?.ToString()); #endif } public static void LogWarning(object message) { #if ML - MelonLoader.MelonLogger.LogWarning(message.ToString()); + MelonLoader.MelonLogger.LogWarning(message?.ToString()); #else - ExplorerBepInPlugin.Logging?.LogWarning(message.ToString()); + ExplorerBepInPlugin.Logging?.LogWarning(message?.ToString()); #endif } public static void LogError(object message) { #if ML - MelonLoader.MelonLogger.LogError(message.ToString()); + MelonLoader.MelonLogger.LogError(message?.ToString()); #else - ExplorerBepInPlugin.Logging?.LogError(message.ToString()); + ExplorerBepInPlugin.Logging?.LogError(message?.ToString()); #endif } } diff --git a/src/Input/AbstractInput.cs b/src/Input/AbstractInput.cs deleted file mode 100644 index ef18f56..0000000 --- a/src/Input/AbstractInput.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine; - -namespace Explorer.Input -{ - public abstract class AbstractInput - { - public abstract void Init(); - - public abstract Vector2 MousePosition { get; } - - public abstract bool GetKeyDown(KeyCode key); - public abstract bool GetKey(KeyCode key); - - public abstract bool GetMouseButtonDown(int btn); - public abstract bool GetMouseButton(int btn); - } -} diff --git a/src/Input/IAbstractInput.cs b/src/Input/IAbstractInput.cs new file mode 100644 index 0000000..ad33315 --- /dev/null +++ b/src/Input/IAbstractInput.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace Explorer.Input +{ + public interface IAbstractInput + { + void Init(); + + Vector2 MousePosition { get; } + + bool GetKeyDown(KeyCode key); + bool GetKey(KeyCode key); + + bool GetMouseButtonDown(int btn); + bool GetMouseButton(int btn); + } +} diff --git a/src/Input/InputManager.cs b/src/Input/InputManager.cs index 6979398..855513a 100644 --- a/src/Input/InputManager.cs +++ b/src/Input/InputManager.cs @@ -10,37 +10,35 @@ namespace Explorer { public static class InputManager { - private static AbstractInput inputModule; + private static IAbstractInput m_inputModule; public static void Init() { - if (InputSystem.TKeyboard != null || TryLoadModule("Unity.InputSystem", InputSystem.TKeyboard)) + if (InputSystem.TKeyboard != null || (ReflectionHelpers.LoadModule("Unity.InputSystem") && InputSystem.TKeyboard != null)) { - inputModule = new InputSystem(); + m_inputModule = new InputSystem(); } - else if (LegacyInput.TInput != null || TryLoadModule("UnityEngine.InputLegacyModule", LegacyInput.TInput)) + else if (LegacyInput.TInput != null || (ReflectionHelpers.LoadModule("UnityEngine.InputLegacyModule") && LegacyInput.TInput != null)) { - inputModule = new LegacyInput(); + m_inputModule = new LegacyInput(); } - if (inputModule == null) + if (m_inputModule == null) { ExplorerCore.LogWarning("Could not find any Input module!"); - inputModule = new NoInput(); + m_inputModule = new NoInput(); } - inputModule.Init(); - - bool TryLoadModule(string dll, Type check) => ReflectionHelpers.LoadModule(dll) && check != null; + m_inputModule.Init(); } - public static Vector3 MousePosition => inputModule.MousePosition; + public static Vector3 MousePosition => m_inputModule.MousePosition; - public static bool GetKeyDown(KeyCode key) => inputModule.GetKeyDown(key); - public static bool GetKey(KeyCode key) => inputModule.GetKey(key); + public static bool GetKeyDown(KeyCode key) => m_inputModule.GetKeyDown(key); + public static bool GetKey(KeyCode key) => m_inputModule.GetKey(key); - public static bool GetMouseButtonDown(int btn) => inputModule.GetMouseButtonDown(btn); - public static bool GetMouseButton(int btn) => inputModule.GetMouseButton(btn); + public static bool GetMouseButtonDown(int btn) => m_inputModule.GetMouseButtonDown(btn); + public static bool GetMouseButton(int btn) => m_inputModule.GetMouseButton(btn); #if CPP internal delegate void d_ResetInputAxes(); diff --git a/src/Input/InputSystem.cs b/src/Input/InputSystem.cs index 4f34b96..0f23629 100644 --- a/src/Input/InputSystem.cs +++ b/src/Input/InputSystem.cs @@ -7,7 +7,7 @@ using UnityEngine; namespace Explorer.Input { - public class InputSystem : AbstractInput + public class InputSystem : IAbstractInput { public static Type TKeyboard => _keyboard ?? (_keyboard = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Keyboard")); private static Type _keyboard; @@ -43,9 +43,9 @@ namespace Explorer.Input private static PropertyInfo _positionProp; private static MethodInfo _readVector2InputMethod; - public override Vector2 MousePosition => (Vector2)_readVector2InputMethod.Invoke(MousePositionInfo, new object[0]); + public Vector2 MousePosition => (Vector2)_readVector2InputMethod.Invoke(MousePositionInfo, new object[0]); - public override bool GetKeyDown(KeyCode key) + public bool GetKeyDown(KeyCode key) { var parsedKey = Enum.Parse(TKey, key.ToString()); var actualKey = _kbIndexer.GetValue(CurrentKeyboard, new object[] { parsedKey }); @@ -53,7 +53,7 @@ namespace Explorer.Input return (bool)_btnWasPressedProp.GetValue(actualKey, null); } - public override bool GetKey(KeyCode key) + public bool GetKey(KeyCode key) { var parsed = Enum.Parse(TKey, key.ToString()); var actualKey = _kbIndexer.GetValue(CurrentKeyboard, new object[] { parsed }); @@ -61,7 +61,7 @@ namespace Explorer.Input return (bool)_btnIsPressedProp.GetValue(actualKey, null); } - public override bool GetMouseButtonDown(int btn) + public bool GetMouseButtonDown(int btn) { switch (btn) { @@ -72,7 +72,7 @@ namespace Explorer.Input } } - public override bool GetMouseButton(int btn) + public bool GetMouseButton(int btn) { switch (btn) { @@ -83,7 +83,7 @@ namespace Explorer.Input } } - public override void Init() + public void Init() { ExplorerCore.Log("Initializing new InputSystem support..."); diff --git a/src/Input/LegacyInput.cs b/src/Input/LegacyInput.cs index 808b900..183426f 100644 --- a/src/Input/LegacyInput.cs +++ b/src/Input/LegacyInput.cs @@ -7,7 +7,7 @@ using UnityEngine; namespace Explorer.Input { - public class LegacyInput : AbstractInput + public class LegacyInput : IAbstractInput { public static Type TInput => _input ?? (_input = ReflectionHelpers.GetTypeByName("UnityEngine.Input")); private static Type _input; @@ -18,17 +18,17 @@ namespace Explorer.Input private static MethodInfo _getMouseButtonMethod; private static MethodInfo _getMouseButtonDownMethod; - public override Vector2 MousePosition => (Vector3)_mousePositionProp.GetValue(null, null); + public Vector2 MousePosition => (Vector3)_mousePositionProp.GetValue(null, null); - public override bool GetKey(KeyCode key) => (bool)_getKeyMethod.Invoke(null, new object[] { key }); + public bool GetKey(KeyCode key) => (bool)_getKeyMethod.Invoke(null, new object[] { key }); - public override bool GetKeyDown(KeyCode key) => (bool)_getKeyDownMethod.Invoke(null, new object[] { key }); + public bool GetKeyDown(KeyCode key) => (bool)_getKeyDownMethod.Invoke(null, new object[] { key }); - public override bool GetMouseButton(int btn) => (bool)_getMouseButtonMethod.Invoke(null, new object[] { btn }); + public bool GetMouseButton(int btn) => (bool)_getMouseButtonMethod.Invoke(null, new object[] { btn }); - public override bool GetMouseButtonDown(int btn) => (bool)_getMouseButtonDownMethod.Invoke(null, new object[] { btn }); + public bool GetMouseButtonDown(int btn) => (bool)_getMouseButtonDownMethod.Invoke(null, new object[] { btn }); - public override void Init() + public void Init() { ExplorerCore.Log("Initializing Legacy Input support..."); diff --git a/src/Input/NoInput.cs b/src/Input/NoInput.cs index 10c1ba8..a5b2297 100644 --- a/src/Input/NoInput.cs +++ b/src/Input/NoInput.cs @@ -8,18 +8,16 @@ namespace Explorer.Input { // Just a stub for games where no Input module was able to load at all. - public class NoInput : AbstractInput + public class NoInput : IAbstractInput { - public override Vector2 MousePosition => Vector2.zero; + public Vector2 MousePosition => Vector2.zero; - public override bool GetKey(KeyCode key) => false; + public bool GetKey(KeyCode key) => false; + public bool GetKeyDown(KeyCode key) => false; - public override bool GetKeyDown(KeyCode key) => false; + public bool GetMouseButton(int btn) => false; + public bool GetMouseButtonDown(int btn) => false; - public override bool GetMouseButton(int btn) => false; - - public override bool GetMouseButtonDown(int btn) => false; - - public override void Init() { } + public void Init() { } } } diff --git a/src/UI/Inspectors/GameObjectInspector.cs b/src/UI/Inspectors/GameObjectInspector.cs index c1a6388..607b83b 100644 --- a/src/UI/Inspectors/GameObjectInspector.cs +++ b/src/UI/Inspectors/GameObjectInspector.cs @@ -169,6 +169,8 @@ namespace Explorer.UI.Inspectors private void DestroyOnException(Exception e) { + if (pendingDestroy) return; + ExplorerCore.Log($"Exception drawing GameObject Window: {e.GetType()}, {e.Message}"); pendingDestroy = true; DestroyWindow(); diff --git a/src/UI/Inspectors/ReflectionInspector.cs b/src/UI/Inspectors/ReflectionInspector.cs index a804ff2..eb9ac3e 100644 --- a/src/UI/Inspectors/ReflectionInspector.cs +++ b/src/UI/Inspectors/ReflectionInspector.cs @@ -208,8 +208,6 @@ namespace Explorer.UI.Inspectors continue; } - //ExplorerCore.Log($"Trying to cache member {sig}..."); - try { var cached = CacheFactory.GetCacheObject(member, target); @@ -218,7 +216,11 @@ namespace Explorer.UI.Inspectors { cachedSigs.Add(sig); list.Add(cached); - cached.ReflectionException = exception; + + if (string.IsNullOrEmpty(cached.ReflectionException)) + { + cached.ReflectionException = exception; + } } } catch (Exception e) diff --git a/src/UI/InteractiveValue/InteractiveValue.cs b/src/UI/InteractiveValue/InteractiveValue.cs index e873119..c7d218f 100644 --- a/src/UI/InteractiveValue/InteractiveValue.cs +++ b/src/UI/InteractiveValue/InteractiveValue.cs @@ -204,27 +204,45 @@ namespace Explorer.UI var valueType = ReflectionHelpers.GetActualType(Value); - string label = (string)ToStringMethod?.Invoke(Value, null) ?? Value.ToString(); + string label; - var classColor = valueType.IsAbstract && valueType.IsSealed - ? Syntax.Class_Static - : Syntax.Class_Instance; - - string typeLabel = $"{valueType.FullName}"; - - if (Value is UnityEngine.Object) + if (valueType == typeof(TextAsset)) { - label = label.Replace($"({valueType.FullName})", $"({typeLabel})"); + var textAsset = Value as TextAsset; + + label = textAsset.text; + + if (label.Length > 10) + { + label = $"{label.Substring(0, 10)}..."; + } + + label = $"\"{label}\" {textAsset.name} (UnityEngine.TextAsset)"; } else { - if (!label.Contains(valueType.FullName)) + label = (string)ToStringMethod?.Invoke(Value, null) ?? Value.ToString(); + + var classColor = valueType.IsAbstract && valueType.IsSealed + ? Syntax.Class_Static + : Syntax.Class_Instance; + + string typeLabel = $"{valueType.FullName}"; + + if (Value is UnityEngine.Object) { - label += $" ({typeLabel})"; + label = label.Replace($"({valueType.FullName})", $"({typeLabel})"); } else { - label = label.Replace(valueType.FullName, typeLabel); + if (!label.Contains(valueType.FullName)) + { + label += $" ({typeLabel})"; + } + else + { + label = label.Replace(valueType.FullName, typeLabel); + } } } diff --git a/src/UI/InteractiveValue/Object/InteractiveDictionary.cs b/src/UI/InteractiveValue/Object/InteractiveDictionary.cs index 8dc1224..2d56859 100644 --- a/src/UI/InteractiveValue/Object/InteractiveDictionary.cs +++ b/src/UI/InteractiveValue/Object/InteractiveDictionary.cs @@ -161,7 +161,7 @@ namespace Explorer.UI m_cachedValues = values.ToArray(); } - private bool EnsureDictionaryIsSupported() + public bool EnsureDictionaryIsSupported() { if (typeof(IDictionary).IsAssignableFrom(ValueType)) { @@ -180,6 +180,11 @@ namespace Explorer.UI .GetField("NativeClassPtr") .GetValue(null); + if (ptr == IntPtr.Zero) + { + return false; + } + return Il2CppSystem.Type.internal_from_handle(IL2CPP.il2cpp_class_get_type(ptr)) is Il2CppSystem.Type; } } diff --git a/src/UI/Main/SearchPage.cs b/src/UI/Main/SearchPage.cs index 153aa6e..5a92949 100644 --- a/src/UI/Main/SearchPage.cs +++ b/src/UI/Main/SearchPage.cs @@ -6,6 +6,7 @@ using System.Reflection; using UnityEngine; using Explorer.UI.Shared; using Explorer.CacheObject; +using System.Threading; namespace Explorer.UI.Main { @@ -15,9 +16,13 @@ namespace Explorer.UI.Main public override string Name { get => "Search"; } + private int MaxSearchResults = 5000; + private string m_searchInput = ""; private string m_typeInput = ""; + //private bool m_cachingResults; + private Vector2 resultsScroll = Vector2.zero; public PageHelper Pages = new PageHelper(); @@ -58,6 +63,8 @@ namespace Explorer.UI.Main private void CacheResults(IEnumerable results, bool isStaticClasses = false) { + //m_cachingResults = true; + m_searchResults = new List(); foreach (var obj in results) @@ -67,6 +74,9 @@ namespace Explorer.UI.Main #if CPP if (toCache is Il2CppSystem.Object ilObject) { + var type = ReflectionHelpers.GetActualType(ilObject); + ilObject = (Il2CppSystem.Object)ilObject.Il2CppCast(type); + toCache = ilObject.TryCast() ?? ilObject.TryCast()?.gameObject ?? ilObject; } #else @@ -76,6 +86,14 @@ namespace Explorer.UI.Main } #endif + if (toCache is TextAsset textAsset) + { + if (string.IsNullOrEmpty(textAsset.text)) + { + continue; + } + } + var cache = CacheFactory.GetCacheObject(toCache); cache.IsStaticClassSearchResult = isStaticClasses; m_searchResults.Add(cache); @@ -83,190 +101,25 @@ namespace Explorer.UI.Main Pages.ItemCount = m_searchResults.Count; Pages.PageOffset = 0; + + results = null; + + //m_cachingResults = false; } - public override void DrawWindow() - { - try - { - // helpers - GUIUnstrip.BeginHorizontal(GUIContent.none, GUI.skin.box, null); - GUILayout.Label("Helpers", new GUILayoutOption[] { GUILayout.Width(70) }); - if (GUILayout.Button("Find Static Instances", new GUILayoutOption[] { GUILayout.Width(180) })) - { - CacheResults(GetStaticInstances()); - } - if (GUILayout.Button("Find Static Classes", new GUILayoutOption[] { GUILayout.Width(180) })) - { - CacheResults(GetStaticClasses(), true); - } - GUILayout.EndHorizontal(); - - // search box - SearchBox(); - - // results - GUIUnstrip.BeginVertical(GUIContent.none, GUI.skin.box, null); - - GUI.skin.label.alignment = TextAnchor.MiddleCenter; - GUILayout.Label("Results " + " (" + m_searchResults.Count + ")", new GUILayoutOption[0]); - GUI.skin.label.alignment = TextAnchor.UpperLeft; - - int count = m_searchResults.Count; - - GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); - - Pages.DrawLimitInputArea(); - - if (count > Pages.ItemsPerPage) - { - // prev/next page buttons - - if (Pages.ItemCount > Pages.ItemsPerPage) - { - if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(80) })) - { - Pages.TurnPage(Turn.Left, ref this.resultsScroll); - } - - Pages.CurrentPageLabel(); - - if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(80) })) - { - Pages.TurnPage(Turn.Right, ref this.resultsScroll); - } - } - } - - GUILayout.EndHorizontal(); - - resultsScroll = GUIUnstrip.BeginScrollView(resultsScroll); - - var _temprect = new Rect(MainMenu.MainRect.x, MainMenu.MainRect.y, MainMenu.MainRect.width + 160, MainMenu.MainRect.height); - - if (m_searchResults.Count > 0) - { - int offset = Pages.CalculateOffsetIndex(); - - for (int i = offset; i < offset + Pages.ItemsPerPage && i < count; i++) - { - m_searchResults[i].Draw(MainMenu.MainRect, 0f); - } - } - else - { - GUILayout.Label("No results found!", new GUILayoutOption[0]); - } - - GUIUnstrip.EndScrollView(); - GUILayout.EndVertical(); - } - catch (Exception e) - { - ExplorerCore.Log("Exception drawing search results!"); - while (e != null) - { - ExplorerCore.Log(e); - e = e.InnerException; - } - - m_searchResults.Clear(); - } - } - - private void SearchBox() - { - GUIUnstrip.BeginVertical(GUIContent.none, GUI.skin.box, null); - - // ----- GameObject Search ----- - GUI.skin.label.alignment = TextAnchor.MiddleCenter; - GUILayout.Label("Search", new GUILayoutOption[0]); - GUI.skin.label.alignment = TextAnchor.UpperLeft; - - GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); - - GUILayout.Label("Name Contains:", new GUILayoutOption[] { GUILayout.Width(100) }); - m_searchInput = GUIUnstrip.TextField(m_searchInput, new GUILayoutOption[] { GUILayout.Width(200) }); - - GUILayout.EndHorizontal(); - - GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); - - GUILayout.Label("Class Filter:", new GUILayoutOption[] { GUILayout.Width(100) }); - ClassFilterToggle(TypeFilter.Object, "Object"); - ClassFilterToggle(TypeFilter.GameObject, "GameObject"); - ClassFilterToggle(TypeFilter.Component, "Component"); - ClassFilterToggle(TypeFilter.Custom, "Custom"); - GUILayout.EndHorizontal(); - if (TypeMode == TypeFilter.Custom) - { - GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); - GUI.skin.label.alignment = TextAnchor.MiddleRight; - GUILayout.Label("Custom Class:", new GUILayoutOption[] { GUILayout.Width(250) }); - GUI.skin.label.alignment = TextAnchor.UpperLeft; - m_typeInput = GUIUnstrip.TextField(m_typeInput, new GUILayoutOption[] { GUILayout.Width(250) }); - GUILayout.EndHorizontal(); - } - - GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); - GUILayout.Label("Scene Filter:", new GUILayoutOption[] { GUILayout.Width(100) }); - SceneFilterToggle(SceneFilter.Any, "Any", 60); - SceneFilterToggle(SceneFilter.This, "This Scene", 100); - SceneFilterToggle(SceneFilter.DontDestroy, "DontDestroyOnLoad", 140); - SceneFilterToggle(SceneFilter.None, "No Scene", 80); - GUILayout.EndHorizontal(); - - if (GUILayout.Button("Search", new GUILayoutOption[0])) - { - Search(); - } - - GUILayout.EndVertical(); - } - - private void ClassFilterToggle(TypeFilter mode, string label) - { - if (TypeMode == mode) - { - GUI.color = Color.green; - } - else - { - GUI.color = Color.white; - } - if (GUILayout.Button(label, new GUILayoutOption[] { GUILayout.Width(100) })) - { - TypeMode = mode; - } - GUI.color = Color.white; - } - - private void SceneFilterToggle(SceneFilter mode, string label, float width) - { - if (SceneMode == mode) - { - GUI.color = Color.green; - } - else - { - GUI.color = Color.white; - } - if (GUILayout.Button(label, new GUILayoutOption[] { GUILayout.Width(width) })) - { - SceneMode = mode; - } - GUI.color = Color.white; - } - - - // -------------- ACTUAL METHODS (not Gui draw) ----------------- // - - // ======= search functions ======= - private void Search() { + //if (m_cachingResults) + //{ + // ExplorerCore.Log("Cannot search now, we are already caching results..."); + // return; + //} + Pages.PageOffset = 0; - CacheResults(FindAllObjectsOfType(m_searchInput, m_typeInput)); + + // Would use Task, but Explorer is .NET 3.5-compatible. + var objectsOfType = FindAllObjectsOfType(m_searchInput, m_typeInput); + CacheResults(objectsOfType); } private List FindAllObjectsOfType(string searchQuery, string typeName) @@ -330,7 +183,7 @@ namespace Explorer.UI.Main int i = 0; foreach (var obj in allObjectsOfType) { - if (i >= 2000) break; + if (i >= MaxSearchResults) break; if (searchQuery != "" && !obj.name.ToLower().Contains(searchQuery.ToLower())) { @@ -362,6 +215,10 @@ namespace Explorer.UI.Main i++; } + allObjectsOfType = null; + searchType = null; + searchQuery = null; + return matches; } @@ -401,8 +258,6 @@ namespace Explorer.UI.Main return false; } - // ====== other ======== - private static bool FilterName(string name) { // Don't really want these instances. @@ -504,5 +359,202 @@ namespace Explorer.UI.Main return list; } + + // =========== GUI DRAW ============= // + + public override void DrawWindow() + { + try + { + // helpers + GUIUnstrip.BeginHorizontal(GUIContent.none, GUI.skin.box, null); + GUILayout.Label("Helpers", new GUILayoutOption[] { GUILayout.Width(70) }); + if (GUILayout.Button("Find Static Instances", new GUILayoutOption[] { GUILayout.Width(180) })) + { + CacheResults(GetStaticInstances()); + } + if (GUILayout.Button("Find Static Classes", new GUILayoutOption[] { GUILayout.Width(180) })) + { + CacheResults(GetStaticClasses(), true); + } + GUILayout.EndHorizontal(); + + // search box + SearchBox(); + + // results + GUIUnstrip.BeginVertical(GUIContent.none, GUI.skin.box, null); + + GUI.skin.label.alignment = TextAnchor.MiddleCenter; + GUILayout.Label("Results " + " (" + m_searchResults.Count + ")", new GUILayoutOption[0]); + GUI.skin.label.alignment = TextAnchor.UpperLeft; + + int count = m_searchResults.Count; + + GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); + + Pages.DrawLimitInputArea(); + + if (count > Pages.ItemsPerPage) + { + // prev/next page buttons + + if (Pages.ItemCount > Pages.ItemsPerPage) + { + if (GUILayout.Button("< Prev", new GUILayoutOption[] { GUILayout.Width(80) })) + { + Pages.TurnPage(Turn.Left, ref this.resultsScroll); + } + + Pages.CurrentPageLabel(); + + if (GUILayout.Button("Next >", new GUILayoutOption[] { GUILayout.Width(80) })) + { + Pages.TurnPage(Turn.Right, ref this.resultsScroll); + } + } + } + + GUILayout.EndHorizontal(); + + resultsScroll = GUIUnstrip.BeginScrollView(resultsScroll); + + var _temprect = new Rect(MainMenu.MainRect.x, MainMenu.MainRect.y, MainMenu.MainRect.width + 160, MainMenu.MainRect.height); + + if (m_searchResults.Count > 0) + { + int offset = Pages.CalculateOffsetIndex(); + + for (int i = offset; i < offset + Pages.ItemsPerPage && i < count; i++) + { + if (i >= m_searchResults.Count) break; + + m_searchResults[i].Draw(MainMenu.MainRect, 0f); + } + } + else + { + GUILayout.Label("No results found!", new GUILayoutOption[0]); + } + + GUIUnstrip.EndScrollView(); + GUILayout.EndVertical(); + } + catch (Exception e) + { + if (!e.Message.Contains("in a group with only")) + { + ExplorerCore.Log("Exception drawing search results!"); + while (e != null) + { + ExplorerCore.Log(e); + e = e.InnerException; + } + m_searchResults.Clear(); + } + } + } + + private void SearchBox() + { + GUIUnstrip.BeginVertical(GUIContent.none, GUI.skin.box, null); + + // ----- GameObject Search ----- + GUI.skin.label.alignment = TextAnchor.MiddleCenter; + GUILayout.Label("Search", new GUILayoutOption[0]); + GUI.skin.label.alignment = TextAnchor.UpperLeft; + + GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); + + GUILayout.Label("Name Contains:", new GUILayoutOption[] { GUILayout.Width(100) }); + m_searchInput = GUIUnstrip.TextField(m_searchInput, new GUILayoutOption[] { GUILayout.Width(200) }); + + GUILayout.Label("Max Results:", new GUILayoutOption[] { GUILayout.Width(100) }); + var s = MaxSearchResults.ToString(); + s = GUIUnstrip.TextField(s, new GUILayoutOption[] { GUILayout.Width(80) }); + if (int.TryParse(s, out int i)) + { + MaxSearchResults = i; + } + GUILayout.EndHorizontal(); + + GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); + + GUILayout.Label("Class Filter:", new GUILayoutOption[] { GUILayout.Width(100) }); + ClassFilterToggle(TypeFilter.Object, "Object"); + ClassFilterToggle(TypeFilter.GameObject, "GameObject"); + ClassFilterToggle(TypeFilter.Component, "Component"); + ClassFilterToggle(TypeFilter.Custom, "Custom"); + GUILayout.EndHorizontal(); + if (TypeMode == TypeFilter.Custom) + { + GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); + GUI.skin.label.alignment = TextAnchor.MiddleRight; + GUILayout.Label("Custom Class:", new GUILayoutOption[] { GUILayout.Width(250) }); + GUI.skin.label.alignment = TextAnchor.UpperLeft; + m_typeInput = GUIUnstrip.TextField(m_typeInput, new GUILayoutOption[] { GUILayout.Width(250) }); + GUILayout.EndHorizontal(); + } + + GUIUnstrip.BeginHorizontal(new GUILayoutOption[0]); + GUILayout.Label("Scene Filter:", new GUILayoutOption[] { GUILayout.Width(100) }); + SceneFilterToggle(SceneFilter.Any, "Any", 60); + SceneFilterToggle(SceneFilter.This, "This Scene", 100); + SceneFilterToggle(SceneFilter.DontDestroy, "DontDestroyOnLoad", 140); + SceneFilterToggle(SceneFilter.None, "No Scene", 80); + GUILayout.EndHorizontal(); + + if (GUILayout.Button("Search", new GUILayoutOption[0])) + { + Search(); + } + //if (m_cachingResults) + //{ + // GUILayout.Label("Searching...", new GUILayoutOption[0]); + //} + //else + //{ + // if (GUILayout.Button("Search", new GUILayoutOption[0])) + // { + // Search(); + // } + //} + + GUILayout.EndVertical(); + } + + private void ClassFilterToggle(TypeFilter mode, string label) + { + if (TypeMode == mode) + { + GUI.color = Color.green; + } + else + { + GUI.color = Color.white; + } + if (GUILayout.Button(label, new GUILayoutOption[] { GUILayout.Width(100) })) + { + TypeMode = mode; + } + GUI.color = Color.white; + } + + private void SceneFilterToggle(SceneFilter mode, string label, float width) + { + if (SceneMode == mode) + { + GUI.color = Color.green; + } + else + { + GUI.color = Color.white; + } + if (GUILayout.Button(label, new GUILayoutOption[] { GUILayout.Width(width) })) + { + SceneMode = mode; + } + GUI.color = Color.white; + } } }