From 8f025622b401e2922651d7d911639632281399bc Mon Sep 17 00:00:00 2001 From: Sinai Date: Wed, 31 Mar 2021 22:58:17 +1100 Subject: [PATCH] 3.3.2 * Added InteractiveColor UI editor to make changing a Color easier * Added a "Scene Loader" helper which allows you to load any Scene that the game was built with. In some cases you may not find all the Scenes that the game uses, they may be loaded through AssetBundles or other means and won't show up here yet * Adjusted the SceneExplorer UI, the "Hide" button is now always on the left of the window * * Handled some errors related to UI unstripping that could occur in rare cases --- src/Core/ReflectionUtility.cs | 28 ++- src/Core/Runtime/Il2Cpp/Il2CppProvider.cs | 40 ++++- src/Core/Runtime/Mono/MonoProvider.cs | 15 +- src/Core/Runtime/Mono/MonoTextureUtil.cs | 4 +- src/Core/Runtime/RuntimeProvider.cs | 2 +- src/ExplorerCore.cs | 2 +- src/Loader/ML/MelonLoaderConfigHandler.cs | 6 + src/UI/CacheObject/CacheConfigEntry.cs | 18 -- src/UI/CacheObject/CacheMember.cs | 18 +- src/UI/InteractiveValues/InteractiveBool.cs | 4 +- src/UI/InteractiveValues/InteractiveColor.cs | 168 ++++++++++++++++++ src/UI/InteractiveValues/InteractiveNumber.cs | 4 +- src/UI/InteractiveValues/InteractiveString.cs | 2 +- .../InteractiveUnityStruct.cs | 2 +- src/UI/InteractiveValues/InteractiveValue.cs | 24 +-- src/UI/Main/CSConsole/AutoCompleter.cs | 9 +- src/UI/Main/Home/InspectorManager.cs | 11 +- .../Home/Inspectors/GameObjects/ChildList.cs | 6 +- .../Inspectors/GameObjects/ComponentList.cs | 6 +- .../GameObjects/GameObjectControls.cs | 5 +- .../Reflection/InstanceInspector.cs | 17 +- .../Reflection/ReflectionInspector.cs | 18 +- src/UI/Main/Home/SceneExplorer.cs | 162 +++++++++++------ src/UI/Main/MainMenu.cs | 18 +- src/UI/Main/Search/SearchPage.cs | 15 +- src/UI/UIFactory.cs | 61 +++---- src/UI/UIManager.cs | 2 - src/UI/Utility/SliderScrollbar.cs | 2 +- src/UnityExplorer.csproj | 1 + 29 files changed, 441 insertions(+), 229 deletions(-) create mode 100644 src/UI/InteractiveValues/InteractiveColor.cs diff --git a/src/Core/ReflectionUtility.cs b/src/Core/ReflectionUtility.cs index b14bced..06a534a 100644 --- a/src/Core/ReflectionUtility.cs +++ b/src/Core/ReflectionUtility.cs @@ -11,7 +11,7 @@ namespace UnityExplorer.Core { public static class ReflectionUtility { - public const BF CommonFlags = BF.Public | BF.Instance | BF.NonPublic | BF.Static; + public const BF AllFlags = BF.Public | BF.Instance | BF.NonPublic | BF.Static; /// /// Helper for IL2CPP to get the underlying true Type (Unhollowed) of the object. @@ -163,6 +163,32 @@ namespace UnityExplorer.Core } } + internal static Dictionary> s_cachedFieldInfos = new Dictionary>(); + + public static FieldInfo GetFieldInfo(Type type, string fieldName) + { + if (!s_cachedFieldInfos.ContainsKey(type)) + s_cachedFieldInfos.Add(type, new Dictionary()); + + if (!s_cachedFieldInfos[type].ContainsKey(fieldName)) + s_cachedFieldInfos[type].Add(fieldName, type.GetField(fieldName, AllFlags)); + + return s_cachedFieldInfos[type][fieldName]; + } + + internal static Dictionary> s_cachedPropInfos = new Dictionary>(); + + public static PropertyInfo GetPropertyInfo(Type type, string propertyName) + { + if (!s_cachedPropInfos.ContainsKey(type)) + s_cachedPropInfos.Add(type, new Dictionary()); + + if (!s_cachedPropInfos[type].ContainsKey(propertyName)) + s_cachedPropInfos[type].Add(propertyName, type.GetProperty(propertyName, AllFlags)); + + return s_cachedPropInfos[type][propertyName]; + } + /// /// Helper to display a simple "{ExceptionType}: {Message}" of the exception, and optionally use the inner-most exception. /// diff --git a/src/Core/Runtime/Il2Cpp/Il2CppProvider.cs b/src/Core/Runtime/Il2Cpp/Il2CppProvider.cs index 2e81243..c6c4f8c 100644 --- a/src/Core/Runtime/Il2Cpp/Il2CppProvider.cs +++ b/src/Core/Runtime/Il2Cpp/Il2CppProvider.cs @@ -13,6 +13,7 @@ using UnityEngine.SceneManagement; using System.Collections; using UnityEngine.UI; using UnityExplorer.Core.Input; +using UnityEngine.EventSystems; namespace UnityExplorer.Core.Runtime.Il2Cpp { @@ -121,17 +122,42 @@ namespace UnityExplorer.Core.Runtime.Il2Cpp .Invoke(handle); } - // Custom check for il2cpp input pointer event + internal static bool? s_doPropertiesExist; - public override void CheckInputPointerEvent() + public override ColorBlock SetColorBlock(ColorBlock colors, Color? normal = null, Color? highlighted = null, Color? pressed = null) { - // Some IL2CPP games behave weird with multiple UI Input Systems, some fixes for them. - var evt = InputManager.InputPointerEvent; - if (evt != null) + if (s_doPropertiesExist == null) { - if (!evt.eligibleForClick && evt.selectedObject) - evt.eligibleForClick = true; + var prop = ReflectionUtility.GetPropertyInfo(typeof(ColorBlock), "normalColor") as PropertyInfo; + s_doPropertiesExist = prop != null && prop.CanWrite; } + + colors.colorMultiplier = 1; + + object boxed = (object)colors; + + if (s_doPropertiesExist == true) + { + if (normal != null) + ReflectionUtility.GetPropertyInfo(typeof(ColorBlock), "normalColor").SetValue(boxed, (Color)normal); + if (pressed != null) + ReflectionUtility.GetPropertyInfo(typeof(ColorBlock), "pressedColor").SetValue(boxed, (Color)pressed); + if (highlighted != null) + ReflectionUtility.GetPropertyInfo(typeof(ColorBlock), "highlightedColor").SetValue(boxed, (Color)highlighted); + } + else if (s_doPropertiesExist == false) + { + if (normal != null) + ReflectionUtility.GetFieldInfo(typeof(ColorBlock), "m_NormalColor").SetValue(boxed, (Color)normal); + if (pressed != null) + ReflectionUtility.GetFieldInfo(typeof(ColorBlock), "m_PressedColor").SetValue(boxed, (Color)pressed); + if (highlighted != null) + ReflectionUtility.GetFieldInfo(typeof(ColorBlock), "m_HighlightedColor").SetValue(boxed, (Color)highlighted); + } + + colors = (ColorBlock)boxed; + + return colors; } } } diff --git a/src/Core/Runtime/Mono/MonoProvider.cs b/src/Core/Runtime/Mono/MonoProvider.cs index d1b4745..f337e50 100644 --- a/src/Core/Runtime/Mono/MonoProvider.cs +++ b/src/Core/Runtime/Mono/MonoProvider.cs @@ -43,7 +43,7 @@ namespace UnityExplorer.Core.Runtime.Mono public override UnityEngine.Object[] FindObjectsOfTypeAll(Type type) => Resources.FindObjectsOfTypeAll(type); - private static readonly FieldInfo fi_Scene_handle = typeof(Scene).GetField("m_Handle", ReflectionUtility.CommonFlags); + private static readonly FieldInfo fi_Scene_handle = typeof(Scene).GetField("m_Handle", ReflectionUtility.AllFlags); public override int GetSceneHandle(Scene scene) { @@ -60,9 +60,18 @@ namespace UnityExplorer.Core.Runtime.Mono return scene.rootCount; } - public override void CheckInputPointerEvent() + public override ColorBlock SetColorBlock(ColorBlock colors, Color? normal = null, Color? highlighted = null, Color? pressed = null) { - // Not necessary afaik + if (normal != null) + colors.normalColor = (Color)normal; + + if (highlighted != null) + colors.highlightedColor = (Color)highlighted; + + if (pressed != null) + colors.pressedColor = (Color)pressed; + + return colors; } } } diff --git a/src/Core/Runtime/Mono/MonoTextureUtil.cs b/src/Core/Runtime/Mono/MonoTextureUtil.cs index eef1940..0ae2b83 100644 --- a/src/Core/Runtime/Mono/MonoTextureUtil.cs +++ b/src/Core/Runtime/Mono/MonoTextureUtil.cs @@ -52,9 +52,9 @@ namespace UnityExplorer.Core.Runtime.Mono private static MethodInfo GetEncodeToPNGMethod() { if (ReflectionUtility.GetTypeByName("UnityEngine.ImageConversion") is Type imageConversion) - return m_encodeToPNGMethod = imageConversion.GetMethod("EncodeToPNG", ReflectionUtility.CommonFlags); + return m_encodeToPNGMethod = imageConversion.GetMethod("EncodeToPNG", ReflectionUtility.AllFlags); - var method = typeof(Texture2D).GetMethod("EncodeToPNG", ReflectionUtility.CommonFlags); + var method = typeof(Texture2D).GetMethod("EncodeToPNG", ReflectionUtility.AllFlags); if (method != null) return m_encodeToPNGMethod = method; diff --git a/src/Core/Runtime/RuntimeProvider.cs b/src/Core/Runtime/RuntimeProvider.cs index 64f4abe..1e6c38f 100644 --- a/src/Core/Runtime/RuntimeProvider.cs +++ b/src/Core/Runtime/RuntimeProvider.cs @@ -52,6 +52,6 @@ namespace UnityExplorer.Core.Runtime public abstract int GetRootCount(Scene scene); - public abstract void CheckInputPointerEvent(); + public abstract ColorBlock SetColorBlock(ColorBlock colors, Color? normal = null, Color? highlighted = null, Color? pressed = null); } } diff --git a/src/ExplorerCore.cs b/src/ExplorerCore.cs index 248b5ce..5b45b53 100644 --- a/src/ExplorerCore.cs +++ b/src/ExplorerCore.cs @@ -12,7 +12,7 @@ namespace UnityExplorer public class ExplorerCore { public const string NAME = "UnityExplorer"; - public const string VERSION = "3.3.1"; + public const string VERSION = "3.3.2"; public const string AUTHOR = "Sinai"; public const string GUID = "com.sinai.unityexplorer"; diff --git a/src/Loader/ML/MelonLoaderConfigHandler.cs b/src/Loader/ML/MelonLoaderConfigHandler.cs index 73bc632..c238ee4 100644 --- a/src/Loader/ML/MelonLoaderConfigHandler.cs +++ b/src/Loader/ML/MelonLoaderConfigHandler.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; +using UnityExplorer.Core; using UnityExplorer.Core.Config; namespace UnityExplorer.Loader.ML @@ -66,6 +67,11 @@ namespace UnityExplorer.Loader.ML return default; } + public override void OnAnyConfigChanged() + { + MelonPreferences.Save(); + } + public override void SaveConfig() { MelonPreferences.Save(); diff --git a/src/UI/CacheObject/CacheConfigEntry.cs b/src/UI/CacheObject/CacheConfigEntry.cs index e6d7d97..ca27b2e 100644 --- a/src/UI/CacheObject/CacheConfigEntry.cs +++ b/src/UI/CacheObject/CacheConfigEntry.cs @@ -49,13 +49,9 @@ namespace UnityExplorer.UI.CacheObject public override void SetValue() { RefConfig.BoxedValue = IValue.Value; - ConfigManager.Handler.OnAnyConfigChanged(); } internal GameObject m_mainGroup; - //internal GameObject m_leftGroup; - //internal GameObject m_rightGroup; - //internal GameObject m_secondRow; internal override void ConstructUI() { @@ -66,11 +62,6 @@ namespace UnityExplorer.UI.CacheObject var horiGroup = UIFactory.CreateHorizontalGroup(m_mainGroup, "ConfigEntryHolder", false, false, true, true, childAlignment: TextAnchor.MiddleLeft); UIFactory.SetLayoutElement(horiGroup, minHeight: 30, flexibleHeight: 0); - //// left group - - //m_leftGroup = UIFactory.CreateHorizontalGroup(horiGroup, "ConfigTitleGroup", false, false, true, true, 4, default, new Color(1, 1, 1, 0)); - //UIFactory.SetLayoutElement(m_leftGroup, minHeight: 25, flexibleHeight: 0, minWidth: 200, flexibleWidth: 0); - // config entry label var configLabel = UIFactory.CreateLabel(horiGroup, "ConfigLabel", this.RefConfig.Name, TextAnchor.MiddleLeft); @@ -91,20 +82,11 @@ namespace UnityExplorer.UI.CacheObject new Color(0.3f, 0.3f, 0.3f)); UIFactory.SetLayoutElement(defaultButton.gameObject, minWidth: 80, minHeight: 22, flexibleWidth: 0); - //// right group - - //m_rightGroup = UIFactory.CreateVerticalGroup(horiGroup, "ConfigValueGroup", false, false, true, true, 4, default, new Color(1, 1, 1, 0)); - //UIFactory.SetLayoutElement(m_rightGroup, minHeight: 25, minWidth: 150, flexibleHeight: 0, flexibleWidth: 5000); - // Description label var desc = UIFactory.CreateLabel(m_mainGroup, "Description", $"{RefConfig.Description}", TextAnchor.MiddleLeft, Color.grey); UIFactory.SetLayoutElement(desc.gameObject, minWidth: 250, minHeight: 20, flexibleWidth: 9999, flexibleHeight: 0); - //// Second row (IValue) - - //m_secondRow = UIFactory.CreateHorizontalGroup(m_mainGroup, "DescriptionRow", false, false, true, true, 4, new Color(0.08f, 0.08f, 0.08f)); - // IValue if (IValue != null) diff --git a/src/UI/CacheObject/CacheMember.cs b/src/UI/CacheObject/CacheMember.cs index 86144d8..b7e2823 100644 --- a/src/UI/CacheObject/CacheMember.cs +++ b/src/UI/CacheObject/CacheMember.cs @@ -320,9 +320,8 @@ namespace UnityExplorer.UI.CacheObject UIFactory.SetLayoutElement(evalGroupObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 5000); var colors = new ColorBlock(); - colors.normalColor = new Color(0.4f, 0.4f, 0.4f); - colors.highlightedColor = new Color(0.4f, 0.7f, 0.4f); - colors.pressedColor = new Color(0.3f, 0.3f, 0.3f); + colors = RuntimeProvider.Instance.SetColorBlock(colors, new Color(0.4f, 0.4f, 0.4f), + new Color(0.4f, 0.7f, 0.4f), new Color(0.3f, 0.3f, 0.3f)); var evalButton = UIFactory.CreateButton(evalGroupObj, "EvalButton", @@ -346,9 +345,7 @@ namespace UnityExplorer.UI.CacheObject argsHolder.SetActive(true); m_isEvaluating = true; evalText.text = "Evaluate"; - colors = evalButton.colors; - colors.normalColor = new Color(0.3f, 0.6f, 0.3f); - evalButton.colors = colors; + evalButton.colors = RuntimeProvider.Instance.SetColorBlock(evalButton.colors, new Color(0.3f, 0.6f, 0.3f)); cancelButton.gameObject.SetActive(true); } @@ -368,9 +365,7 @@ namespace UnityExplorer.UI.CacheObject m_isEvaluating = false; evalText.text = $"Evaluate ({ParamCount})"; - colors = evalButton.colors; - colors.normalColor = new Color(0.4f, 0.4f, 0.4f); - evalButton.colors = colors; + evalButton.colors = RuntimeProvider.Instance.SetColorBlock(evalButton.colors, new Color(0.4f, 0.4f, 0.4f)); }); } else if (this is CacheMethod) @@ -378,9 +373,8 @@ namespace UnityExplorer.UI.CacheObject // simple method evaluate button var colors = new ColorBlock(); - colors.normalColor = new Color(0.4f, 0.4f, 0.4f); - colors.highlightedColor = new Color(0.4f, 0.7f, 0.4f); - colors.pressedColor = new Color(0.3f, 0.3f, 0.3f); + colors = RuntimeProvider.Instance.SetColorBlock(colors, new Color(0.4f, 0.4f, 0.4f), + new Color(0.4f, 0.7f, 0.4f), new Color(0.3f, 0.3f, 0.3f)); var evalButton = UIFactory.CreateButton(m_rightGroup, "EvalButton", "Evaluate", () => { (this as CacheMethod).Evaluate(); }, colors); UIFactory.SetLayoutElement(evalButton.gameObject, minWidth: 100, minHeight: 22, flexibleWidth: 0); diff --git a/src/UI/InteractiveValues/InteractiveBool.cs b/src/UI/InteractiveValues/InteractiveBool.cs index a3dd301..15970f5 100644 --- a/src/UI/InteractiveValues/InteractiveBool.cs +++ b/src/UI/InteractiveValues/InteractiveBool.cs @@ -88,13 +88,13 @@ namespace UnityExplorer.UI.InteractiveValues if (Owner.CanWrite) { - var toggleObj = UIFactory.CreateToggle(m_valueContent, "InteractiveBoolToggle", out m_toggle, out _, new Color(0.1f, 0.1f, 0.1f)); + var toggleObj = UIFactory.CreateToggle(m_mainContent, "InteractiveBoolToggle", out m_toggle, out _, new Color(0.1f, 0.1f, 0.1f)); UIFactory.SetLayoutElement(toggleObj, minWidth: 24); m_toggle.onValueChanged.AddListener(OnToggleValueChanged); m_baseLabel.transform.SetAsLastSibling(); - m_applyBtn = UIFactory.CreateButton(m_valueContent, + m_applyBtn = UIFactory.CreateButton(m_mainContent, "ApplyButton", "Apply", () => { Owner.SetValue(); }, diff --git a/src/UI/InteractiveValues/InteractiveColor.cs b/src/UI/InteractiveValues/InteractiveColor.cs new file mode 100644 index 0000000..501d129 --- /dev/null +++ b/src/UI/InteractiveValues/InteractiveColor.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; +using UnityEngine.UI; + +namespace UnityExplorer.UI.InteractiveValues +{ + public class InteractiveColor : InteractiveValue + { + //~~~~~~~~~ Instance ~~~~~~~~~~ + + public InteractiveColor(object value, Type valueType) : base(value, valueType) { } + + public override bool HasSubContent => true; + public override bool SubContentWanted => true; + public override bool WantInspectBtn => true; + + public override void RefreshUIForValue() + { + base.RefreshUIForValue(); + + if (m_subContentConstructed) + RefreshUI(); + } + + private void RefreshUI() + { + var color = (Color)this.Value; + + m_inputs[0].text = color.r.ToString(); + m_inputs[1].text = color.g.ToString(); + m_inputs[2].text = color.b.ToString(); + m_inputs[3].text = color.a.ToString(); + + if (m_colorImage) + m_colorImage.color = color; + } + + internal override void OnToggleSubcontent(bool toggle) + { + base.OnToggleSubcontent(toggle); + + RefreshUI(); + } + + #region UI CONSTRUCTION + + private Image m_colorImage; + + private readonly InputField[] m_inputs = new InputField[4]; + private readonly Slider[] m_sliders = new Slider[4]; + + public override void ConstructUI(GameObject parent, GameObject subGroup) + { + base.ConstructUI(parent, subGroup); + + //// Limit the label width for colors, they're always about the same so make use of that space. + //UIFactory.SetLayoutElement(this.m_baseLabel.gameObject, flexibleWidth: 0, minWidth: 250); + } + + public override void ConstructSubcontent() + { + base.ConstructSubcontent(); + + var horiGroup = UIFactory.CreateHorizontalGroup(m_subContentParent, "ColorEditor", false, false, true, true, 5, + default, default, TextAnchor.MiddleLeft); + + var editorContainer = UIFactory.CreateVerticalGroup(horiGroup, "EditorContent", false, true, true, true, 2, new Vector4(4, 4, 4, 4), + new Color(0.08f, 0.08f, 0.08f)); + UIFactory.SetLayoutElement(editorContainer, minWidth: 300, flexibleWidth: 0); + + for (int i = 0; i < 4; i++) + AddEditorRow(i, editorContainer); + + if (Owner.CanWrite) + { + var applyBtn = UIFactory.CreateButton(editorContainer, "ApplyButton", "Apply", OnSetValue, new Color(0.2f, 0.2f, 0.2f)); + UIFactory.SetLayoutElement(applyBtn.gameObject, minWidth: 175, minHeight: 25, flexibleWidth: 0); + + void OnSetValue() + { + Owner.SetValue(); + RefreshUIForValue(); + } + } + + var imgHolder = UIFactory.CreateVerticalGroup(horiGroup, "ImgHolder", true, true, true, true, 0, new Vector4(1, 1, 1, 1), + new Color(0.08f, 0.08f, 0.08f)); + UIFactory.SetLayoutElement(imgHolder, minWidth: 128, minHeight: 128, flexibleWidth: 0, flexibleHeight: 0); + + var imgObj = UIFactory.CreateUIObject("ColorImageHelper", imgHolder, new Vector2(100, 25)); + m_colorImage = imgObj.AddComponent(); + m_colorImage.color = (Color)this.Value; + } + + private static readonly string[] s_fieldNames = new[] { "R", "G", "B", "A" }; + + internal void AddEditorRow(int index, GameObject groupObj) + { + var row = UIFactory.CreateHorizontalGroup(groupObj, "EditorRow_" + s_fieldNames[index], + false, true, true, true, 5, default, new Color(1, 1, 1, 0)); + + var label = UIFactory.CreateLabel(row, "RowLabel", $"{s_fieldNames[index]}:", TextAnchor.MiddleRight, Color.cyan); + UIFactory.SetLayoutElement(label.gameObject, minWidth: 50, flexibleWidth: 0, minHeight: 25); + + var inputFieldObj = UIFactory.CreateInputField(row, "InputField", "...", 14, 3, 1); + UIFactory.SetLayoutElement(inputFieldObj, minWidth: 120, minHeight: 25, flexibleWidth: 0); + + var inputField = inputFieldObj.GetComponent(); + m_inputs[index] = inputField; + inputField.characterValidation = InputField.CharacterValidation.Decimal; + + inputField.onValueChanged.AddListener((string value) => + { + float val = float.Parse(value); + SetValueToColor(val); + m_sliders[index].value = val; + }); + + var sliderObj = UIFactory.CreateSlider(row, "Slider", out Slider slider); + m_sliders[index] = slider; + UIFactory.SetLayoutElement(sliderObj, minWidth: 200, minHeight: 25, flexibleWidth: 0, flexibleHeight: 0); + slider.minValue = 0; + slider.maxValue = 1; + slider.value = GetValueFromColor(); + + slider.onValueChanged.AddListener((float value) => + { + inputField.text = value.ToString(); + SetValueToColor(value); + m_inputs[index].text = value.ToString(); + }); + + // methods for writing to the color for this field + + void SetValueToColor(float floatValue) + { + Color _color = (Color)Value; + switch (index) + { + case 0: _color.r = floatValue; break; + case 1: _color.g = floatValue; break; + case 2: _color.b = floatValue; break; + case 3: _color.a = floatValue; break; + } + Value = _color; + m_colorImage.color = _color; + } + + float GetValueFromColor() + { + Color _color = (Color)Value; + switch (index) + { + case 0: return _color.r; + case 1: return _color.g; + case 2: return _color.b; + case 3: return _color.a; + default: throw new NotImplementedException(); + } + } + } + + #endregion + } +} diff --git a/src/UI/InteractiveValues/InteractiveNumber.cs b/src/UI/InteractiveValues/InteractiveNumber.cs index b68ff78..32b3d3e 100644 --- a/src/UI/InteractiveValues/InteractiveNumber.cs +++ b/src/UI/InteractiveValues/InteractiveNumber.cs @@ -102,7 +102,7 @@ namespace UnityExplorer.UI.InteractiveValues labelLayout.minWidth = 50; labelLayout.flexibleWidth = 0; - var inputObj = UIFactory.CreateInputField(m_valueContent, "InteractiveNumberInput", "..."); + var inputObj = UIFactory.CreateInputField(m_mainContent, "InteractiveNumberInput", "..."); UIFactory.SetLayoutElement(inputObj, minWidth: 120, minHeight: 25, flexibleWidth: 0); m_valueInput = inputObj.GetComponent(); @@ -110,7 +110,7 @@ namespace UnityExplorer.UI.InteractiveValues if (Owner.CanWrite) { - m_applyBtn = UIFactory.CreateButton(m_valueContent, "ApplyButton", "Apply", OnApplyClicked, new Color(0.2f, 0.2f, 0.2f)); + m_applyBtn = UIFactory.CreateButton(m_mainContent, "ApplyButton", "Apply", OnApplyClicked, new Color(0.2f, 0.2f, 0.2f)); UIFactory.SetLayoutElement(m_applyBtn.gameObject, minWidth: 50, minHeight: 25, flexibleWidth: 0); } } diff --git a/src/UI/InteractiveValues/InteractiveString.cs b/src/UI/InteractiveValues/InteractiveString.cs index 45dbe35..1da2467 100644 --- a/src/UI/InteractiveValues/InteractiveString.cs +++ b/src/UI/InteractiveValues/InteractiveString.cs @@ -115,7 +115,7 @@ namespace UnityExplorer.UI.InteractiveValues m_labelLayout = m_baseLabel.gameObject.GetComponent(); - m_readonlyInput = UIFactory.CreateLabel(m_valueContent, "ReadonlyLabel", "", TextAnchor.MiddleLeft); + m_readonlyInput = UIFactory.CreateLabel(m_mainContent, "ReadonlyLabel", "", TextAnchor.MiddleLeft); m_readonlyInput.horizontalOverflow = HorizontalWrapMode.Overflow; var testFitter = m_readonlyInput.gameObject.AddComponent(); diff --git a/src/UI/InteractiveValues/InteractiveUnityStruct.cs b/src/UI/InteractiveValues/InteractiveUnityStruct.cs index 5e3c085..8eed042 100644 --- a/src/UI/InteractiveValues/InteractiveUnityStruct.cs +++ b/src/UI/InteractiveValues/InteractiveUnityStruct.cs @@ -183,7 +183,7 @@ namespace UnityExplorer.UI.InteractiveValues typeof(Vector3), typeof(Vector4), typeof(Rect), - typeof(Color) // todo might make a special editor for colors + //typeof(Color) // todo might make a special editor for colors }; //~~~~~~~~~ Instance ~~~~~~~~~~ diff --git a/src/UI/InteractiveValues/InteractiveValue.cs b/src/UI/InteractiveValues/InteractiveValue.cs index 1b5357a..3bfa43c 100644 --- a/src/UI/InteractiveValues/InteractiveValue.cs +++ b/src/UI/InteractiveValues/InteractiveValue.cs @@ -46,6 +46,8 @@ namespace UnityExplorer.UI.InteractiveValues return typeof(InteractiveEnum); } // check for unity struct types + else if (typeof(Color).IsAssignableFrom(type)) + return typeof(InteractiveColor); else if (InteractiveUnityStruct.SupportsType(type)) return typeof(InteractiveUnityStruct); // check Transform, force InteractiveValue so they dont become InteractiveEnumerables. @@ -95,11 +97,11 @@ namespace UnityExplorer.UI.InteractiveValues public virtual void OnDestroy() { - if (this.m_valueContent) + if (this.m_mainContent) { - m_valueContent.transform.SetParent(null, false); - m_valueContent.SetActive(false); - GameObject.Destroy(this.m_valueContent.gameObject); + m_mainContent.transform.SetParent(null, false); + m_mainContent.SetActive(false); + GameObject.Destroy(this.m_mainContent.gameObject); } DestroySubContent(); @@ -293,7 +295,7 @@ namespace UnityExplorer.UI.InteractiveValues internal GameObject m_mainContentParent; internal GameObject m_subContentParent; - internal GameObject m_valueContent; + internal GameObject m_mainContent; internal GameObject m_inspectButton; internal Text m_baseLabel; @@ -304,24 +306,24 @@ namespace UnityExplorer.UI.InteractiveValues { m_UIConstructed = true; - m_valueContent = UIFactory.CreateHorizontalGroup(parent, $"InteractiveValue_{this.GetType().Name}", false, false, true, true, 4, default, + m_mainContent = UIFactory.CreateHorizontalGroup(parent, $"InteractiveValue_{this.GetType().Name}", false, false, true, true, 4, default, new Color(1, 1, 1, 0), TextAnchor.UpperLeft); - var mainRect = m_valueContent.GetComponent(); + var mainRect = m_mainContent.GetComponent(); mainRect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 25); - UIFactory.SetLayoutElement(m_valueContent, flexibleWidth: 9000, minWidth: 175, minHeight: 25, flexibleHeight: 0); + UIFactory.SetLayoutElement(m_mainContent, flexibleWidth: 9000, minWidth: 175, minHeight: 25, flexibleHeight: 0); // subcontent expand button if (HasSubContent) { - m_subExpandBtn = UIFactory.CreateButton(m_valueContent, "ExpandSubcontentButton", "▲", ToggleSubcontent, new Color(0.3f, 0.3f, 0.3f)); + m_subExpandBtn = UIFactory.CreateButton(m_mainContent, "ExpandSubcontentButton", "▲", ToggleSubcontent, new Color(0.3f, 0.3f, 0.3f)); UIFactory.SetLayoutElement(m_subExpandBtn.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0, flexibleHeight: 0); } // inspect button - var inspectBtn = UIFactory.CreateButton(m_valueContent, + var inspectBtn = UIFactory.CreateButton(m_mainContent, "InspectButton", "Inspect", () => @@ -338,7 +340,7 @@ namespace UnityExplorer.UI.InteractiveValues // value label - m_baseLabel = UIFactory.CreateLabel(m_valueContent, "ValueLabel", "", TextAnchor.MiddleLeft); + m_baseLabel = UIFactory.CreateLabel(m_mainContent, "ValueLabel", "", TextAnchor.MiddleLeft); UIFactory.SetLayoutElement(m_baseLabel.gameObject, flexibleWidth: 9000, minHeight: 25); m_subContentParent = subGroup; diff --git a/src/UI/Main/CSConsole/AutoCompleter.cs b/src/UI/Main/CSConsole/AutoCompleter.cs index 7f7cfcd..168ca57 100644 --- a/src/UI/Main/CSConsole/AutoCompleter.cs +++ b/src/UI/Main/CSConsole/AutoCompleter.cs @@ -5,6 +5,8 @@ using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using UnityExplorer.Core.CSharp; +using UnityExplorer.Core.Input; +using UnityExplorer.Core.Runtime; using UnityExplorer.Core.Unity; using UnityExplorer.UI; using UnityExplorer.UI.Main; @@ -41,16 +43,12 @@ namespace UnityExplorer.UI.Main.CSConsole public static void Update() { if (!m_mainObj) - { return; - } if (!CSharpConsole.EnableAutocompletes) { if (m_mainObj.activeSelf) - { m_mainObj.SetActive(false); - } return; } @@ -274,8 +272,7 @@ namespace UnityExplorer.UI.Main.CSConsole mainGroup.childForceExpandWidth = true; ColorBlock btnColors = new ColorBlock(); - btnColors.normalColor = new Color(0f, 0f, 0f, 0f); - btnColors.highlightedColor = new Color(0.2f, 0.2f, 0.2f, 1.0f); + RuntimeProvider.Instance.SetColorBlock(btnColors, new Color(0, 0, 0, 0), highlighted: new Color(0.2f, 0.2f, 0.2f, 1.0f)); for (int i = 0; i < MAX_LABELS; i++) { diff --git a/src/UI/Main/Home/InspectorManager.cs b/src/UI/Main/Home/InspectorManager.cs index 365ffea..15801d1 100644 --- a/src/UI/Main/Home/InspectorManager.cs +++ b/src/UI/Main/Home/InspectorManager.cs @@ -141,18 +141,13 @@ namespace UnityExplorer.UI.Main.Home public void OnSetInspectorTab(InspectorBase inspector) { Color activeColor = new Color(0, 0.25f, 0, 1); - ColorBlock colors = inspector.m_tabButton.colors; - colors.normalColor = activeColor; - colors.highlightedColor = activeColor; - inspector.m_tabButton.colors = colors; + inspector.m_tabButton.colors = RuntimeProvider.Instance.SetColorBlock(inspector.m_tabButton.colors, activeColor, activeColor); } public void OnUnsetInspectorTab() { - ColorBlock colors = m_activeInspector.m_tabButton.colors; - colors.normalColor = new Color(0.2f, 0.2f, 0.2f, 1); - colors.highlightedColor = new Color(0.1f, 0.3f, 0.1f, 1); - m_activeInspector.m_tabButton.colors = colors; + m_activeInspector.m_tabButton.colors = RuntimeProvider.Instance.SetColorBlock(m_activeInspector.m_tabButton.colors, + new Color(0.2f, 0.2f, 0.2f, 1), new Color(0.1f, 0.3f, 0.1f, 1)); } public void ConstructInspectorPane() diff --git a/src/UI/Main/Home/Inspectors/GameObjects/ChildList.cs b/src/UI/Main/Home/Inspectors/GameObjects/ChildList.cs index fa1b64c..32763a0 100644 --- a/src/UI/Main/Home/Inspectors/GameObjects/ChildList.cs +++ b/src/UI/Main/Home/Inspectors/GameObjects/ChildList.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using UnityEngine; using UnityEngine.UI; +using UnityExplorer.Core.Runtime; using UnityExplorer.UI.Utility; namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects @@ -168,9 +169,8 @@ namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects toggle.onValueChanged.AddListener((bool val) => { OnToggleClicked(thisIndex, val); }); ColorBlock mainColors = new ColorBlock(); - mainColors.normalColor = new Color(0.07f, 0.07f, 0.07f); - mainColors.highlightedColor = new Color(0.2f, 0.2f, 0.2f, 1); - mainColors.pressedColor = new Color(0.05f, 0.05f, 0.05f); + RuntimeProvider.Instance.SetColorBlock(mainColors, new Color(0.07f, 0.07f, 0.07f), + new Color(0.2f, 0.2f, 0.2f, 1), new Color(0.05f, 0.05f, 0.05f)); var mainBtn = UIFactory.CreateButton(btnGroupObj, "MainButton", diff --git a/src/UI/Main/Home/Inspectors/GameObjects/ComponentList.cs b/src/UI/Main/Home/Inspectors/GameObjects/ComponentList.cs index 2e46642..252cadb 100644 --- a/src/UI/Main/Home/Inspectors/GameObjects/ComponentList.cs +++ b/src/UI/Main/Home/Inspectors/GameObjects/ComponentList.cs @@ -5,6 +5,7 @@ using System.Text; using UnityEngine; using UnityEngine.UI; using UnityExplorer.Core; +using UnityExplorer.Core.Runtime; using UnityExplorer.UI.Utility; namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects @@ -175,9 +176,8 @@ namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects // Main component button ColorBlock mainColors = new ColorBlock(); - mainColors.normalColor = new Color(0.07f, 0.07f, 0.07f); - mainColors.highlightedColor = new Color(0.2f, 0.2f, 0.2f, 1); - mainColors.pressedColor = new Color(0.05f, 0.05f, 0.05f); + RuntimeProvider.Instance.SetColorBlock(mainColors, new Color(0.07f, 0.07f, 0.07f), + new Color(0.2f, 0.2f, 0.2f, 1), new Color(0.05f, 0.05f, 0.05f)); var mainBtn = UIFactory.CreateButton(groupObj, "MainButton", diff --git a/src/UI/Main/Home/Inspectors/GameObjects/GameObjectControls.cs b/src/UI/Main/Home/Inspectors/GameObjects/GameObjectControls.cs index 2a1c6ff..f8140fb 100644 --- a/src/UI/Main/Home/Inspectors/GameObjects/GameObjectControls.cs +++ b/src/UI/Main/Home/Inspectors/GameObjects/GameObjectControls.cs @@ -5,6 +5,7 @@ using System.Text; using UnityEngine; using UnityEngine.UI; using UnityExplorer.Core.Input; +using UnityExplorer.Core.Runtime; using UnityExplorer.Core.Unity; namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects @@ -407,9 +408,7 @@ namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects var sliderObj = UIFactory.CreateSlider(rowObject, "VectorSlider", out Slider slider); UIFactory.SetLayoutElement(sliderObj, minHeight: 20, flexibleHeight: 0, minWidth: 200, flexibleWidth: 9000); sliderObj.transform.Find("Fill Area").gameObject.SetActive(false); - var sliderColors = slider.colors; - sliderColors.normalColor = new Color(0.65f, 0.65f, 0.65f); - slider.colors = sliderColors; + slider.colors = RuntimeProvider.Instance.SetColorBlock(slider.colors, new Color(0.65f, 0.65f, 0.65f)); slider.minValue = -2; slider.maxValue = 2; slider.value = 0; diff --git a/src/UI/Main/Home/Inspectors/Reflection/InstanceInspector.cs b/src/UI/Main/Home/Inspectors/Reflection/InstanceInspector.cs index d6046b8..a0e95d6 100644 --- a/src/UI/Main/Home/Inspectors/Reflection/InstanceInspector.cs +++ b/src/UI/Main/Home/Inspectors/Reflection/InstanceInspector.cs @@ -30,18 +30,12 @@ namespace UnityExplorer.UI.Main.Home.Inspectors.Reflection internal void OnScopeFilterClicked(MemberScopes type, Button button) { if (m_lastActiveScopeButton) - { - var lastColors = m_lastActiveScopeButton.colors; - lastColors.normalColor = new Color(0.2f, 0.2f, 0.2f); - m_lastActiveScopeButton.colors = lastColors; - } + m_lastActiveScopeButton.colors = RuntimeProvider.Instance.SetColorBlock(m_lastActiveScopeButton.colors, new Color(0.2f, 0.2f, 0.2f)); m_scopeFilter = type; m_lastActiveScopeButton = button; - var colors = m_lastActiveScopeButton.colors; - colors.normalColor = new Color(0.2f, 0.6f, 0.2f); - m_lastActiveScopeButton.colors = colors; + m_lastActiveScopeButton.colors = RuntimeProvider.Instance.SetColorBlock(m_lastActiveScopeButton.colors, new Color(0.2f, 0.6f, 0.2f)); FilterMembers(null, true); m_sliderScroller.m_slider.value = 1f; @@ -246,17 +240,14 @@ namespace UnityExplorer.UI.Main.Home.Inspectors.Reflection btn.onClick.AddListener(() => { OnScopeFilterClicked(type, btn); }); - var colors = btn.colors; - colors.highlightedColor = new Color(0.3f, 0.7f, 0.3f); + btn.colors = RuntimeProvider.Instance.SetColorBlock(btn.colors, highlighted: new Color(0.3f, 0.7f, 0.3f)); if (setEnabled) { - colors.normalColor = new Color(0.2f, 0.6f, 0.2f); + btn.colors = RuntimeProvider.Instance.SetColorBlock(btn.colors, new Color(0.2f, 0.6f, 0.2f)); m_scopeFilter = type; m_lastActiveScopeButton = btn; } - - btn.colors = colors; } } } diff --git a/src/UI/Main/Home/Inspectors/Reflection/ReflectionInspector.cs b/src/UI/Main/Home/Inspectors/Reflection/ReflectionInspector.cs index 4cdf64b..d2326a7 100644 --- a/src/UI/Main/Home/Inspectors/Reflection/ReflectionInspector.cs +++ b/src/UI/Main/Home/Inspectors/Reflection/ReflectionInspector.cs @@ -7,6 +7,7 @@ using UnityEngine; using UnityEngine.UI; using UnityExplorer.Core; using UnityExplorer.Core.Config; +using UnityExplorer.Core.Runtime; using UnityExplorer.UI.CacheObject; using UnityExplorer.UI.Utility; @@ -238,18 +239,12 @@ namespace UnityExplorer.UI.Main.Home.Inspectors.Reflection internal void OnMemberFilterClicked(MemberTypes type, Button button) { if (m_lastActiveMemButton) - { - var lastColors = m_lastActiveMemButton.colors; - lastColors.normalColor = new Color(0.2f, 0.2f, 0.2f); - m_lastActiveMemButton.colors = lastColors; - } + m_lastActiveMemButton.colors = RuntimeProvider.Instance.SetColorBlock(m_lastActiveMemButton.colors, new Color(0.2f, 0.2f, 0.2f)); m_memberFilter = type; m_lastActiveMemButton = button; - var colors = m_lastActiveMemButton.colors; - colors.normalColor = new Color(0.2f, 0.6f, 0.2f); - m_lastActiveMemButton.colors = colors; + m_lastActiveMemButton.colors = RuntimeProvider.Instance.SetColorBlock(m_lastActiveMemButton.colors, new Color(0.2f, 0.6f, 0.2f)); FilterMembers(null, true); m_sliderScroller.m_slider.value = 1f; @@ -464,17 +459,14 @@ namespace UnityExplorer.UI.Main.Home.Inspectors.Reflection UIFactory.SetLayoutElement(btn.gameObject, minHeight: 25, minWidth: 70); btn.onClick.AddListener(() => { OnMemberFilterClicked(type, btn); }); - var colors = btn.colors; - colors.highlightedColor = new Color(0.3f, 0.7f, 0.3f); + btn.colors = RuntimeProvider.Instance.SetColorBlock(btn.colors, highlighted: new Color(0.3f, 0.7f, 0.3f)); if (setEnabled) { - colors.normalColor = new Color(0.2f, 0.6f, 0.2f); + btn.colors = RuntimeProvider.Instance.SetColorBlock(btn.colors, new Color(0.2f, 0.6f, 0.2f)); m_memberFilter = type; m_lastActiveMemButton = btn; } - - btn.colors = colors; } internal void ConstructUpdateRow() diff --git a/src/UI/Main/Home/SceneExplorer.cs b/src/UI/Main/Home/SceneExplorer.cs index e70e97b..d29119c 100644 --- a/src/UI/Main/Home/SceneExplorer.cs +++ b/src/UI/Main/Home/SceneExplorer.cs @@ -11,6 +11,8 @@ using UnityExplorer.UI.Main.Home; using UnityExplorer.Core.Config; using UnityExplorer.UI.Utility; using UnityExplorer.UI.Main.Search; +using System.IO; +using UnityExplorer.Core; namespace UnityExplorer.UI.Main.Home { @@ -56,11 +58,9 @@ namespace UnityExplorer.UI.Main.Home internal readonly List m_shortList = new List(); private Text m_hideText; - private GameObject m_titleObj; private GameObject m_sceneDropdownObj; private GameObject m_scenePathGroupObj; - private GameObject m_scrollObj; - private LayoutElement m_leftLayout; + private GameObject m_mainContent; internal static GameObject DontDestroyObject { @@ -84,6 +84,30 @@ namespace UnityExplorer.UI.Main.Home ToggleShow(); } + public void ToggleShow() + { + if (!Hiding) + { + Hiding = true; + + m_hideText.text = "►"; + m_mainContent.SetActive(false); + m_pageHandler.Hide(); + } + else + { + Hiding = false; + + m_hideText.text = "◄"; + m_mainContent.SetActive(true); + m_pageHandler.Show(); + + Update(); + } + + InvokeOnToggleShow(); + } + public void Update() { if (Hiding || Time.realtimeSinceStartup - m_timeOfLastSceneUpdate < UPDATE_INTERVAL) @@ -223,39 +247,6 @@ namespace UnityExplorer.UI.Main.Home OnToggleShow?.Invoke(!Instance.Hiding); } - public void ToggleShow() - { - if (!Hiding) - { - Hiding = true; - - m_hideText.text = "►"; - m_titleObj.SetActive(false); - m_sceneDropdownObj.SetActive(false); - m_scenePathGroupObj.SetActive(false); - m_scrollObj.SetActive(false); - m_pageHandler.Hide(); - - m_leftLayout.minWidth = 15; - } - else - { - Hiding = false; - - m_hideText.text = "Hide Scene Explorer"; - m_titleObj.SetActive(true); - m_sceneDropdownObj.SetActive(true); - m_scenePathGroupObj.SetActive(true); - m_scrollObj.SetActive(true); - - m_leftLayout.minWidth = 350; - - Update(); - } - - InvokeOnToggleShow(); - } - public void OnActiveScenesChanged(List newNames) { m_sceneDropdown.options.Clear(); @@ -387,25 +378,32 @@ namespace UnityExplorer.UI.Main.Home public void ConstructScenePane() { - GameObject leftPane = UIFactory.CreateVerticalGroup(HomePage.Instance.Content, "SceneGroup", true, false, true, true, 0, default, + var coreGroup = UIFactory.CreateHorizontalGroup(HomePage.Instance.Content, "SceneExplorer", true, true, true, true, 4, new Vector4(2, 2, 2, 2), + new Color(0.05f, 0.05f, 0.05f)); + + // hide button + + var hideButton = UIFactory.CreateButton(coreGroup, "HideButton", "◄", ToggleShow, new Color(0.15f, 0.15f, 0.15f)); + hideButton.GetComponentInChildren().fontSize = 13; + m_hideText = hideButton.GetComponentInChildren(); + UIFactory.SetLayoutElement(hideButton.gameObject, minWidth: 20, minHeight: 20, flexibleWidth: 0, flexibleHeight: 9999); + + m_mainContent = UIFactory.CreateVerticalGroup(coreGroup, "SceneGroup", true, false, true, true, 0, default, new Color(72f / 255f, 72f / 255f, 72f / 255f)); + UIFactory.SetLayoutElement(m_mainContent, minWidth: 350, flexibleWidth: 0); - m_leftLayout = leftPane.AddComponent(); - m_leftLayout.minWidth = 350; - m_leftLayout.flexibleWidth = 0; + UIFactory.SetLayoutGroup(m_mainContent, true, true, true, true, spacing: 4, padTop: 8, 4, 4, 4); - UIFactory.SetLayoutGroup(leftPane, true, true, true, true, spacing: 4, padTop: 8, 4, 4, 4); + var titleObj = UIFactory.CreateLabel(m_mainContent, "SceneExplorerTitle", "Scene Explorer", TextAnchor.UpperLeft, default, true, 20).gameObject; + UIFactory.SetLayoutElement(titleObj, minHeight: 30, flexibleHeight: 0); - m_titleObj = UIFactory.CreateLabel(leftPane, "SceneExplorerTitle", "Scene Explorer", TextAnchor.UpperLeft, default, true, 20).gameObject; - UIFactory.SetLayoutElement(m_titleObj, minHeight: 30, flexibleHeight: 0); - - m_sceneDropdownObj = UIFactory.CreateDropdown(leftPane, out m_sceneDropdown, "", 14, null); + m_sceneDropdownObj = UIFactory.CreateDropdown(m_mainContent, out m_sceneDropdown, "", 14, null); UIFactory.SetLayoutElement(m_sceneDropdownObj, minHeight: 40, minWidth: 320, flexibleWidth: 0, flexibleHeight: 0); m_sceneDropdownText = m_sceneDropdown.transform.Find("Label").GetComponent(); m_sceneDropdown.onValueChanged.AddListener((int val) => { SetTargetScene(val); }); - m_scenePathGroupObj = UIFactory.CreateHorizontalGroup(leftPane, "ScenePathGroup", true, true, true, true, 5, default, new Color(1, 1, 1, 0f)); + m_scenePathGroupObj = UIFactory.CreateHorizontalGroup(m_mainContent, "ScenePathGroup", true, true, true, true, 5, default, new Color(1, 1, 1, 0f)); UIFactory.SetLayoutElement(m_scenePathGroupObj, minHeight: 20, minWidth: 335); var backBtnObj = UIFactory.CreateButton(m_scenePathGroupObj, @@ -439,20 +437,68 @@ namespace UnityExplorer.UI.Main.Home m_mainInspectBtn = mainInspectButton.gameObject; UIFactory.SetLayoutElement(m_mainInspectBtn, minWidth: 65); - m_scrollObj = UIFactory.CreateScrollView(leftPane, "SceneExplorerScrollView", + var scrollObj = UIFactory.CreateScrollView(m_mainContent, "SceneExplorerScrollView", out m_pageContent, out SliderScrollbar scroller, new Color(0.1f, 0.1f, 0.1f)); m_pageHandler = new PageHandler(scroller); - m_pageHandler.ConstructUI(leftPane); + m_pageHandler.ConstructUI(m_mainContent); m_pageHandler.OnPageChanged += OnSceneListPageTurn; - // hide button + // Scene Loader + try + { + Type sceneUtil = ReflectionUtility.GetTypeByName("UnityEngine.SceneManagement.SceneUtility"); + if (sceneUtil == null) + throw new Exception("This version of Unity does not ship with the 'SceneUtility' class, or it was not unstripped."); + var method = sceneUtil.GetMethod("GetScenePathByBuildIndex", ReflectionUtility.AllFlags); - var hideButton = UIFactory.CreateButton(leftPane, "HideButton", "Hide Scene Explorer", ToggleShow, new Color(0.15f, 0.15f, 0.15f)); - hideButton.GetComponentInChildren().fontSize = 13; - m_hideText = hideButton.GetComponentInChildren(); + var title2 = UIFactory.CreateLabel(m_mainContent, "SceneLoaderLabel", "Scene Loader", TextAnchor.MiddleLeft, Color.white, true, 20); + UIFactory.SetLayoutElement(title2.gameObject, minHeight: 30, flexibleHeight: 0); - UIFactory.SetLayoutElement(hideButton.gameObject, minWidth: 20, minHeight: 20); + var allSceneDropObj = UIFactory.CreateDropdown(m_mainContent, out Dropdown allSceneDrop, "", 14, null); + UIFactory.SetLayoutElement(allSceneDropObj, minHeight: 40, minWidth: 320, flexibleWidth: 0, flexibleHeight: 0); + + int sceneCount = SceneManager.sceneCountInBuildSettings; + for (int i = 0; i < sceneCount; i++) + { + var scenePath = (string)method.Invoke(null, new object[] { i }); + allSceneDrop.options.Add(new Dropdown.OptionData(Path.GetFileNameWithoutExtension(scenePath))); + } + allSceneDrop.value = 1; + allSceneDrop.value = 0; + + var buttonRow = UIFactory.CreateHorizontalGroup(m_mainContent, "LoadButtons", true, true, true, true, 4); + + var loadButton = UIFactory.CreateButton(buttonRow, "LoadSceneButton", "Load (Single)", () => + { + try + { + SceneManager.LoadScene(allSceneDrop.options[allSceneDrop.value].text); + } + catch (Exception ex) + { + ExplorerCore.LogWarning($"Unable to load the Scene! {ex.ReflectionExToString()}"); + } + }, new Color(0.1f, 0.3f, 0.3f)); + UIFactory.SetLayoutElement(loadButton.gameObject, minHeight: 40, minWidth: 150); + + var loadAdditiveButton = UIFactory.CreateButton(buttonRow, "LoadSceneButton", "Load (Additive)", () => + { + try + { + SceneManager.LoadScene(allSceneDrop.options[allSceneDrop.value].text, LoadSceneMode.Additive); + } + catch (Exception ex) + { + ExplorerCore.LogWarning($"Unable to load the Scene! {ex.ReflectionExToString()}"); + } + }, new Color(0.1f, 0.3f, 0.3f)); + UIFactory.SetLayoutElement(loadAdditiveButton.gameObject, minHeight: 40, minWidth: 150); + } + catch (Exception ex) + { + ExplorerCore.LogWarning($"Could not create the Scene Loader helper! {ex.ReflectionExToString()}"); + } } private void AddObjectListButton() @@ -476,9 +522,8 @@ namespace UnityExplorer.UI.Main.Home toggle.onValueChanged.AddListener((bool val) => { OnToggleClicked(thisIndex, val); }); ColorBlock mainColors = new ColorBlock(); - mainColors.normalColor = new Color(0.1f, 0.1f, 0.1f); - mainColors.highlightedColor = new Color(0.2f, 0.2f, 0.2f); - mainColors.pressedColor = new Color(0.05f, 0.05f, 0.05f); + mainColors = RuntimeProvider.Instance.SetColorBlock(mainColors, new Color(0.1f, 0.1f, 0.1f), + new Color(0.2f, 0.2f, 0.2f), new Color(0.05f, 0.05f, 0.05f)); var mainButton = UIFactory.CreateButton(btnGroupObj, "MainButton", @@ -494,9 +539,8 @@ namespace UnityExplorer.UI.Main.Home m_shortListTexts.Add(mainText); ColorBlock inspectColors = new ColorBlock(); - inspectColors.normalColor = new Color(0.15f, 0.15f, 0.15f); - inspectColors.highlightedColor = new Color(0.2f, 0.2f, 0.2f); - inspectColors.pressedColor = new Color(0.1f, 0.1f, 0.1f); + inspectColors = RuntimeProvider.Instance.SetColorBlock(inspectColors, new Color(0.15f, 0.15f, 0.15f), + new Color(0.2f, 0.2f, 0.2f), new Color(0.1f, 0.1f, 0.1f)); var inspectButton = UIFactory.CreateButton(btnGroupObj, "InspectButton", diff --git a/src/UI/Main/MainMenu.cs b/src/UI/Main/MainMenu.cs index 37c8e2b..3f9c6b3 100644 --- a/src/UI/Main/MainMenu.cs +++ b/src/UI/Main/MainMenu.cs @@ -10,6 +10,7 @@ using UnityExplorer.UI.Main.Home; using UnityExplorer.UI.Main.Search; using UnityExplorer.UI.Main.CSConsole; using UnityExplorer.UI.Main.Options; +using UnityExplorer.Core.Runtime; namespace UnityExplorer.UI.Main { @@ -135,16 +136,12 @@ namespace UnityExplorer.UI.Main internal void SetButtonActiveColors(Button button) { - ColorBlock colors = button.colors; - colors.normalColor = m_navButtonSelected; - button.colors = colors; + button.colors = RuntimeProvider.Instance.SetColorBlock(button.colors, m_navButtonSelected); } internal void SetButtonInactiveColors(Button button) { - ColorBlock colors = button.colors; - colors.normalColor = m_navButtonNormal; - button.colors = colors; + button.colors = RuntimeProvider.Instance.SetColorBlock(button.colors, m_navButtonNormal); } #region UI Construction @@ -183,9 +180,8 @@ namespace UnityExplorer.UI.Main // Hide button ColorBlock colorBlock = new ColorBlock(); - colorBlock.normalColor = new Color(65f / 255f, 23f / 255f, 23f / 255f); - colorBlock.pressedColor = new Color(35f / 255f, 10f / 255f, 10f / 255f); - colorBlock.highlightedColor = new Color(156f / 255f, 0f, 0f); + RuntimeProvider.Instance.SetColorBlock(colorBlock, new Color(65f / 255f, 23f / 255f, 23f / 255f), + new Color(35f / 255f, 10f / 255f, 10f / 255f), new Color(156f / 255f, 0f, 0f)); var hideButton = UIFactory.CreateButton(titleBar, "HideButton", @@ -213,9 +209,7 @@ namespace UnityExplorer.UI.Main UIFactory.SetLayoutElement(navbarObj, minHeight: 25, flexibleHeight: 0); ColorBlock colorBlock = new ColorBlock(); - colorBlock.normalColor = m_navButtonNormal; - colorBlock.highlightedColor = m_navButtonHighlight; - colorBlock.pressedColor = m_navButtonSelected; + colorBlock = RuntimeProvider.Instance.SetColorBlock(colorBlock, m_navButtonNormal, m_navButtonHighlight, m_navButtonSelected); foreach (var page in Pages) { diff --git a/src/UI/Main/Search/SearchPage.cs b/src/UI/Main/Search/SearchPage.cs index f524c25..69abf29 100644 --- a/src/UI/Main/Search/SearchPage.cs +++ b/src/UI/Main/Search/SearchPage.cs @@ -259,10 +259,8 @@ namespace UnityExplorer.UI.Main.Search m_selectedContextButton = button; - var colors = m_selectedContextButton.colors; - colors.normalColor = new Color(0.35f, 0.7f, 0.35f); - colors.highlightedColor = colors.normalColor; - m_selectedContextButton.colors = colors; + m_selectedContextButton.colors = RuntimeProvider.Instance.SetColorBlock(m_selectedContextButton.colors, + new Color(0.35f, 0.7f, 0.35f), new Color(0.35f, 0.7f, 0.35f)); m_context = context; @@ -439,12 +437,9 @@ namespace UnityExplorer.UI.Main.Search UIFactory.SetLayoutElement(btnGroupObj, flexibleWidth: 320, minHeight: 25, flexibleHeight: 0); btnGroupObj.AddComponent(); - var mainColors = new ColorBlock - { - normalColor = new Color(0.1f, 0.1f, 0.1f), - highlightedColor = new Color(0.2f, 0.2f, 0.2f, 1), - pressedColor = new Color(0.05f, 0.05f, 0.05f) - }; + var mainColors = new ColorBlock(); + RuntimeProvider.Instance.SetColorBlock(mainColors, new Color(0.1f, 0.1f, 0.1f), + new Color(0.2f, 0.2f, 0.2f), new Color(0.05f, 0.05f, 0.05f)); var mainButton = UIFactory.CreateButton(btnGroupObj, "ResultButton", diff --git a/src/UI/UIFactory.cs b/src/UI/UIFactory.cs index 440c356..212c0d6 100644 --- a/src/UI/UIFactory.cs +++ b/src/UI/UIFactory.cs @@ -52,27 +52,26 @@ namespace UnityExplorer.UI internal static void SetDefaultSelectableColors(Selectable selectable) { - ColorBlock colors = selectable.colors; - SetColorBlockValues(ref colors, new Color(0.2f, 0.2f, 0.2f), new Color(0.3f, 0.3f, 0.3f), new Color(0.15f, 0.15f, 0.15f)); - selectable.colors = colors; + selectable.colors = RuntimeProvider.Instance.SetColorBlock(selectable.colors, new Color(0.2f, 0.2f, 0.2f), + new Color(0.3f, 0.3f, 0.3f), new Color(0.15f, 0.15f, 0.15f)); // Deselect all Buttons after they are clicked. if (selectable is Button button) button.onClick.AddListener(() => { button.OnDeselect(null); }); } - public static void SetColorBlockValues(ref this ColorBlock colorBlock, Color? normal = null, Color? highlighted = null, - Color? pressed = null) - { - if (normal != null) - colorBlock.normalColor = (Color)normal; + //public static void SetColorBlockValues(ref this ColorBlock colorBlock, Color? normal = null, Color? highlighted = null, + // Color? pressed = null) + //{ + // if (normal != null) + // colorBlock.normalColor = (Color)normal; - if (highlighted != null) - colorBlock.highlightedColor = (Color)highlighted; + // if (highlighted != null) + // colorBlock.highlightedColor = (Color)highlighted; - if (pressed != null) - colorBlock.pressedColor = (Color)pressed; - } + // if (pressed != null) + // colorBlock.pressedColor = (Color)pressed; + //} /// /// Get and/or Add a LayoutElement component to the GameObject, and set any of the values on it. @@ -114,13 +113,15 @@ namespace UnityExplorer.UI /// public static T SetLayoutGroup(GameObject gameObject, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, - int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup + int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) + where T : HorizontalOrVerticalLayoutGroup { var group = gameObject.GetComponent(); if (!group) group = gameObject.AddComponent(); - return SetLayoutGroup(group, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, padBottom, padLeft, padRight, childAlignment); + return SetLayoutGroup(group, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, + padBottom, padLeft, padRight, childAlignment); } /// @@ -128,7 +129,8 @@ namespace UnityExplorer.UI /// public static T SetLayoutGroup(T group, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, - int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup + int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) + where T : HorizontalOrVerticalLayoutGroup { if (forceWidth != null) group.childForceExpandWidth = (bool)forceWidth; @@ -273,13 +275,9 @@ namespace UnityExplorer.UI public static Button CreateButton(GameObject parent, string name, string text, Action onClick = null, Color? normalColor = null) { var colors = new ColorBlock(); - if (normalColor != null) - colors.normalColor = (Color)normalColor; - else - colors.normalColor = new Color(0.25f, 0.25f, 0.25f); - - colors.pressedColor = new Color(0.15f, 0.15f, 0.15f); - colors.highlightedColor = new Color(0.4f, 0.4f, 0.4f); + normalColor = normalColor ?? new Color(0.25f, 0.25f, 0.25f); + colors = RuntimeProvider.Instance.SetColorBlock(colors, normalColor, new Color(0.4f, 0.4f, 0.4f), + new Color(0.15f, 0.15f, 0.15f)); return CreateButton(parent, name, text, onClick, colors); } @@ -366,7 +364,8 @@ namespace UnityExplorer.UI slider.targetGraphic = handleImage; slider.direction = Slider.Direction.LeftToRight; - SetDefaultSelectableColors(slider); + slider.colors = RuntimeProvider.Instance.SetColorBlock(slider.colors, new Color(0.4f, 0.4f, 0.4f), + new Color(0.55f, 0.55f, 0.55f), new Color(0.3f, 0.3f, 0.3f)); return sliderObj; } @@ -505,12 +504,8 @@ namespace UnityExplorer.UI mainInput.transition = Selectable.Transition.ColorTint; mainInput.targetGraphic = mainImage; - ColorBlock mainColors = mainInput.colors; - mainColors.normalColor = new Color(1, 1, 1, 1); - mainColors.highlightedColor = new Color(0.95f, 0.95f, 0.95f, 1.0f); - mainColors.pressedColor = new Color(0.78f, 0.78f, 0.78f, 1.0f); - mainColors.highlightedColor = new Color(0.95f, 0.95f, 0.95f, 1.0f); - mainInput.colors = mainColors; + mainInput.colors = RuntimeProvider.Instance.SetColorBlock(mainInput.colors, new Color(1, 1, 1, 1), + new Color(0.95f, 0.95f, 0.95f, 1.0f), new Color(0.78f, 0.78f, 0.78f, 1.0f)); SetLayoutGroup(mainObj, true, true, true, true); @@ -614,10 +609,8 @@ namespace UnityExplorer.UI Toggle itemToggle = itemObj.AddComponent(); itemToggle.targetGraphic = itemBgImage; itemToggle.isOn = true; - ColorBlock colors = itemToggle.colors; - colors.normalColor = new Color(0.35f, 0.35f, 0.35f, 1.0f); - colors.highlightedColor = new Color(0.25f, 0.45f, 0.25f, 1.0f); - itemToggle.colors = colors; + itemToggle.colors = RuntimeProvider.Instance.SetColorBlock(itemToggle.colors, + new Color(0.35f, 0.35f, 0.35f, 1.0f), new Color(0.25f, 0.45f, 0.25f, 1.0f)); itemToggle.onValueChanged.AddListener((bool val) => { itemToggle.OnDeselect(null); }); Image templateImage = templateObj.AddComponent(); diff --git a/src/UI/UIManager.cs b/src/UI/UIManager.cs index 41d4d88..a63c67f 100644 --- a/src/UI/UIManager.cs +++ b/src/UI/UIManager.cs @@ -81,8 +81,6 @@ namespace UnityExplorer.UI if (EventSystem.current != EventSys) CursorUnlocker.SetEventSystem(); - RuntimeProvider.Instance.CheckInputPointerEvent(); - PanelDragger.Instance.Update(); SliderScrollbar.UpdateInstances(); diff --git a/src/UI/Utility/SliderScrollbar.cs b/src/UI/Utility/SliderScrollbar.cs index 3a2f498..0a0d9b8 100644 --- a/src/UI/Utility/SliderScrollbar.cs +++ b/src/UI/Utility/SliderScrollbar.cs @@ -186,7 +186,7 @@ public static class SliderExtensions { if (m_setMethod == null) { - m_setMethod = typeof(Slider).GetMethod("Set", ReflectionUtility.CommonFlags, null, new[] { typeof(float), typeof(bool) }, null); + m_setMethod = typeof(Slider).GetMethod("Set", ReflectionUtility.AllFlags, null, new[] { typeof(float), typeof(bool) }, null); } return m_setMethod; } diff --git a/src/UnityExplorer.csproj b/src/UnityExplorer.csproj index e82f549..ce484ac 100644 --- a/src/UnityExplorer.csproj +++ b/src/UnityExplorer.csproj @@ -265,6 +265,7 @@ +