mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-23 17:02:36 +08:00
Compare commits
41 Commits
Author | SHA1 | Date | |
---|---|---|---|
18bcfed434 | |||
c7d2ce6d36 | |||
f961add7f4 | |||
798b881dcb | |||
c90f339882 | |||
c351ce5a6d | |||
9985ed0fd8 | |||
f35232bb64 | |||
49cc1f7df3 | |||
9f78c50854 | |||
bc64a04339 | |||
7d961ce8ad | |||
c7d7569f71 | |||
ee8f33a754 | |||
a95d91c824 | |||
177b78f4e7 | |||
3804d0aab0 | |||
97a82c1661 | |||
96a1cc69fb | |||
589abe6193 | |||
91bb58b020 | |||
d67507ead2 | |||
d730fbe49c | |||
9e0784ce54 | |||
67c602b32f | |||
8fb7d87ca6 | |||
c740c3c54d | |||
ea7b91f7fd | |||
c79223f537 | |||
aae248bf69 | |||
a73e992a0c | |||
3984550bb6 | |||
7928363aeb | |||
12758606fa | |||
c927ac54be | |||
9f1df11940 | |||
62354b6aa2 | |||
44e57c32c3 | |||
274352d665 | |||
7b477a8b0e | |||
e585fc6da0 |
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
ko_fi: sinaidev
|
4
.github/workflows/dotnet.yml
vendored
4
.github/workflows/dotnet.yml
vendored
@ -28,15 +28,13 @@ jobs:
|
|||||||
nuget-api-key: ${{ secrets.NuGetAPIKey }}
|
nuget-api-key: ${{ secrets.NuGetAPIKey }}
|
||||||
nuget-version: '5.x'
|
nuget-version: '5.x'
|
||||||
|
|
||||||
# Build Il2CppAssemblyUnhollower
|
|
||||||
- run: msbuild lib\Il2CppAssemblyUnhollower\UnhollowerBaseLib\UnhollowerBaseLib.csproj -t:Restore -t:Rebuild -p:Platform="AnyCPU" -p:Configuration=Release
|
|
||||||
|
|
||||||
# Build mcs
|
# Build mcs
|
||||||
- run: nuget restore lib\mcs-unity\mcs.sln
|
- run: nuget restore lib\mcs-unity\mcs.sln
|
||||||
- run: msbuild lib\mcs-unity\mcs\mcs.csproj -t:Restore -t:Rebuild -p:Platform="AnyCPU" -p:Configuration=Release
|
- run: msbuild lib\mcs-unity\mcs\mcs.csproj -t:Restore -t:Rebuild -p:Platform="AnyCPU" -p:Configuration=Release
|
||||||
|
|
||||||
# Build UnityExplorer releases, and upload artifacts
|
# Build UnityExplorer releases, and upload artifacts
|
||||||
|
|
||||||
|
- run: dotnet nuget add source https://nuget.bepinex.dev/v3/index.json
|
||||||
- run: nuget restore src\UnityExplorer.sln
|
- run: nuget restore src\UnityExplorer.sln
|
||||||
|
|
||||||
# BepInEx Il2Cpp
|
# BepInEx Il2Cpp
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,6 +1,3 @@
|
|||||||
[submodule "lib/Il2CppAssemblyUnhollower"]
|
|
||||||
path = lib/Il2CppAssemblyUnhollower
|
|
||||||
url = https://github.com/knah/Il2CppAssemblyUnhollower
|
|
||||||
[submodule "lib/mcs-unity"]
|
[submodule "lib/mcs-unity"]
|
||||||
path = lib/mcs-unity
|
path = lib/mcs-unity
|
||||||
url = https://github.com/sinai-dev/mcs-unity
|
url = https://github.com/sinai-dev/mcs-unity
|
||||||
|
27
README.md
27
README.md
@ -35,7 +35,7 @@
|
|||||||
| ------- | ------ | ---- |
|
| ------- | ------ | ---- |
|
||||||
| ML 0.4+ | ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Il2Cpp.zip) | ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Mono.zip) |
|
| ML 0.4+ | ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Il2Cpp.zip) | ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.MelonLoader.Mono.zip) |
|
||||||
|
|
||||||
1. Take the `UnityExplorer.ML.[version].dll` and the `UniverseLib.[version].dll` files and put them in the `Mods\` folder created by MelonLoader.
|
1. Take the `UnityExplorer.ML.[version].dll` file and put them in the `Mods\` folder created by MelonLoader, and then put the `UniverseLib.[version].dll` file in the `UserLibs\` folder.
|
||||||
|
|
||||||
## Standalone
|
## Standalone
|
||||||
|
|
||||||
@ -43,9 +43,10 @@
|
|||||||
| ------ | ---- |
|
| ------ | ---- |
|
||||||
| ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.Standalone.Il2Cpp.zip) | ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.Standalone.Mono.zip) |
|
| ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.Standalone.Il2Cpp.zip) | ✅ [link](https://github.com/sinai-dev/UnityExplorer/releases/latest/download/UnityExplorer.Standalone.Mono.zip) |
|
||||||
|
|
||||||
The standalone release can be used with any injector or loader of your choice, but it requires you to load the dependencies manually: HarmonyX, and the IL2CPP version also requires that you set up an [Il2CppAssemblyUnhollower runtime](https://github.com/knah/Il2CppAssemblyUnhollower#required-external-setup).
|
The standalone release can be used with any injector or loader of your choice, but it requires you to load the dependencies manually.
|
||||||
|
|
||||||
1. Load the required libs - UniverseLib, HarmonyX, and Il2CppAssemblyUnhollower if IL2CPP
|
1. Ensure the required libs are loaded - UniverseLib, HarmonyX and MonoMod
|
||||||
|
2. For IL2CPP, load Il2CppAssemblyUnhollower and start an [Il2CppAssemblyUnhollower runtime](https://github.com/knah/Il2CppAssemblyUnhollower#required-external-setup)
|
||||||
2. Load the UnityExplorer DLL
|
2. Load the UnityExplorer DLL
|
||||||
3. Create an instance of Unity Explorer with `UnityExplorer.ExplorerStandalone.CreateInstance();`
|
3. Create an instance of Unity Explorer with `UnityExplorer.ExplorerStandalone.CreateInstance();`
|
||||||
4. Optionally subscribe to the `ExplorerStandalone.OnLog` event to handle logging if you wish
|
4. Optionally subscribe to the `ExplorerStandalone.OnLog` event to handle logging if you wish
|
||||||
@ -57,7 +58,7 @@ Although UnityExplorer should work out of the box for most Unity games, in some
|
|||||||
To adjust the settings, open the config file:
|
To adjust the settings, open the config file:
|
||||||
* BepInEx: `BepInEx\config\com.sinai.unityexplorer.cfg`
|
* BepInEx: `BepInEx\config\com.sinai.unityexplorer.cfg`
|
||||||
* MelonLoader: `UserData\MelonPreferences.cfg`
|
* MelonLoader: `UserData\MelonPreferences.cfg`
|
||||||
* Standalone: `UnityExplorer\config.ini`
|
* Standalone: `UnityExplorer\config.cfg`
|
||||||
|
|
||||||
Try adjusting the following settings and see if it fixes your issues:
|
Try adjusting the following settings and see if it fixes your issues:
|
||||||
* `Startup_Delay_Time` - increase to 5-10 seconds (or more as needed), can fix issues with UnityExplorer being destroyed or corrupted during startup.
|
* `Startup_Delay_Time` - increase to 5-10 seconds (or more as needed), can fix issues with UnityExplorer being destroyed or corrupted during startup.
|
||||||
@ -109,24 +110,30 @@ The inspector is used to see detailed information on objects of any type and man
|
|||||||
|
|
||||||
### Mouse-Inspect
|
### Mouse-Inspect
|
||||||
|
|
||||||
* The "Mouse Inspect" dropdown on the main UnityExplorer navbar allows you to inspect objects under the mouse.
|
* The "Mouse Inspect" dropdown in the "Inspector" panel allows you to inspect objects under the mouse.
|
||||||
* <b>World</b>: uses Physics.Raycast to look for Colliders
|
* <b>World</b>: uses Physics.Raycast to look for Colliders
|
||||||
* <b>UI</b>: uses GraphicRaycasters to find UI objects
|
* <b>UI</b>: uses GraphicRaycasters to find UI objects
|
||||||
|
|
||||||
|
### Clipboard
|
||||||
|
|
||||||
|
* The "Clipboard" panel allows you to see your current paste value, or clear it (resets it to `null`)
|
||||||
|
* Can copy the value from any member in a Reflection Inspector, Enumerable or Dictionary, and from the target of any Inspector tab
|
||||||
|
* Can paste values onto any member in a Reflection Inspector
|
||||||
|
* Non-parsable arguments in Method/Property Evaluators allow pasting values
|
||||||
|
* The C# Console has helper methods `Copy(obj)` and `Paste()` for accessing the Clipboard
|
||||||
|
|
||||||
### Settings
|
### Settings
|
||||||
|
|
||||||
* You can change the settings via the "Options" tab of the menu, or directly from the config file.
|
* You can change the settings via the "Options" tab of the menu, or directly from the config file.
|
||||||
* BepInEx: `BepInEx\config\com.sinai.unityexplorer.cfg`
|
* BepInEx: `BepInEx\config\com.sinai.unityexplorer.cfg`
|
||||||
* MelonLoader: `UserData\MelonPreferences.cfg`
|
* MelonLoader: `UserData\MelonPreferences.cfg`
|
||||||
* Standalone `{DLL_location}\UnityExplorer\config.ini`
|
* Standalone `{DLL_location}\UnityExplorer\config.cfg`
|
||||||
|
|
||||||
# Building
|
# Building
|
||||||
|
|
||||||
For Visual Studio:
|
|
||||||
|
|
||||||
0. Clone the repository and run `git submodule update --init --recursive` to get the submodules.
|
0. Clone the repository and run `git submodule update --init --recursive` to get the submodules.
|
||||||
1. Open the `src\UnityExplorer.sln` project.
|
1. Open the `src\UnityExplorer.sln` project.
|
||||||
2. Build `mcs` (Release/AnyCPU, you may need to run `nuget restore mcs.sln`), and if using IL2CPP then build `Il2CppAssemblyUnhollower` (Release/AnyCPU) as well.
|
2. Build `mcs` (Release/AnyCPU, you may need to run `nuget restore mcs.sln`)
|
||||||
3. Build the UnityExplorer release(s) you want to use, either by selecting the config as the Active Config, or batch-building.
|
3. Build the UnityExplorer release(s) you want to use, either by selecting the config as the Active Config, or batch-building.
|
||||||
|
|
||||||
If you fork the repository on GitHub you can build using the [dotnet workflow](https://github.com/sinai-dev/UnityExplorer/blob/master/.github/workflows/dotnet.yml):
|
If you fork the repository on GitHub you can build using the [dotnet workflow](https://github.com/sinai-dev/UnityExplorer/blob/master/.github/workflows/dotnet.yml):
|
||||||
@ -138,7 +145,7 @@ If you fork the repository on GitHub you can build using the [dotnet workflow](h
|
|||||||
# Acknowledgments
|
# Acknowledgments
|
||||||
|
|
||||||
* [ManlyMarco](https://github.com/ManlyMarco) for [Runtime Unity Editor](https://github.com/ManlyMarco/RuntimeUnityEditor) \[[license](THIRDPARTY_LICENSES.md#runtimeunityeditor-license)\], the ScriptEvaluator from RUE's REPL console was used as the base for UnityExplorer's C# console.
|
* [ManlyMarco](https://github.com/ManlyMarco) for [Runtime Unity Editor](https://github.com/ManlyMarco/RuntimeUnityEditor) \[[license](THIRDPARTY_LICENSES.md#runtimeunityeditor-license)\], the ScriptEvaluator from RUE's REPL console was used as the base for UnityExplorer's C# console.
|
||||||
* [denikson](https://github.com/denikson) (aka Horse) for [mcs-unity](https://github.com/denikson/mcs-unity) \[no license\], used as the `Mono.CSharp` reference for the C# Console.
|
* [Geoffrey Horsington](https://github.com/ghorsington) for [mcs-unity](https://github.com/sinai-dev/mcs-unity) \[no license\], used as the `Mono.CSharp` reference for the C# Console.
|
||||||
|
|
||||||
### Disclaimer
|
### Disclaimer
|
||||||
|
|
||||||
|
Submodule lib/Il2CppAssemblyUnhollower deleted from 0099c25069
@ -8,6 +8,8 @@ using UnityExplorer.UI;
|
|||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CSConsole
|
namespace UnityExplorer.CSConsole
|
||||||
{
|
{
|
||||||
@ -25,7 +27,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
AutoCompleteModal.Instance.ReleaseOwnership(this);
|
AutoCompleteModal.Instance.ReleaseOwnership(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly HashSet<char> delimiters = new HashSet<char>
|
private readonly HashSet<char> delimiters = new()
|
||||||
{
|
{
|
||||||
'{', '}', ',', ';', '<', '>', '(', ')', '[', ']', '=', '|', '&', '?'
|
'{', '}', ',', ';', '<', '>', '(', ')', '[', ']', '=', '|', '&', '?'
|
||||||
};
|
};
|
||||||
|
@ -16,6 +16,8 @@ using UnityExplorer.UI.Panels;
|
|||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CSConsole
|
namespace UnityExplorer.CSConsole
|
||||||
{
|
{
|
||||||
@ -27,6 +29,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
|
|
||||||
private static HashSet<string> usingDirectives;
|
private static HashSet<string> usingDirectives;
|
||||||
private static StringBuilder evaluatorOutput;
|
private static StringBuilder evaluatorOutput;
|
||||||
|
private static StringWriter evaluatorStringWriter;
|
||||||
|
|
||||||
public static CSConsolePanel Panel => UIManager.GetPanel<CSConsolePanel>(UIManager.Panels.CSConsole);
|
public static CSConsolePanel Panel => UIManager.GetPanel<CSConsolePanel>(UIManager.Panels.CSConsole);
|
||||||
public static InputFieldRef Input => Panel.Input;
|
public static InputFieldRef Input => Panel.Input;
|
||||||
@ -46,6 +49,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
"System",
|
"System",
|
||||||
"System.Linq",
|
"System.Linq",
|
||||||
"System.Text",
|
"System.Text",
|
||||||
|
"System.Collections",
|
||||||
"System.Collections.Generic",
|
"System.Collections.Generic",
|
||||||
"UnityEngine",
|
"UnityEngine",
|
||||||
#if CPP
|
#if CPP
|
||||||
@ -130,6 +134,12 @@ namespace UnityExplorer.CSConsole
|
|||||||
|
|
||||||
#region Evaluating
|
#region Evaluating
|
||||||
|
|
||||||
|
private static void GenerateTextWriter()
|
||||||
|
{
|
||||||
|
evaluatorOutput = new StringBuilder();
|
||||||
|
evaluatorStringWriter = new StringWriter(evaluatorOutput);
|
||||||
|
}
|
||||||
|
|
||||||
public static void ResetConsole() => ResetConsole(true);
|
public static void ResetConsole() => ResetConsole(true);
|
||||||
|
|
||||||
public static void ResetConsole(bool logSuccess = true)
|
public static void ResetConsole(bool logSuccess = true)
|
||||||
@ -140,8 +150,8 @@ namespace UnityExplorer.CSConsole
|
|||||||
if (Evaluator != null)
|
if (Evaluator != null)
|
||||||
Evaluator.Dispose();
|
Evaluator.Dispose();
|
||||||
|
|
||||||
evaluatorOutput = new StringBuilder();
|
GenerateTextWriter();
|
||||||
Evaluator = new ScriptEvaluator(new StringWriter(evaluatorOutput))
|
Evaluator = new ScriptEvaluator(evaluatorStringWriter)
|
||||||
{
|
{
|
||||||
InteractiveBaseClass = typeof(ScriptInteraction)
|
InteractiveBaseClass = typeof(ScriptInteraction)
|
||||||
};
|
};
|
||||||
@ -176,6 +186,12 @@ namespace UnityExplorer.CSConsole
|
|||||||
if (SRENotSupported)
|
if (SRENotSupported)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (evaluatorStringWriter == null || evaluatorOutput == null)
|
||||||
|
{
|
||||||
|
GenerateTextWriter();
|
||||||
|
Evaluator._textWriter = evaluatorStringWriter;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Compile the code. If it returned a CompiledMethod, it is REPL.
|
// Compile the code. If it returned a CompiledMethod, it is REPL.
|
||||||
@ -343,7 +359,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
var charTop = charInfo.cursorPos.y;
|
var charTop = charInfo.cursorPos.y;
|
||||||
var charBot = charTop - CSCONSOLE_LINEHEIGHT;
|
var charBot = charTop - CSCONSOLE_LINEHEIGHT;
|
||||||
|
|
||||||
var viewportMin = Input.Rect.rect.height - Input.Rect.anchoredPosition.y - (Input.Rect.rect.height * 0.5f);
|
var viewportMin = Input.Transform.rect.height - Input.Transform.anchoredPosition.y - (Input.Transform.rect.height * 0.5f);
|
||||||
var viewportMax = viewportMin - Panel.InputScroller.ViewportRect.rect.height;
|
var viewportMax = viewportMin - Panel.InputScroller.ViewportRect.rect.height;
|
||||||
|
|
||||||
float diff = 0f;
|
float diff = 0f;
|
||||||
@ -354,7 +370,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
|
|
||||||
if (Math.Abs(diff) > 1)
|
if (Math.Abs(diff) > 1)
|
||||||
{
|
{
|
||||||
var rect = Input.Rect;
|
var rect = Input.Transform;
|
||||||
rect.anchoredPosition = new Vector2(rect.anchoredPosition.x, rect.anchoredPosition.y - diff);
|
rect.anchoredPosition = new Vector2(rect.anchoredPosition.x, rect.anchoredPosition.y - diff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -364,7 +380,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
{
|
{
|
||||||
settingCaretCoroutine = true;
|
settingCaretCoroutine = true;
|
||||||
Input.Component.readOnly = true;
|
Input.Component.readOnly = true;
|
||||||
RuntimeProvider.Instance.StartCoroutine(SetCaretCoroutine(caretPosition));
|
RuntimeHelper.StartCoroutine(SetCaretCoroutine(caretPosition));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static PropertyInfo SelectionGuardProperty => selectionGuardPropInfo ?? GetSelectionGuardPropInfo();
|
internal static PropertyInfo SelectionGuardProperty => selectionGuardPropInfo ?? GetSelectionGuardPropInfo();
|
||||||
@ -424,7 +440,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
|
|
||||||
// the top and bottom position of the viewport in relation to the text height
|
// the top and bottom position of the viewport in relation to the text height
|
||||||
// they need the half-height adjustment to normalize against the 'line.topY' value.
|
// they need the half-height adjustment to normalize against the 'line.topY' value.
|
||||||
var viewportMin = Input.Rect.rect.height - Input.Rect.anchoredPosition.y - (Input.Rect.rect.height * 0.5f);
|
var viewportMin = Input.Transform.rect.height - Input.Transform.anchoredPosition.y - (Input.Transform.rect.height * 0.5f);
|
||||||
var viewportMax = viewportMin - Panel.InputScroller.ViewportRect.rect.height;
|
var viewportMax = viewportMin - Panel.InputScroller.ViewportRect.rect.height;
|
||||||
|
|
||||||
for (int i = 0; i < Input.TextGenerator.lineCount; i++)
|
for (int i = 0; i < Input.TextGenerator.lineCount; i++)
|
||||||
@ -589,7 +605,7 @@ If the game was built with Unity's stubbed netstandard 2.0 runtime, you can fix
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly Dictionary<string, string> helpDict = new Dictionary<string, string>();
|
private static readonly Dictionary<string, string> helpDict = new();
|
||||||
|
|
||||||
public static void SetupHelpInteraction()
|
public static void SetupHelpInteraction()
|
||||||
{
|
{
|
||||||
@ -644,15 +660,17 @@ var x = 5;
|
|||||||
++x;
|
++x;
|
||||||
|
|
||||||
/* The following helpers are available in REPL mode:
|
/* The following helpers are available in REPL mode:
|
||||||
* GetUsing(); - prints the current using directives to the console log
|
|
||||||
* GetVars(); - prints the names and values of the REPL variables you have defined
|
|
||||||
* GetClasses(); - prints the names and members of the classes you have defined
|
|
||||||
* Log(obj); - prints a message to the console log
|
|
||||||
* CurrentTarget; - System.Object, the target of the active Inspector tab
|
* CurrentTarget; - System.Object, the target of the active Inspector tab
|
||||||
* AllTargets; - System.Object[], the targets of all Inspector tabs
|
* AllTargets; - System.Object[], the targets of all Inspector tabs
|
||||||
|
* Log(obj); - prints a message to the console log
|
||||||
* Inspect(obj); - inspect the object with the Inspector
|
* Inspect(obj); - inspect the object with the Inspector
|
||||||
* Inspect(someType); - inspect a Type with static reflection
|
* Inspect(someType); - inspect a Type with static reflection
|
||||||
* Start(enumerator); - starts the IEnumerator as a Coroutine
|
* Start(enumerator); - starts the IEnumerator as a Coroutine
|
||||||
|
* Copy(obj); - copies the object to the UnityExplorer Clipboard
|
||||||
|
* Paste(); - System.Object, the contents of the Clipboard.
|
||||||
|
* GetUsing(); - prints the current using directives to the console log
|
||||||
|
* GetVars(); - prints the names and values of the REPL variables you have defined
|
||||||
|
* GetClasses(); - prints the names and members of the classes you have defined
|
||||||
* help; - the default REPL help command, contains additional helpers.
|
* help; - the default REPL help command, contains additional helpers.
|
||||||
*/";
|
*/";
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ using UnityEngine;
|
|||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.CSConsole.Lexers;
|
using UnityExplorer.CSConsole.Lexers;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CSConsole
|
namespace UnityExplorer.CSConsole
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CSConsole.Lexers
|
namespace UnityExplorer.CSConsole.Lexers
|
||||||
{
|
{
|
||||||
|
@ -1,45 +1,45 @@
|
|||||||
using Mono.CSharp;
|
using HarmonyLib;
|
||||||
|
using Mono.CSharp;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
|
||||||
namespace UnityExplorer.CSConsole
|
namespace UnityExplorer.CSConsole
|
||||||
{
|
{
|
||||||
public class ScriptInteraction : InteractiveBase
|
public class ScriptInteraction : InteractiveBase
|
||||||
{
|
{
|
||||||
|
public static object CurrentTarget
|
||||||
|
=> InspectorManager.ActiveInspector?.Target;
|
||||||
|
|
||||||
|
public static object[] AllTargets
|
||||||
|
=> InspectorManager.Inspectors.Select(it => it.Target).ToArray();
|
||||||
|
|
||||||
public static void Log(object message)
|
public static void Log(object message)
|
||||||
{
|
=> ExplorerCore.Log(message);
|
||||||
ExplorerCore.Log(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object CurrentTarget => InspectorManager.ActiveInspector?.Target;
|
|
||||||
|
|
||||||
public static object[] AllTargets => InspectorManager.Inspectors.Select(it => it.Target).ToArray();
|
|
||||||
|
|
||||||
public static void Inspect(object obj)
|
public static void Inspect(object obj)
|
||||||
{
|
=> InspectorManager.Inspect(obj);
|
||||||
InspectorManager.Inspect(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Inspect(Type type)
|
public static void Inspect(Type type)
|
||||||
{
|
=> InspectorManager.Inspect(type);
|
||||||
InspectorManager.Inspect(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Start(IEnumerator ienumerator)
|
public static void Start(IEnumerator ienumerator)
|
||||||
{
|
=> RuntimeHelper.StartCoroutine(ienumerator);
|
||||||
RuntimeProvider.Instance.StartCoroutine(ienumerator);
|
|
||||||
}
|
public static void Copy(object obj)
|
||||||
|
=> ClipboardPanel.Copy(obj);
|
||||||
|
|
||||||
|
public static object Paste()
|
||||||
|
=> ClipboardPanel.Current;
|
||||||
|
|
||||||
public static void GetUsing()
|
public static void GetUsing()
|
||||||
{
|
=> Log(Evaluator.GetUsing());
|
||||||
Log(Evaluator.GetUsing());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GetVars()
|
public static void GetVars()
|
||||||
{
|
{
|
||||||
@ -52,7 +52,7 @@ namespace UnityExplorer.CSConsole
|
|||||||
|
|
||||||
public static void GetClasses()
|
public static void GetClasses()
|
||||||
{
|
{
|
||||||
if (ReflectionUtility.GetFieldInfo(typeof(Evaluator), "source_file")
|
if (AccessTools.Field(typeof(Evaluator), "source_file")
|
||||||
.GetValue(Evaluator) is CompilationSourceFile sourceFile
|
.GetValue(Evaluator) is CompilationSourceFile sourceFile
|
||||||
&& sourceFile.Containers.Any())
|
&& sourceFile.Containers.Any())
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.CacheObject.Views;
|
using UnityExplorer.CacheObject.Views;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject
|
namespace UnityExplorer.CacheObject
|
||||||
@ -44,6 +44,6 @@ namespace UnityExplorer.CacheObject
|
|||||||
RefConfigElement.BoxedValue = value;
|
RefConfigElement.BoxedValue = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool SetCellEvaluateState(CacheObjectCell cell) => false;
|
protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell) => true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ using System.Text;
|
|||||||
using UnityExplorer.CacheObject.IValues;
|
using UnityExplorer.CacheObject.IValues;
|
||||||
using UnityExplorer.CacheObject.Views;
|
using UnityExplorer.CacheObject.Views;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject
|
namespace UnityExplorer.CacheObject
|
||||||
{
|
{
|
||||||
@ -92,10 +93,6 @@ namespace UnityExplorer.CacheObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected override bool SetCellEvaluateState(CacheObjectCell cell)
|
protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell) => true;
|
||||||
{
|
|
||||||
// not needed
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ namespace UnityExplorer.CacheObject
|
|||||||
|
|
||||||
public override bool ShouldAutoEvaluate => true;
|
public override bool ShouldAutoEvaluate => true;
|
||||||
public override bool HasArguments => false;
|
public override bool HasArguments => false;
|
||||||
public override bool CanWrite => Owner.CanWrite;
|
public override bool CanWrite => Owner?.CanWrite ?? false;
|
||||||
|
|
||||||
public void SetListOwner(InteractiveList list, int listIndex)
|
public void SetListOwner(InteractiveList list, int listIndex)
|
||||||
{
|
{
|
||||||
@ -37,11 +37,6 @@ namespace UnityExplorer.CacheObject
|
|||||||
(Owner as InteractiveList).TrySetValueToIndex(value, this.ListIndex);
|
(Owner as InteractiveList).TrySetValueToIndex(value, this.ListIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell) => true;
|
||||||
protected override bool SetCellEvaluateState(CacheObjectCell cell)
|
|
||||||
{
|
|
||||||
// not needed
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,16 @@ using System.Linq;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
using UnityExplorer.CacheObject.Views;
|
using UnityExplorer.CacheObject.Views;
|
||||||
using UnityExplorer.Inspectors;
|
using UnityExplorer.Inspectors;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UnityExplorer.UI.Widgets;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject
|
namespace UnityExplorer.CacheObject
|
||||||
{
|
{
|
||||||
@ -31,7 +34,9 @@ namespace UnityExplorer.CacheObject
|
|||||||
public virtual void SetInspectorOwner(ReflectionInspector inspector, MemberInfo member)
|
public virtual void SetInspectorOwner(ReflectionInspector inspector, MemberInfo member)
|
||||||
{
|
{
|
||||||
this.Owner = inspector;
|
this.Owner = inspector;
|
||||||
this.NameLabelText = SignatureHighlighter.Parse(member.DeclaringType, false, member);
|
this.NameLabelText = this is CacheMethod
|
||||||
|
? SignatureHighlighter.HighlightMethod(member as MethodInfo)
|
||||||
|
: SignatureHighlighter.Parse(member.DeclaringType, false, member);
|
||||||
this.NameForFiltering = $"{member.DeclaringType.Name}.{member.Name}";
|
this.NameForFiltering = $"{member.DeclaringType.Name}.{member.Name}";
|
||||||
this.NameLabelTextRaw = NameForFiltering;
|
this.NameLabelTextRaw = NameForFiltering;
|
||||||
}
|
}
|
||||||
@ -92,7 +97,7 @@ namespace UnityExplorer.CacheObject
|
|||||||
private static readonly Color evalEnabledColor = new Color(0.15f, 0.25f, 0.15f);
|
private static readonly Color evalEnabledColor = new Color(0.15f, 0.25f, 0.15f);
|
||||||
private static readonly Color evalDisabledColor = new Color(0.15f, 0.15f, 0.15f);
|
private static readonly Color evalDisabledColor = new Color(0.15f, 0.15f, 0.15f);
|
||||||
|
|
||||||
protected override bool SetCellEvaluateState(CacheObjectCell objectcell)
|
protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell objectcell)
|
||||||
{
|
{
|
||||||
var cell = objectcell as CacheMemberCell;
|
var cell = objectcell as CacheMemberCell;
|
||||||
|
|
||||||
@ -108,14 +113,14 @@ namespace UnityExplorer.CacheObject
|
|||||||
{
|
{
|
||||||
cell.EvaluateButton.ButtonText.text = "Hide";
|
cell.EvaluateButton.ButtonText.text = "Hide";
|
||||||
Evaluator.UIRoot.transform.SetParent(cell.EvaluateHolder.transform, false);
|
Evaluator.UIRoot.transform.SetParent(cell.EvaluateHolder.transform, false);
|
||||||
RuntimeProvider.Instance.SetColorBlock(cell.EvaluateButton.Component, evalEnabledColor, evalEnabledColor * 1.3f);
|
RuntimeHelper.SetColorBlock(cell.EvaluateButton.Component, evalEnabledColor, evalEnabledColor * 1.3f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cell.EvaluateButton.ButtonText.text = "Evaluate";
|
cell.EvaluateButton.ButtonText.text = "Evaluate";
|
||||||
|
|
||||||
if (!Evaluating)
|
if (!Evaluating)
|
||||||
RuntimeProvider.Instance.SetColorBlock(cell.EvaluateButton.Component, evalDisabledColor, evalDisabledColor * 1.3f);
|
RuntimeHelper.SetColorBlock(cell.EvaluateButton.Component, evalDisabledColor, evalDisabledColor * 1.3f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (State == ValueState.NotEvaluated && !ShouldAutoEvaluate)
|
if (State == ValueState.NotEvaluated && !ShouldAutoEvaluate)
|
||||||
@ -123,13 +128,13 @@ namespace UnityExplorer.CacheObject
|
|||||||
SetValueState(cell, ValueStateArgs.Default);
|
SetValueState(cell, ValueStateArgs.Default);
|
||||||
cell.RefreshSubcontentButton();
|
cell.RefreshSubcontentButton();
|
||||||
|
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (State == ValueState.NotEvaluated)
|
if (State == ValueState.NotEvaluated)
|
||||||
Evaluate();
|
Evaluate();
|
||||||
|
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnEvaluateClicked()
|
public void OnEvaluateClicked()
|
||||||
@ -145,7 +150,7 @@ namespace UnityExplorer.CacheObject
|
|||||||
this.Evaluator = Pool<EvaluateWidget>.Borrow();
|
this.Evaluator = Pool<EvaluateWidget>.Borrow();
|
||||||
Evaluator.OnBorrowedFromPool(this);
|
Evaluator.OnBorrowedFromPool(this);
|
||||||
Evaluator.UIRoot.transform.SetParent((CellView as CacheMemberCell).EvaluateHolder.transform, false);
|
Evaluator.UIRoot.transform.SetParent((CellView as CacheMemberCell).EvaluateHolder.transform, false);
|
||||||
SetCellEvaluateState(CellView);
|
TryAutoEvaluateIfUnitialized(CellView);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -154,7 +159,7 @@ namespace UnityExplorer.CacheObject
|
|||||||
else
|
else
|
||||||
Evaluator.UIRoot.SetActive(true);
|
Evaluator.UIRoot.SetActive(true);
|
||||||
|
|
||||||
SetCellEvaluateState(CellView);
|
TryAutoEvaluateIfUnitialized(CellView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -162,22 +167,22 @@ namespace UnityExplorer.CacheObject
|
|||||||
|
|
||||||
#region Cache Member Util
|
#region Cache Member Util
|
||||||
|
|
||||||
public static bool CanParseArgs(ParameterInfo[] parameters)
|
//public static bool CanParseArgs(ParameterInfo[] parameters)
|
||||||
{
|
//{
|
||||||
foreach (var param in parameters)
|
// foreach (var param in parameters)
|
||||||
{
|
// {
|
||||||
var pType = param.ParameterType;
|
// var pType = param.ParameterType;
|
||||||
|
//
|
||||||
if (pType.IsByRef && pType.HasElementType)
|
// if (pType.IsByRef && pType.HasElementType)
|
||||||
pType = pType.GetElementType();
|
// pType = pType.GetElementType();
|
||||||
|
//
|
||||||
if (pType != null && ParseUtility.CanParse(pType))
|
// if (pType != null && ParseUtility.CanParse(pType))
|
||||||
continue;
|
// continue;
|
||||||
else
|
// else
|
||||||
return false;
|
// return false;
|
||||||
}
|
// }
|
||||||
return true;
|
// return true;
|
||||||
}
|
//}
|
||||||
|
|
||||||
public static List<CacheMember> GetCacheMembers(object inspectorTarget, Type _type, ReflectionInspector _inspector)
|
public static List<CacheMember> GetCacheMembers(object inspectorTarget, Type _type, ReflectionInspector _inspector)
|
||||||
{
|
{
|
||||||
@ -232,7 +237,7 @@ namespace UnityExplorer.CacheObject
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (RuntimeHelper.IsBlacklisted(member))
|
if (UERuntimeHelper.IsBlacklisted(member))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var sig = GetSig(member);
|
var sig = GetSig(member);
|
||||||
@ -250,11 +255,11 @@ namespace UnityExplorer.CacheObject
|
|||||||
&& (mi.Name.StartsWith("get_") || mi.Name.StartsWith("set_")))
|
&& (mi.Name.StartsWith("get_") || mi.Name.StartsWith("set_")))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var args = mi.GetParameters();
|
//var args = mi.GetParameters();
|
||||||
if (!CanParseArgs(args))
|
//if (!CanParseArgs(args))
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
sig += GetArgumentString(args);
|
sig += GetArgumentString(mi.GetParameters());
|
||||||
if (cachedSigs.Contains(sig))
|
if (cachedSigs.Contains(sig))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -267,9 +272,9 @@ namespace UnityExplorer.CacheObject
|
|||||||
{
|
{
|
||||||
var pi = member as PropertyInfo;
|
var pi = member as PropertyInfo;
|
||||||
|
|
||||||
var args = pi.GetIndexParameters();
|
//var args = pi.GetIndexParameters();
|
||||||
if (!CanParseArgs(args))
|
//if (!CanParseArgs(args))
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
if (!pi.CanRead && pi.CanWrite)
|
if (!pi.CanRead && pi.CanWrite)
|
||||||
{
|
{
|
||||||
@ -280,7 +285,7 @@ namespace UnityExplorer.CacheObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sig += GetArgumentString(args);
|
sig += GetArgumentString(pi.GetIndexParameters());
|
||||||
if (cachedSigs.Contains(sig))
|
if (cachedSigs.Contains(sig))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ using System.Reflection;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityExplorer.Inspectors;
|
using UnityExplorer.Inspectors;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject
|
namespace UnityExplorer.CacheObject
|
||||||
{
|
{
|
||||||
|
@ -6,13 +6,15 @@ using System.Reflection;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
using UnityExplorer.CacheObject.IValues;
|
using UnityExplorer.CacheObject.IValues;
|
||||||
using UnityExplorer.CacheObject.Views;
|
using UnityExplorer.CacheObject.Views;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject
|
namespace UnityExplorer.CacheObject
|
||||||
{
|
{
|
||||||
@ -254,14 +256,14 @@ namespace UnityExplorer.CacheObject
|
|||||||
|
|
||||||
// Setting cell state from our model
|
// Setting cell state from our model
|
||||||
|
|
||||||
/// <summary>Return true if SetCell should abort, false if it should continue.</summary>
|
/// <summary>Return false if SetCell should abort, true if it should continue.</summary>
|
||||||
protected abstract bool SetCellEvaluateState(CacheObjectCell cell);
|
protected abstract bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell);
|
||||||
|
|
||||||
public virtual void SetDataToCell(CacheObjectCell cell)
|
public virtual void SetDataToCell(CacheObjectCell cell)
|
||||||
{
|
{
|
||||||
cell.NameLabel.text = NameLabelText;
|
cell.NameLabel.text = NameLabelText;
|
||||||
if (cell.HiddenNameLabel != null)
|
if (cell.HiddenNameLabel != null)
|
||||||
cell.HiddenNameLabel.Text = NameLabelTextRaw;
|
cell.HiddenNameLabel.Text = NameLabelTextRaw ?? string.Empty;
|
||||||
cell.ValueLabel.gameObject.SetActive(true);
|
cell.ValueLabel.gameObject.SetActive(true);
|
||||||
|
|
||||||
cell.SubContentHolder.gameObject.SetActive(SubContentShowWanted);
|
cell.SubContentHolder.gameObject.SetActive(SubContentShowWanted);
|
||||||
@ -271,9 +273,21 @@ namespace UnityExplorer.CacheObject
|
|||||||
IValue.SetLayout();
|
IValue.SetLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SetCellEvaluateState(cell))
|
bool evaluated = TryAutoEvaluateIfUnitialized(cell);
|
||||||
|
|
||||||
|
if (cell.CopyButton != null)
|
||||||
|
{
|
||||||
|
bool hasEvaluated = State != ValueState.NotEvaluated && State != ValueState.Exception;
|
||||||
|
cell.CopyButton.Component.gameObject.SetActive(hasEvaluated);
|
||||||
|
cell.PasteButton.Component.gameObject.SetActive(hasEvaluated && this.CanWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!evaluated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// The following only executes if the object has evaluated.
|
||||||
|
// For members and properties with args, they will return by default now.
|
||||||
|
|
||||||
switch (State)
|
switch (State)
|
||||||
{
|
{
|
||||||
case ValueState.Exception:
|
case ValueState.Exception:
|
||||||
|
@ -7,6 +7,8 @@ using UnityEngine.UI;
|
|||||||
using UnityExplorer.CacheObject;
|
using UnityExplorer.CacheObject;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.IValues
|
namespace UnityExplorer.CacheObject.IValues
|
||||||
{
|
{
|
||||||
@ -16,11 +18,11 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
|
|
||||||
public Color EditedColor;
|
public Color EditedColor;
|
||||||
|
|
||||||
private Image m_colorImage;
|
private Image colorImage;
|
||||||
private readonly InputFieldRef[] m_inputs = new InputFieldRef[4];
|
private readonly InputFieldRef[] inputs = new InputFieldRef[4];
|
||||||
private readonly Slider[] m_sliders = new Slider[4];
|
private readonly Slider[] sliders = new Slider[4];
|
||||||
|
|
||||||
private ButtonRef m_applyButton;
|
private ButtonRef applyButton;
|
||||||
|
|
||||||
private static readonly string[] fieldNames = new[] { "R", "G", "B", "A" };
|
private static readonly string[] fieldNames = new[] { "R", "G", "B", "A" };
|
||||||
|
|
||||||
@ -28,11 +30,11 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
{
|
{
|
||||||
base.OnBorrowed(owner);
|
base.OnBorrowed(owner);
|
||||||
|
|
||||||
m_applyButton.Component.gameObject.SetActive(owner.CanWrite);
|
applyButton.Component.gameObject.SetActive(owner.CanWrite);
|
||||||
|
|
||||||
foreach (var slider in m_sliders)
|
foreach (var slider in sliders)
|
||||||
slider.interactable = owner.CanWrite;
|
slider.interactable = owner.CanWrite;
|
||||||
foreach (var input in m_inputs)
|
foreach (var input in inputs)
|
||||||
input.Component.readOnly = !owner.CanWrite;
|
input.Component.readOnly = !owner.CanWrite;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,27 +50,27 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
{
|
{
|
||||||
IsValueColor32 = true;
|
IsValueColor32 = true;
|
||||||
EditedColor = c32;
|
EditedColor = c32;
|
||||||
m_inputs[0].Text = c32.r.ToString();
|
inputs[0].Text = c32.r.ToString();
|
||||||
m_inputs[1].Text = c32.g.ToString();
|
inputs[1].Text = c32.g.ToString();
|
||||||
m_inputs[2].Text = c32.b.ToString();
|
inputs[2].Text = c32.b.ToString();
|
||||||
m_inputs[3].Text = c32.a.ToString();
|
inputs[3].Text = c32.a.ToString();
|
||||||
foreach (var slider in m_sliders)
|
foreach (var slider in sliders)
|
||||||
slider.maxValue = 255;
|
slider.maxValue = 255;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IsValueColor32 = false;
|
IsValueColor32 = false;
|
||||||
EditedColor = (Color)value;
|
EditedColor = (Color)value;
|
||||||
m_inputs[0].Text = EditedColor.r.ToString();
|
inputs[0].Text = EditedColor.r.ToString();
|
||||||
m_inputs[1].Text = EditedColor.g.ToString();
|
inputs[1].Text = EditedColor.g.ToString();
|
||||||
m_inputs[2].Text = EditedColor.b.ToString();
|
inputs[2].Text = EditedColor.b.ToString();
|
||||||
m_inputs[3].Text = EditedColor.a.ToString();
|
inputs[3].Text = EditedColor.a.ToString();
|
||||||
foreach (var slider in m_sliders)
|
foreach (var slider in sliders)
|
||||||
slider.maxValue = 1;
|
slider.maxValue = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_colorImage)
|
if (colorImage)
|
||||||
m_colorImage.color = EditedColor;
|
colorImage.color = EditedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setting value to owner
|
// setting value to owner
|
||||||
@ -91,8 +93,8 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
case 3: EditedColor.a = val; break;
|
case 3: EditedColor.a = val; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_colorImage)
|
if (colorImage)
|
||||||
m_colorImage.color = EditedColor;
|
colorImage.color = EditedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnInputChanged(string val, int fieldIndex)
|
private void OnInputChanged(string val, int fieldIndex)
|
||||||
@ -103,13 +105,13 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
if (IsValueColor32)
|
if (IsValueColor32)
|
||||||
{
|
{
|
||||||
byte value = byte.Parse(val);
|
byte value = byte.Parse(val);
|
||||||
m_sliders[fieldIndex].value = value;
|
sliders[fieldIndex].value = value;
|
||||||
f = (float)((decimal)value / 255);
|
f = (float)((decimal)value / 255);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
f = float.Parse(val);
|
f = float.Parse(val);
|
||||||
m_sliders[fieldIndex].value = f;
|
sliders[fieldIndex].value = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetColorField(f, fieldIndex);
|
SetColorField(f, fieldIndex);
|
||||||
@ -129,12 +131,12 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
{
|
{
|
||||||
if (IsValueColor32)
|
if (IsValueColor32)
|
||||||
{
|
{
|
||||||
m_inputs[fieldIndex].Text = ((byte)val).ToString();
|
inputs[fieldIndex].Text = ((byte)val).ToString();
|
||||||
val /= 255f;
|
val /= 255f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_inputs[fieldIndex].Text = val.ToString();
|
inputs[fieldIndex].Text = val.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
SetColorField(val, fieldIndex);
|
SetColorField(val, fieldIndex);
|
||||||
@ -167,15 +169,15 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
|
|
||||||
// apply button
|
// apply button
|
||||||
|
|
||||||
m_applyButton = UIFactory.CreateButton(horiGroup, "ApplyButton", "Apply", new Color(0.2f, 0.26f, 0.2f));
|
applyButton = UIFactory.CreateButton(horiGroup, "ApplyButton", "Apply", new Color(0.2f, 0.26f, 0.2f));
|
||||||
UIFactory.SetLayoutElement(m_applyButton.Component.gameObject, minHeight: 25, minWidth: 90);
|
UIFactory.SetLayoutElement(applyButton.Component.gameObject, minHeight: 25, minWidth: 90);
|
||||||
m_applyButton.OnClick += SetValueToOwner;
|
applyButton.OnClick += SetValueToOwner;
|
||||||
|
|
||||||
// image of color
|
// image of color
|
||||||
|
|
||||||
var imgObj = UIFactory.CreateUIObject("ColorImageHelper", horiGroup);
|
var imgObj = UIFactory.CreateUIObject("ColorImageHelper", horiGroup);
|
||||||
UIFactory.SetLayoutElement(imgObj, minHeight: 25, minWidth: 50, flexibleWidth: 50);
|
UIFactory.SetLayoutElement(imgObj, minHeight: 25, minWidth: 50, flexibleWidth: 50);
|
||||||
m_colorImage = imgObj.AddComponent<Image>();
|
colorImage = imgObj.AddComponent<Image>();
|
||||||
|
|
||||||
return UIRoot;
|
return UIRoot;
|
||||||
}
|
}
|
||||||
@ -190,11 +192,11 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
|
|
||||||
var input = UIFactory.CreateInputField(row, "Input", "...");
|
var input = UIFactory.CreateInputField(row, "Input", "...");
|
||||||
UIFactory.SetLayoutElement(input.UIRoot, minWidth: 40, minHeight: 25, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(input.UIRoot, minWidth: 40, minHeight: 25, flexibleHeight: 0);
|
||||||
m_inputs[index] = input;
|
inputs[index] = input;
|
||||||
input.OnValueChanged += (string val) => { OnInputChanged(val, index); };
|
input.OnValueChanged += (string val) => { OnInputChanged(val, index); };
|
||||||
|
|
||||||
var sliderObj = UIFactory.CreateSlider(row, "Slider", out Slider slider);
|
var sliderObj = UIFactory.CreateSlider(row, "Slider", out Slider slider);
|
||||||
m_sliders[index] = slider;
|
sliders[index] = slider;
|
||||||
UIFactory.SetLayoutElement(sliderObj, minHeight: 25, minWidth: 70, flexibleWidth: 999, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(sliderObj, minHeight: 25, minWidth: 70, flexibleWidth: 999, flexibleHeight: 0);
|
||||||
slider.minValue = 0;
|
slider.minValue = 0;
|
||||||
slider.maxValue = 1;
|
slider.maxValue = 1;
|
||||||
|
@ -14,6 +14,8 @@ using UnityExplorer.UI.Widgets;
|
|||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.IValues
|
namespace UnityExplorer.CacheObject.IValues
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,11 @@ using UnityEngine;
|
|||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.CacheObject;
|
using UnityExplorer.CacheObject;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.IValues
|
namespace UnityExplorer.CacheObject.IValues
|
||||||
{
|
{
|
||||||
@ -20,10 +24,10 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
|
|
||||||
public OrderedDictionary CurrentValues;
|
public OrderedDictionary CurrentValues;
|
||||||
|
|
||||||
public CachedEnumValue ValueAtIdx(int idx) => (CachedEnumValue)CurrentValues[idx];
|
private InputFieldRef inputField;
|
||||||
public CachedEnumValue ValueAtKey(object key) => (CachedEnumValue)CurrentValues[key];
|
private ButtonRef enumHelperButton;
|
||||||
|
private EnumCompleter enumCompleter;
|
||||||
|
|
||||||
private Dropdown enumDropdown;
|
|
||||||
private GameObject toggleHolder;
|
private GameObject toggleHolder;
|
||||||
private readonly List<Toggle> flagToggles = new List<Toggle>();
|
private readonly List<Toggle> flagToggles = new List<Toggle>();
|
||||||
private readonly List<Text> flagTexts = new List<Text>();
|
private readonly List<Text> flagTexts = new List<Text>();
|
||||||
@ -35,38 +39,68 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
|
|
||||||
if (lastType != EnumType)
|
if (lastType != EnumType)
|
||||||
{
|
{
|
||||||
CurrentValues = GetEnumValues(EnumType, out IsFlags);
|
CurrentValues = GetEnumValues(EnumType);
|
||||||
|
|
||||||
|
IsFlags = EnumType.GetCustomAttributes(typeof(FlagsAttribute), true) is object[] fa && fa.Any();
|
||||||
if (IsFlags)
|
if (IsFlags)
|
||||||
SetupTogglesForEnumType();
|
SetupTogglesForEnumType();
|
||||||
else
|
else
|
||||||
SetupDropdownForEnumType();
|
{
|
||||||
|
inputField.Component.gameObject.SetActive(true);
|
||||||
|
enumHelperButton.Component.gameObject.SetActive(true);
|
||||||
|
toggleHolder.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
enumCompleter.EnumType = EnumType;
|
||||||
|
enumCompleter.CacheEnumValues();
|
||||||
|
|
||||||
lastType = EnumType;
|
lastType = EnumType;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup ui for changes
|
if (!IsFlags)
|
||||||
if (IsFlags)
|
inputField.Text = value.ToString();
|
||||||
SetTogglesForValue(value);
|
|
||||||
else
|
else
|
||||||
SetDropdownForValue(value);
|
SetTogglesForValue(value);
|
||||||
|
|
||||||
|
this.enumCompleter.chosenSuggestion = value.ToString();
|
||||||
|
AutoCompleteModal.Instance.ReleaseOwnership(this.enumCompleter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetTogglesForValue(object value)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var split = value.ToString().Split(',');
|
||||||
|
var set = new HashSet<string>();
|
||||||
|
foreach (var s in split)
|
||||||
|
set.Add(s.Trim());
|
||||||
|
|
||||||
|
for (int i = 0; i < CurrentValues.Count; i++)
|
||||||
|
flagToggles[i].isOn = set.Contains(ValueAtIdx(i).Name);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("Exception setting flag toggles: " + ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setting value to owner
|
// Setting value to owner
|
||||||
|
|
||||||
private void OnApplyClicked()
|
private void OnApplyClicked()
|
||||||
{
|
|
||||||
if (IsFlags)
|
|
||||||
SetValueFromFlags();
|
|
||||||
else
|
|
||||||
SetValueFromDropdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetValueFromDropdown()
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
CurrentOwner.SetUserValue(ValueAtIdx(enumDropdown.value).ActualValue);
|
if (!IsFlags)
|
||||||
|
{
|
||||||
|
if (ParseUtility.TryParse(this.inputField.Text, EnumType, out object value, out Exception ex))
|
||||||
|
CurrentOwner.SetUserValue(value);
|
||||||
|
else
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetValueFromFlags();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -93,59 +127,53 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// setting UI state for value
|
// UI Construction
|
||||||
|
|
||||||
private void SetDropdownForValue(object value)
|
private void EnumHelper_OnClick()
|
||||||
{
|
{
|
||||||
if (CurrentValues.Contains(value))
|
enumCompleter.HelperButtonClicked();
|
||||||
{
|
|
||||||
var cached = ValueAtKey(value);
|
|
||||||
enumDropdown.value = cached.EnumIndex;
|
|
||||||
enumDropdown.RefreshShownValue();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ExplorerCore.LogWarning("CurrentValues does not contain key '" + value?.ToString() ?? "<null>" + "'");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetTogglesForValue(object value)
|
public override GameObject CreateContent(GameObject parent)
|
||||||
{
|
{
|
||||||
try
|
UIRoot = UIFactory.CreateVerticalGroup(parent, "InteractiveEnum", false, false, true, true, 3, new Vector4(4, 4, 4, 4),
|
||||||
{
|
new Color(0.06f, 0.06f, 0.06f));
|
||||||
var split = value.ToString().Split(',');
|
UIFactory.SetLayoutElement(UIRoot, minHeight: 25, flexibleHeight: 9999, flexibleWidth: 9999);
|
||||||
var set = new HashSet<string>();
|
|
||||||
foreach (var s in split)
|
|
||||||
set.Add(s.Trim());
|
|
||||||
|
|
||||||
for (int i = 0; i < CurrentValues.Count; i++)
|
var hori = UIFactory.CreateUIObject("Hori", UIRoot);
|
||||||
flagToggles[i].isOn = set.Contains(ValueAtIdx(i).Name);
|
UIFactory.SetLayoutElement(hori, minHeight: 25, flexibleWidth: 9999);
|
||||||
}
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(hori, false, false, true, true, 2);
|
||||||
catch (Exception ex)
|
|
||||||
{
|
var applyButton = UIFactory.CreateButton(hori, "ApplyButton", "Apply", new Color(0.2f, 0.27f, 0.2f));
|
||||||
ExplorerCore.LogWarning("Exception setting flag toggles: " + ex);
|
UIFactory.SetLayoutElement(applyButton.Component.gameObject, minHeight: 25, minWidth: 100);
|
||||||
}
|
applyButton.OnClick += OnApplyClicked;
|
||||||
|
|
||||||
|
inputField = UIFactory.CreateInputField(hori, "InputField", "Enter name or underlying value...");
|
||||||
|
UIFactory.SetLayoutElement(inputField.UIRoot, minHeight: 25, flexibleHeight: 50, minWidth: 100, flexibleWidth: 1000);
|
||||||
|
inputField.Component.lineType = InputField.LineType.MultiLineNewline;
|
||||||
|
inputField.UIRoot.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
enumHelperButton = UIFactory.CreateButton(hori, "EnumHelper", "▼");
|
||||||
|
UIFactory.SetLayoutElement(enumHelperButton.Component.gameObject, minWidth: 25, minHeight: 25, flexibleWidth: 0, flexibleHeight: 0);
|
||||||
|
enumHelperButton.OnClick += EnumHelper_OnClick;
|
||||||
|
|
||||||
|
enumCompleter = new EnumCompleter(this.EnumType, this.inputField);
|
||||||
|
|
||||||
|
toggleHolder = UIFactory.CreateUIObject("ToggleHolder", UIRoot);
|
||||||
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(toggleHolder, false, false, true, true, 4);
|
||||||
|
UIFactory.SetLayoutElement(toggleHolder, minHeight: 25, flexibleWidth: 9999, flexibleHeight: 9999);
|
||||||
|
|
||||||
|
return UIRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setting up the UI for the enum type when it changes or is first set
|
public CachedEnumValue ValueAtIdx(int idx) => (CachedEnumValue)CurrentValues[idx];
|
||||||
|
public CachedEnumValue ValueAtKey(object key) => (CachedEnumValue)CurrentValues[key];
|
||||||
private void SetupDropdownForEnumType()
|
|
||||||
{
|
|
||||||
toggleHolder.SetActive(false);
|
|
||||||
enumDropdown.gameObject.SetActive(true);
|
|
||||||
|
|
||||||
// create dropdown entries
|
|
||||||
enumDropdown.options.Clear();
|
|
||||||
|
|
||||||
foreach (CachedEnumValue entry in CurrentValues.Values)
|
|
||||||
enumDropdown.options.Add(new Dropdown.OptionData(entry.Name));
|
|
||||||
|
|
||||||
enumDropdown.value = 0;
|
|
||||||
enumDropdown.RefreshShownValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetupTogglesForEnumType()
|
private void SetupTogglesForEnumType()
|
||||||
{
|
{
|
||||||
toggleHolder.SetActive(true);
|
toggleHolder.SetActive(true);
|
||||||
enumDropdown.gameObject.SetActive(false);
|
inputField.Component.gameObject.SetActive(false);
|
||||||
|
enumHelperButton.Component.gameObject.SetActive(false);
|
||||||
|
|
||||||
// create / set / hide toggles
|
// create / set / hide toggles
|
||||||
for (int i = 0; i < CurrentValues.Count || i < flagToggles.Count; i++)
|
for (int i = 0; i < CurrentValues.Count || i < flagToggles.Count; i++)
|
||||||
@ -180,54 +208,13 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
flagTexts.Add(toggleText);
|
flagTexts.Add(toggleText);
|
||||||
}
|
}
|
||||||
|
|
||||||
// UI Construction
|
|
||||||
|
|
||||||
public override GameObject CreateContent(GameObject parent)
|
|
||||||
{
|
|
||||||
UIRoot = UIFactory.CreateVerticalGroup(parent, "InteractiveEnum", false, false, true, true, 3, new Vector4(4, 4, 4, 4),
|
|
||||||
new Color(0.06f, 0.06f, 0.06f));
|
|
||||||
UIFactory.SetLayoutElement(UIRoot, minHeight: 25, flexibleHeight: 9999, flexibleWidth: 9999);
|
|
||||||
|
|
||||||
var hori = UIFactory.CreateUIObject("Hori", UIRoot);
|
|
||||||
UIFactory.SetLayoutElement(hori, minHeight: 25, flexibleWidth: 9999);
|
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(hori, false, false, true, true, 2);
|
|
||||||
|
|
||||||
var applyButton = UIFactory.CreateButton(hori, "ApplyButton", "Apply", new Color(0.2f, 0.27f, 0.2f));
|
|
||||||
UIFactory.SetLayoutElement(applyButton.Component.gameObject, minHeight: 25, minWidth: 100);
|
|
||||||
applyButton.OnClick += OnApplyClicked;
|
|
||||||
|
|
||||||
var dropdownObj = UIFactory.CreateDropdown(hori, out enumDropdown, "not set", 14, null);
|
|
||||||
UIFactory.SetLayoutElement(dropdownObj, minHeight: 25, flexibleWidth: 600);
|
|
||||||
|
|
||||||
toggleHolder = UIFactory.CreateUIObject("ToggleHolder", UIRoot);
|
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(toggleHolder, false, false, true, true, 4);
|
|
||||||
UIFactory.SetLayoutElement(toggleHolder, minHeight: 25, flexibleWidth: 9999, flexibleHeight: 9999);
|
|
||||||
|
|
||||||
return UIRoot;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region Enum cache
|
#region Enum cache
|
||||||
|
|
||||||
public struct CachedEnumValue
|
|
||||||
{
|
|
||||||
public CachedEnumValue(object value, int index, string name)
|
|
||||||
{
|
|
||||||
EnumIndex = index;
|
|
||||||
Name = name;
|
|
||||||
ActualValue = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly object ActualValue;
|
|
||||||
public int EnumIndex;
|
|
||||||
public readonly string Name;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static readonly Dictionary<string, OrderedDictionary> enumCache = new Dictionary<string, OrderedDictionary>();
|
internal static readonly Dictionary<string, OrderedDictionary> enumCache = new Dictionary<string, OrderedDictionary>();
|
||||||
|
|
||||||
internal static OrderedDictionary GetEnumValues(Type enumType, out bool isFlags)
|
internal static OrderedDictionary GetEnumValues(Type enumType)
|
||||||
{
|
{
|
||||||
isFlags = enumType.GetCustomAttributes(typeof(FlagsAttribute), true) is object[] fa && fa.Any();
|
//isFlags = enumType.GetCustomAttributes(typeof(FlagsAttribute), true) is object[] fa && fa.Any();
|
||||||
|
|
||||||
if (!enumCache.ContainsKey(enumType.AssemblyQualifiedName))
|
if (!enumCache.ContainsKey(enumType.AssemblyQualifiedName))
|
||||||
{
|
{
|
||||||
@ -254,4 +241,18 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct CachedEnumValue
|
||||||
|
{
|
||||||
|
public CachedEnumValue(object value, int index, string name)
|
||||||
|
{
|
||||||
|
EnumIndex = index;
|
||||||
|
Name = name;
|
||||||
|
ActualValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly object ActualValue;
|
||||||
|
public int EnumIndex;
|
||||||
|
public readonly string Name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,8 @@ using UnityExplorer.UI.Widgets;
|
|||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.IValues
|
namespace UnityExplorer.CacheObject.IValues
|
||||||
{
|
{
|
||||||
@ -32,11 +34,13 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
private PropertyInfo genericIndexer;
|
private PropertyInfo genericIndexer;
|
||||||
|
|
||||||
public int ItemCount => cachedEntries.Count;
|
public int ItemCount => cachedEntries.Count;
|
||||||
private readonly List<CacheListEntry> cachedEntries = new List<CacheListEntry>();
|
private readonly List<CacheListEntry> cachedEntries = new();
|
||||||
|
|
||||||
public ScrollPool<CacheListEntryCell> ListScrollPool { get; private set; }
|
public ScrollPool<CacheListEntryCell> ListScrollPool { get; private set; }
|
||||||
|
|
||||||
public Text TopLabel;
|
public Text TopLabel;
|
||||||
|
private LayoutElement scrollLayout;
|
||||||
|
private Text NotSupportedLabel;
|
||||||
|
|
||||||
public override void OnBorrowed(CacheObjectBase owner)
|
public override void OnBorrowed(CacheObjectBase owner)
|
||||||
{
|
{
|
||||||
@ -65,6 +69,28 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
cachedEntries.Clear();
|
cachedEntries.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// List entry scroll pool
|
||||||
|
|
||||||
|
public override void SetLayout()
|
||||||
|
{
|
||||||
|
var minHeight = 5f;
|
||||||
|
|
||||||
|
foreach (var cell in ListScrollPool.CellPool)
|
||||||
|
{
|
||||||
|
if (cell.Enabled)
|
||||||
|
minHeight += cell.Rect.rect.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.scrollLayout.minHeight = Math.Min(InspectorPanel.CurrentPanelHeight - 400f, minHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCellBorrowed(CacheListEntryCell cell) { } // not needed
|
||||||
|
|
||||||
|
public void SetCell(CacheListEntryCell cell, int index)
|
||||||
|
{
|
||||||
|
CacheObjectControllerHelper.SetCell(cell, index, cachedEntries, null);
|
||||||
|
}
|
||||||
|
|
||||||
// Setting the List value itself to this model
|
// Setting the List value itself to this model
|
||||||
public override void SetValue(object value)
|
public override void SetValue(object value)
|
||||||
{
|
{
|
||||||
@ -212,32 +238,6 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// List entry scroll pool
|
|
||||||
|
|
||||||
public override void SetLayout()
|
|
||||||
{
|
|
||||||
var minHeight = 5f;
|
|
||||||
|
|
||||||
foreach (var cell in ListScrollPool.CellPool)
|
|
||||||
{
|
|
||||||
if (cell.Enabled)
|
|
||||||
minHeight += cell.Rect.rect.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.scrollLayout.minHeight = Math.Min(InspectorPanel.CurrentPanelHeight - 400f, minHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnCellBorrowed(CacheListEntryCell cell) { } // not needed
|
|
||||||
|
|
||||||
public void SetCell(CacheListEntryCell cell, int index)
|
|
||||||
{
|
|
||||||
CacheObjectControllerHelper.SetCell(cell, index, cachedEntries, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private LayoutElement scrollLayout;
|
|
||||||
|
|
||||||
private Text NotSupportedLabel;
|
|
||||||
|
|
||||||
public override GameObject CreateContent(GameObject parent)
|
public override GameObject CreateContent(GameObject parent)
|
||||||
{
|
{
|
||||||
UIRoot = UIFactory.CreateVerticalGroup(parent, "InteractiveList", true, true, true, true, 6, new Vector4(10, 3, 15, 4),
|
UIRoot = UIFactory.CreateVerticalGroup(parent, "InteractiveList", true, true, true, true, 6, new Vector4(10, 3, 15, 4),
|
||||||
|
@ -5,12 +5,14 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.CacheObject;
|
using UnityExplorer.CacheObject;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.IValues
|
namespace UnityExplorer.CacheObject.IValues
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,7 @@ using UnityExplorer.CacheObject;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.IValues
|
namespace UnityExplorer.CacheObject.IValues
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,8 @@ using UnityExplorer.CacheObject;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.IValues
|
namespace UnityExplorer.CacheObject.IValues
|
||||||
{
|
{
|
||||||
@ -55,7 +57,7 @@ namespace UnityExplorer.CacheObject.IValues
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly Dictionary<string, StructInfo> typeSupportCache = new Dictionary<string, StructInfo>();
|
private static readonly Dictionary<string, StructInfo> typeSupportCache = new();
|
||||||
|
|
||||||
private const BindingFlags INSTANCE_FLAGS = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
|
private const BindingFlags INSTANCE_FLAGS = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
|
||||||
private const string SYSTEM_VOID = "System.Void";
|
private const string SYSTEM_VOID = "System.Void";
|
||||||
|
@ -7,6 +7,7 @@ using UnityEngine.UI;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.Views
|
namespace UnityExplorer.CacheObject.Views
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,7 @@ using UnityExplorer.Inspectors;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.Views
|
namespace UnityExplorer.CacheObject.Views
|
||||||
{
|
{
|
||||||
|
@ -7,20 +7,17 @@ using UnityEngine.UI;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.Views
|
namespace UnityExplorer.CacheObject.Views
|
||||||
{
|
{
|
||||||
public class CacheMemberCell : CacheObjectCell
|
public class CacheMemberCell : CacheObjectCell
|
||||||
{
|
{
|
||||||
//public ReflectionInspector Owner { get; set; }
|
|
||||||
|
|
||||||
public CacheMember MemberOccupant => Occupant as CacheMember;
|
public CacheMember MemberOccupant => Occupant as CacheMember;
|
||||||
|
|
||||||
public GameObject EvaluateHolder;
|
public GameObject EvaluateHolder;
|
||||||
public ButtonRef EvaluateButton;
|
public ButtonRef EvaluateButton;
|
||||||
|
|
||||||
//public Toggle UpdateToggle;
|
|
||||||
|
|
||||||
protected virtual void EvaluateClicked()
|
protected virtual void EvaluateClicked()
|
||||||
{
|
{
|
||||||
this.MemberOccupant.OnEvaluateClicked();
|
this.MemberOccupant.OnEvaluateClicked();
|
||||||
@ -38,16 +35,5 @@ namespace UnityExplorer.CacheObject.Views
|
|||||||
UIFactory.SetLayoutElement(EvaluateButton.Component.gameObject, minWidth: 100, minHeight: 25);
|
UIFactory.SetLayoutElement(EvaluateButton.Component.gameObject, minWidth: 100, minHeight: 25);
|
||||||
EvaluateButton.OnClick += EvaluateClicked;
|
EvaluateButton.OnClick += EvaluateClicked;
|
||||||
}
|
}
|
||||||
|
|
||||||
//protected override void ConstructUpdateToggle(GameObject parent)
|
|
||||||
//{
|
|
||||||
// // Auto-update toggle
|
|
||||||
//
|
|
||||||
// var updateToggle = UIFactory.CreateToggle(parent, "AutoUpdate", out UpdateToggle, out Text autoText);
|
|
||||||
// UIFactory.SetLayoutElement(updateToggle, minHeight: 25, minWidth: 30, flexibleWidth: 0, flexibleHeight: 0);
|
|
||||||
// GameObject.Destroy(autoText);
|
|
||||||
// UpdateToggle.isOn = false;
|
|
||||||
// UpdateToggle.onValueChanged.AddListener((bool val) => { MemberOccupant.AutoUpdateWanted = val; });
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,12 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.CacheObject.IValues;
|
using UnityExplorer.UI.Panels;
|
||||||
using UnityExplorer.Inspectors;
|
|
||||||
using UnityExplorer.UI;
|
|
||||||
using UnityExplorer.UI.Widgets;
|
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.Views
|
namespace UnityExplorer.CacheObject.Views
|
||||||
{
|
{
|
||||||
@ -45,10 +44,12 @@ namespace UnityExplorer.CacheObject.Views
|
|||||||
public bool SubContentActive => SubContentHolder.activeSelf;
|
public bool SubContentActive => SubContentHolder.activeSelf;
|
||||||
|
|
||||||
public LayoutElement NameLayout;
|
public LayoutElement NameLayout;
|
||||||
|
public GameObject RightGroupContent;
|
||||||
public LayoutElement RightGroupLayout;
|
public LayoutElement RightGroupLayout;
|
||||||
|
public GameObject SubContentHolder;
|
||||||
|
|
||||||
public Text NameLabel;
|
public Text NameLabel;
|
||||||
public InputFieldRef HiddenNameLabel;
|
public InputFieldRef HiddenNameLabel; // for selecting the name label
|
||||||
public Text TypeLabel;
|
public Text TypeLabel;
|
||||||
public Text ValueLabel;
|
public Text ValueLabel;
|
||||||
public Toggle Toggle;
|
public Toggle Toggle;
|
||||||
@ -59,7 +60,11 @@ namespace UnityExplorer.CacheObject.Views
|
|||||||
public ButtonRef SubContentButton;
|
public ButtonRef SubContentButton;
|
||||||
public ButtonRef ApplyButton;
|
public ButtonRef ApplyButton;
|
||||||
|
|
||||||
public GameObject SubContentHolder;
|
public ButtonRef CopyButton;
|
||||||
|
public ButtonRef PasteButton;
|
||||||
|
|
||||||
|
public readonly Color subInactiveColor = new(0.23f, 0.23f, 0.23f);
|
||||||
|
public readonly Color subActiveColor = new(0.23f, 0.33f, 0.23f);
|
||||||
|
|
||||||
protected virtual void ApplyClicked()
|
protected virtual void ApplyClicked()
|
||||||
{
|
{
|
||||||
@ -81,26 +86,26 @@ namespace UnityExplorer.CacheObject.Views
|
|||||||
this.Occupant.OnCellSubContentToggle();
|
this.Occupant.OnCellSubContentToggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly Color subInactiveColor = new Color(0.23f, 0.23f, 0.23f);
|
protected virtual void OnCopyClicked()
|
||||||
public readonly Color subActiveColor = new Color(0.23f, 0.33f, 0.23f);
|
{
|
||||||
|
ClipboardPanel.Copy(this.Occupant.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void OnPasteClicked()
|
||||||
|
{
|
||||||
|
if (ClipboardPanel.TryPaste(this.Occupant.FallbackType, out object paste))
|
||||||
|
this.Occupant.SetUserValue(paste);
|
||||||
|
}
|
||||||
|
|
||||||
public void RefreshSubcontentButton()
|
public void RefreshSubcontentButton()
|
||||||
{
|
{
|
||||||
if (!this.SubContentHolder.activeSelf)
|
this.SubContentButton.ButtonText.text = SubContentHolder.activeSelf ? "▼" : "▲";
|
||||||
{
|
Color color = SubContentHolder.activeSelf ? subActiveColor : subInactiveColor;
|
||||||
this.SubContentButton.ButtonText.text = "▲";
|
RuntimeHelper.SetColorBlock(SubContentButton.Component, color, color * 1.3f);
|
||||||
RuntimeProvider.Instance.SetColorBlock(SubContentButton.Component, subInactiveColor, subInactiveColor * 1.3f);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.SubContentButton.ButtonText.text = "▼";
|
|
||||||
RuntimeProvider.Instance.SetColorBlock(SubContentButton.Component, subActiveColor, subActiveColor * 1.3f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void ConstructEvaluateHolder(GameObject parent);
|
protected abstract void ConstructEvaluateHolder(GameObject parent);
|
||||||
|
|
||||||
|
|
||||||
public virtual GameObject CreateContent(GameObject parent)
|
public virtual GameObject CreateContent(GameObject parent)
|
||||||
{
|
{
|
||||||
// Main layout
|
// Main layout
|
||||||
@ -136,16 +141,16 @@ namespace UnityExplorer.CacheObject.Views
|
|||||||
|
|
||||||
// Right vertical group
|
// Right vertical group
|
||||||
|
|
||||||
var rightGroupHolder = UIFactory.CreateUIObject("RightGroup", horiRow);
|
RightGroupContent = UIFactory.CreateUIObject("RightGroup", horiRow);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(rightGroupHolder, false, false, true, true, 4, childAlignment: TextAnchor.UpperLeft);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(RightGroupContent, false, false, true, true, 4, childAlignment: TextAnchor.UpperLeft);
|
||||||
UIFactory.SetLayoutElement(rightGroupHolder, minHeight: 25, minWidth: 200, flexibleWidth: 9999, flexibleHeight: 800);
|
UIFactory.SetLayoutElement(RightGroupContent, minHeight: 25, minWidth: 200, flexibleWidth: 9999, flexibleHeight: 800);
|
||||||
RightGroupLayout = rightGroupHolder.GetComponent<LayoutElement>();
|
RightGroupLayout = RightGroupContent.GetComponent<LayoutElement>();
|
||||||
|
|
||||||
ConstructEvaluateHolder(rightGroupHolder);
|
ConstructEvaluateHolder(RightGroupContent);
|
||||||
|
|
||||||
// Right horizontal group
|
// Right horizontal group
|
||||||
|
|
||||||
var rightHoriGroup = UIFactory.CreateUIObject("RightHoriGroup", rightGroupHolder);
|
var rightHoriGroup = UIFactory.CreateUIObject("RightHoriGroup", RightGroupContent);
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(rightHoriGroup, false, false, true, true, 4, childAlignment: TextAnchor.UpperLeft);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(rightHoriGroup, false, false, true, true, 4, childAlignment: TextAnchor.UpperLeft);
|
||||||
UIFactory.SetLayoutElement(rightHoriGroup, minHeight: 25, minWidth: 200, flexibleWidth: 9999, flexibleHeight: 800);
|
UIFactory.SetLayoutElement(rightHoriGroup, minHeight: 25, minWidth: 200, flexibleWidth: 9999, flexibleHeight: 800);
|
||||||
|
|
||||||
@ -157,7 +162,7 @@ namespace UnityExplorer.CacheObject.Views
|
|||||||
|
|
||||||
TypeLabel = UIFactory.CreateLabel(rightHoriGroup, "ReturnLabel", "<notset>", TextAnchor.MiddleLeft);
|
TypeLabel = UIFactory.CreateLabel(rightHoriGroup, "ReturnLabel", "<notset>", TextAnchor.MiddleLeft);
|
||||||
TypeLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
|
TypeLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
|
||||||
UIFactory.SetLayoutElement(TypeLabel.gameObject, minHeight: 25, flexibleHeight: 150, minWidth: 60, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(TypeLabel.gameObject, minHeight: 25, flexibleHeight: 150, minWidth: 45, flexibleWidth: 0);
|
||||||
|
|
||||||
// Bool and number value interaction
|
// Bool and number value interaction
|
||||||
|
|
||||||
@ -187,6 +192,24 @@ namespace UnityExplorer.CacheObject.Views
|
|||||||
ValueLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
|
ValueLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
|
||||||
UIFactory.SetLayoutElement(ValueLabel.gameObject, minHeight: 25, flexibleHeight: 150, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(ValueLabel.gameObject, minHeight: 25, flexibleHeight: 150, flexibleWidth: 9999);
|
||||||
|
|
||||||
|
// Copy and Paste buttons
|
||||||
|
|
||||||
|
var buttonHolder = UIFactory.CreateHorizontalGroup(rightHoriGroup, "CopyPasteButtons", false, false, true, true, 4,
|
||||||
|
bgColor: new(1,1,1,0), childAlignment: TextAnchor.MiddleLeft);
|
||||||
|
UIFactory.SetLayoutElement(buttonHolder, minWidth: 60, flexibleWidth: 0);
|
||||||
|
|
||||||
|
CopyButton = UIFactory.CreateButton(buttonHolder, "CopyButton", "Copy", new Color(0.13f, 0.13f, 0.13f, 1f));
|
||||||
|
UIFactory.SetLayoutElement(CopyButton.Component.gameObject, minHeight: 25, minWidth: 28, flexibleWidth: 0);
|
||||||
|
CopyButton.ButtonText.color = Color.yellow;
|
||||||
|
CopyButton.ButtonText.fontSize = 10;
|
||||||
|
CopyButton.OnClick += OnCopyClicked;
|
||||||
|
|
||||||
|
PasteButton = UIFactory.CreateButton(buttonHolder, "PasteButton", "Paste", new Color(0.13f, 0.13f, 0.13f, 1f));
|
||||||
|
UIFactory.SetLayoutElement(PasteButton.Component.gameObject, minHeight: 25, minWidth: 28, flexibleWidth: 0);
|
||||||
|
PasteButton.ButtonText.color = Color.green;
|
||||||
|
PasteButton.ButtonText.fontSize = 10;
|
||||||
|
PasteButton.OnClick += OnPasteClicked;
|
||||||
|
|
||||||
// Subcontent
|
// Subcontent
|
||||||
|
|
||||||
SubContentHolder = UIFactory.CreateUIObject("SubContent", UIRoot);
|
SubContentHolder = UIFactory.CreateUIObject("SubContent", UIRoot);
|
||||||
|
@ -1,289 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.UI;
|
|
||||||
using UnityExplorer.UI;
|
|
||||||
using UniverseLib.UI.Models;
|
|
||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
|
||||||
using UniverseLib.UI;
|
|
||||||
using UniverseLib;
|
|
||||||
|
|
||||||
namespace UnityExplorer.CacheObject.Views
|
|
||||||
{
|
|
||||||
public class EvaluateWidget : IPooledObject
|
|
||||||
{
|
|
||||||
public CacheMember Owner { get; set; }
|
|
||||||
|
|
||||||
public GameObject UIRoot { get; set; }
|
|
||||||
public float DefaultHeight => -1f;
|
|
||||||
|
|
||||||
private ParameterInfo[] arguments;
|
|
||||||
private string[] argumentInput;
|
|
||||||
|
|
||||||
private GameObject argHolder;
|
|
||||||
private readonly List<GameObject> argRows = new List<GameObject>();
|
|
||||||
private readonly List<Text> argLabels = new List<Text>();
|
|
||||||
|
|
||||||
private Type[] genericArguments;
|
|
||||||
private string[] genericInput;
|
|
||||||
|
|
||||||
private GameObject genericArgHolder;
|
|
||||||
private readonly List<GameObject> genericArgRows = new List<GameObject>();
|
|
||||||
private readonly List<Text> genericArgLabels = new List<Text>();
|
|
||||||
private readonly List<TypeCompleter> genericAutocompleters = new List<TypeCompleter>();
|
|
||||||
|
|
||||||
//private readonly List<InputFieldRef> inputFields = new List<InputFieldRef>();
|
|
||||||
private readonly List<InputFieldRef> argInputFields = new List<InputFieldRef>();
|
|
||||||
private readonly List<InputFieldRef> genericInputFields = new List<InputFieldRef>();
|
|
||||||
|
|
||||||
public void OnBorrowedFromPool(CacheMember owner)
|
|
||||||
{
|
|
||||||
this.Owner = owner;
|
|
||||||
|
|
||||||
arguments = owner.Arguments;
|
|
||||||
argumentInput = new string[arguments.Length];
|
|
||||||
|
|
||||||
genericArguments = owner.GenericArguments;
|
|
||||||
genericInput = new string[genericArguments.Length];
|
|
||||||
|
|
||||||
SetArgRows();
|
|
||||||
|
|
||||||
this.UIRoot.SetActive(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnReturnToPool()
|
|
||||||
{
|
|
||||||
foreach (var input in argInputFields)
|
|
||||||
input.Text = "";
|
|
||||||
foreach (var input in genericInputFields)
|
|
||||||
input.Text = "";
|
|
||||||
|
|
||||||
this.Owner = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Type[] TryParseGenericArguments()
|
|
||||||
{
|
|
||||||
Type[] outArgs = new Type[genericArguments.Length];
|
|
||||||
|
|
||||||
for (int i = 0; i < genericArguments.Length; i++)
|
|
||||||
{
|
|
||||||
outArgs[i] = ReflectionUtility.GetTypeByName(genericInput[i])
|
|
||||||
?? throw new Exception($"Could not find any type by name '{genericInput[i]}'!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return outArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public object[] TryParseArguments()
|
|
||||||
{
|
|
||||||
object[] outArgs = new object[arguments.Length];
|
|
||||||
|
|
||||||
for (int i = 0; i < arguments.Length; i++)
|
|
||||||
{
|
|
||||||
var arg = arguments[i];
|
|
||||||
var input = argumentInput[i];
|
|
||||||
|
|
||||||
var type = arg.ParameterType;
|
|
||||||
if (type.IsByRef)
|
|
||||||
type = type.GetElementType();
|
|
||||||
|
|
||||||
if (type == typeof(string))
|
|
||||||
{
|
|
||||||
outArgs[i] = input;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(input))
|
|
||||||
{
|
|
||||||
if (arg.IsOptional)
|
|
||||||
outArgs[i] = arg.DefaultValue;
|
|
||||||
else
|
|
||||||
outArgs[i] = null;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ParseUtility.TryParse(input, type, out outArgs[i], out Exception ex))
|
|
||||||
{
|
|
||||||
outArgs[i] = null;
|
|
||||||
ExplorerCore.LogWarning($"Cannot parse argument '{arg.Name}' ({arg.ParameterType.Name})" +
|
|
||||||
$"{(ex == null ? "" : $", {ex.GetType().Name}: {ex.Message}")}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return outArgs;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetArgRows()
|
|
||||||
{
|
|
||||||
if (genericArguments.Any())
|
|
||||||
{
|
|
||||||
genericArgHolder.SetActive(true);
|
|
||||||
SetGenericRows();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
genericArgHolder.SetActive(false);
|
|
||||||
|
|
||||||
if (arguments.Any())
|
|
||||||
{
|
|
||||||
argHolder.SetActive(true);
|
|
||||||
SetNormalArgRows();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
argHolder.SetActive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetGenericRows()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < genericArguments.Length || i < genericArgRows.Count; i++)
|
|
||||||
{
|
|
||||||
if (i >= genericArguments.Length)
|
|
||||||
{
|
|
||||||
if (i >= genericArgRows.Count)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
// exceeded actual args, but still iterating so there must be views left, disable them
|
|
||||||
genericArgRows[i].SetActive(false);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var arg = genericArguments[i];
|
|
||||||
|
|
||||||
if (i >= genericArgRows.Count)
|
|
||||||
AddArgRow(i, true);
|
|
||||||
|
|
||||||
genericArgRows[i].SetActive(true);
|
|
||||||
|
|
||||||
var autoCompleter = genericAutocompleters[i];
|
|
||||||
autoCompleter.BaseType = arg;
|
|
||||||
autoCompleter.CacheTypes();
|
|
||||||
|
|
||||||
var constraints = arg.GetGenericParameterConstraints();
|
|
||||||
autoCompleter.GenericConstraints = constraints;
|
|
||||||
|
|
||||||
var sb = new StringBuilder($"<color={SignatureHighlighter.CONST}>{arg.Name}</color>");
|
|
||||||
|
|
||||||
for (int j = 0; j < constraints.Length; j++)
|
|
||||||
{
|
|
||||||
if (j == 0) sb.Append(' ').Append('(');
|
|
||||||
else sb.Append(',').Append(' ');
|
|
||||||
|
|
||||||
sb.Append(SignatureHighlighter.Parse(constraints[j], false));
|
|
||||||
|
|
||||||
if (j + 1 == constraints.Length)
|
|
||||||
sb.Append(')');
|
|
||||||
}
|
|
||||||
|
|
||||||
genericArgLabels[i].text = sb.ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetNormalArgRows()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < arguments.Length || i < argRows.Count; i++)
|
|
||||||
{
|
|
||||||
if (i >= arguments.Length)
|
|
||||||
{
|
|
||||||
if (i >= argRows.Count)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
// exceeded actual args, but still iterating so there must be views left, disable them
|
|
||||||
argRows[i].SetActive(false);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var arg = arguments[i];
|
|
||||||
|
|
||||||
|
|
||||||
if (i >= argRows.Count)
|
|
||||||
AddArgRow(i, false);
|
|
||||||
|
|
||||||
argRows[i].SetActive(true);
|
|
||||||
argLabels[i].text = $"{SignatureHighlighter.Parse(arg.ParameterType, false)} <color={SignatureHighlighter.LOCAL_ARG}>{arg.Name}</color>";
|
|
||||||
if (arg.ParameterType == typeof(string))
|
|
||||||
argInputFields[i].PlaceholderText.text = "";
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var elemType = arg.ParameterType;
|
|
||||||
if (elemType.IsByRef)
|
|
||||||
elemType = elemType.GetElementType();
|
|
||||||
argInputFields[i].PlaceholderText.text = $"eg. {ParseUtility.GetExampleInput(elemType)}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddArgRow(int index, bool generic)
|
|
||||||
{
|
|
||||||
if (!generic)
|
|
||||||
AddArgRow(index, argHolder, argRows, argLabels, argumentInput, false);
|
|
||||||
else
|
|
||||||
AddArgRow(index, genericArgHolder, genericArgRows, genericArgLabels, genericInput, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddArgRow(int index, GameObject parent, List<GameObject> objectList, List<Text> labelList, string[] inputArray, bool generic)
|
|
||||||
{
|
|
||||||
var horiGroup = UIFactory.CreateUIObject("ArgRow_" + index, parent);
|
|
||||||
UIFactory.SetLayoutElement(horiGroup, minHeight: 25, flexibleHeight: 50, minWidth: 50, flexibleWidth: 9999);
|
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(horiGroup, false, false, true, true, 5);
|
|
||||||
horiGroup.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
objectList.Add(horiGroup);
|
|
||||||
|
|
||||||
var label = UIFactory.CreateLabel(horiGroup, "ArgLabel", "not set", TextAnchor.MiddleLeft);
|
|
||||||
UIFactory.SetLayoutElement(label.gameObject, minWidth: 40, flexibleWidth: 90, minHeight: 25, flexibleHeight: 50);
|
|
||||||
labelList.Add(label);
|
|
||||||
label.horizontalOverflow = HorizontalWrapMode.Wrap;
|
|
||||||
|
|
||||||
var inputField = UIFactory.CreateInputField(horiGroup, "InputField", "...");
|
|
||||||
UIFactory.SetLayoutElement(inputField.UIRoot, minHeight: 25, flexibleHeight: 50, minWidth: 100, flexibleWidth: 1000);
|
|
||||||
inputField.Component.lineType = InputField.LineType.MultiLineNewline;
|
|
||||||
inputField.UIRoot.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
inputField.OnValueChanged += (string val) => { inputArray[index] = val; };
|
|
||||||
|
|
||||||
if (!generic)
|
|
||||||
argInputFields.Add(inputField);
|
|
||||||
else
|
|
||||||
genericInputFields.Add(inputField);
|
|
||||||
|
|
||||||
if (generic)
|
|
||||||
genericAutocompleters.Add(new TypeCompleter(null, inputField));
|
|
||||||
}
|
|
||||||
|
|
||||||
public GameObject CreateContent(GameObject parent)
|
|
||||||
{
|
|
||||||
UIRoot = UIFactory.CreateVerticalGroup(parent, "EvaluateWidget", false, false, true, true, 3, new Vector4(2, 2, 2, 2),
|
|
||||||
new Color(0.15f, 0.15f, 0.15f));
|
|
||||||
UIFactory.SetLayoutElement(UIRoot, minWidth: 50, flexibleWidth: 9999, minHeight: 50, flexibleHeight: 800);
|
|
||||||
//UIRoot.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
|
|
||||||
// generic args
|
|
||||||
this.genericArgHolder = UIFactory.CreateUIObject("GenericHolder", UIRoot);
|
|
||||||
UIFactory.SetLayoutElement(genericArgHolder, flexibleWidth: 1000);
|
|
||||||
var genericsTitle = UIFactory.CreateLabel(genericArgHolder, "GenericsTitle", "Generic Arguments", TextAnchor.MiddleLeft);
|
|
||||||
UIFactory.SetLayoutElement(genericsTitle.gameObject, minHeight: 25, flexibleWidth: 1000);
|
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(genericArgHolder, false, false, true, true, 3);
|
|
||||||
UIFactory.SetLayoutElement(genericArgHolder, minHeight: 25, flexibleHeight: 750, minWidth: 50, flexibleWidth: 9999);
|
|
||||||
//genericArgHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
|
|
||||||
// args
|
|
||||||
this.argHolder = UIFactory.CreateUIObject("ArgHolder", UIRoot);
|
|
||||||
UIFactory.SetLayoutElement(argHolder, flexibleWidth: 1000);
|
|
||||||
var argsTitle = UIFactory.CreateLabel(argHolder, "ArgsTitle", "Arguments", TextAnchor.MiddleLeft);
|
|
||||||
UIFactory.SetLayoutElement(argsTitle.gameObject, minHeight: 25, flexibleWidth: 1000);
|
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(argHolder, false, false, true, true, 3);
|
|
||||||
UIFactory.SetLayoutElement(argHolder, minHeight: 25, flexibleHeight: 750, minWidth: 50, flexibleWidth: 9999);
|
|
||||||
//argHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
|
|
||||||
// evaluate button
|
|
||||||
var evalButton = UIFactory.CreateButton(UIRoot, "EvaluateButton", "Evaluate", new Color(0.2f, 0.2f, 0.2f));
|
|
||||||
UIFactory.SetLayoutElement(evalButton.Component.gameObject, minHeight: 25, minWidth: 150, flexibleWidth: 0);
|
|
||||||
evalButton.OnClick += () =>
|
|
||||||
{
|
|
||||||
Owner.EvaluateAndSetCell();
|
|
||||||
};
|
|
||||||
|
|
||||||
return UIRoot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Config
|
namespace UnityExplorer.Config
|
||||||
{
|
{
|
||||||
public class ConfigElement<T> : IConfigElement
|
public class ConfigElement<T> : IConfigElement
|
||||||
{
|
{
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Config
|
namespace UnityExplorer.Config
|
||||||
{
|
{
|
||||||
public abstract class ConfigHandler
|
public abstract class ConfigHandler
|
||||||
{
|
{
|
@ -8,15 +8,20 @@ using System.Text;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Config
|
namespace UnityExplorer.Config
|
||||||
{
|
{
|
||||||
public static class ConfigManager
|
public static class ConfigManager
|
||||||
{
|
{
|
||||||
|
internal static readonly Dictionary<string, IConfigElement> ConfigElements = new();
|
||||||
|
internal static readonly Dictionary<string, IConfigElement> InternalConfigs = new();
|
||||||
|
|
||||||
// Each Mod Loader has its own ConfigHandler.
|
// Each Mod Loader has its own ConfigHandler.
|
||||||
// See the UnityExplorer.Loader namespace for the implementations.
|
// See the UnityExplorer.Loader namespace for the implementations.
|
||||||
public static ConfigHandler Handler { get; private set; }
|
public static ConfigHandler Handler { get; private set; }
|
||||||
|
|
||||||
|
// Actual UE Settings
|
||||||
public static ConfigElement<KeyCode> Master_Toggle;
|
public static ConfigElement<KeyCode> Master_Toggle;
|
||||||
|
public static ConfigElement<int> Target_Display;
|
||||||
public static ConfigElement<UIManager.VerticalAnchor> Main_Navbar_Anchor;
|
public static ConfigElement<UIManager.VerticalAnchor> Main_Navbar_Anchor;
|
||||||
public static ConfigElement<bool> Force_Unlock_Mouse;
|
public static ConfigElement<bool> Force_Unlock_Mouse;
|
||||||
public static ConfigElement<KeyCode> Force_Unlock_Toggle;
|
public static ConfigElement<KeyCode> Force_Unlock_Toggle;
|
||||||
@ -26,21 +31,18 @@ namespace UnityExplorer.Core.Config
|
|||||||
public static ConfigElement<bool> Log_Unity_Debug;
|
public static ConfigElement<bool> Log_Unity_Debug;
|
||||||
public static ConfigElement<bool> Hide_On_Startup;
|
public static ConfigElement<bool> Hide_On_Startup;
|
||||||
public static ConfigElement<float> Startup_Delay_Time;
|
public static ConfigElement<float> Startup_Delay_Time;
|
||||||
|
|
||||||
public static ConfigElement<string> Reflection_Signature_Blacklist;
|
public static ConfigElement<string> Reflection_Signature_Blacklist;
|
||||||
|
|
||||||
// internal configs
|
// internal configs
|
||||||
internal static InternalConfigHandler InternalHandler { get; private set; }
|
internal static InternalConfigHandler InternalHandler { get; private set; }
|
||||||
|
internal static readonly Dictionary<UIManager.Panels, ConfigElement<string>> PanelSaveData = new();
|
||||||
|
|
||||||
public static ConfigElement<string> ObjectExplorerData;
|
internal static ConfigElement<string> GetPanelSaveData(UIManager.Panels panel)
|
||||||
public static ConfigElement<string> InspectorData;
|
{
|
||||||
public static ConfigElement<string> CSConsoleData;
|
if (!PanelSaveData.ContainsKey(panel))
|
||||||
public static ConfigElement<string> OptionsPanelData;
|
PanelSaveData.Add(panel, new ConfigElement<string>(panel.ToString(), string.Empty, string.Empty, true));
|
||||||
public static ConfigElement<string> ConsoleLogData;
|
return PanelSaveData[panel];
|
||||||
public static ConfigElement<string> HookManagerData;
|
}
|
||||||
|
|
||||||
internal static readonly Dictionary<string, IConfigElement> ConfigElements = new Dictionary<string, IConfigElement>();
|
|
||||||
internal static readonly Dictionary<string, IConfigElement> InternalConfigs = new Dictionary<string, IConfigElement>();
|
|
||||||
|
|
||||||
public static void Init(ConfigHandler configHandler)
|
public static void Init(ConfigHandler configHandler)
|
||||||
{
|
{
|
||||||
@ -78,6 +80,11 @@ namespace UnityExplorer.Core.Config
|
|||||||
"The key to enable or disable UnityExplorer's menu and features.",
|
"The key to enable or disable UnityExplorer's menu and features.",
|
||||||
KeyCode.F7);
|
KeyCode.F7);
|
||||||
|
|
||||||
|
Target_Display = new ConfigElement<int>("Target Display",
|
||||||
|
"The monitor index for UnityExplorer to use, if you have multiple. 0 is the default display, 1 is secondary, etc. " +
|
||||||
|
"Restart recommended when changing this setting. Make sure your extra monitors are the same resolution as your primary monitor.",
|
||||||
|
0);
|
||||||
|
|
||||||
Main_Navbar_Anchor = new ConfigElement<UIManager.VerticalAnchor>("Main Navbar Anchor",
|
Main_Navbar_Anchor = new ConfigElement<UIManager.VerticalAnchor>("Main Navbar Anchor",
|
||||||
"The vertical anchor of the main UnityExplorer Navbar, in case you want to move it.",
|
"The vertical anchor of the main UnityExplorer Navbar, in case you want to move it.",
|
||||||
UIManager.VerticalAnchor.Top);
|
UIManager.VerticalAnchor.Top);
|
||||||
@ -123,15 +130,6 @@ namespace UnityExplorer.Core.Config
|
|||||||
"Seperate signatures with a semicolon ';'.\r\n" +
|
"Seperate signatures with a semicolon ';'.\r\n" +
|
||||||
"For example, to blacklist Camera.main, you would add 'UnityEngine.Camera.main;'",
|
"For example, to blacklist Camera.main, you would add 'UnityEngine.Camera.main;'",
|
||||||
"");
|
"");
|
||||||
|
|
||||||
// Internal configs (panel save data)
|
|
||||||
|
|
||||||
ObjectExplorerData = new ConfigElement<string>("ObjectExplorer", "", "", true);
|
|
||||||
InspectorData = new ConfigElement<string>("Inspector", "", "", true);
|
|
||||||
CSConsoleData = new ConfigElement<string>("CSConsole", "", "", true);
|
|
||||||
OptionsPanelData = new ConfigElement<string>("OptionsPanel", "", "", true);
|
|
||||||
ConsoleLogData = new ConfigElement<string>("ConsoleLog", "", "", true);
|
|
||||||
HookManagerData = new ConfigElement<string>("HookManager", "", "", true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Config
|
namespace UnityExplorer.Config
|
||||||
{
|
{
|
||||||
public interface IConfigElement
|
public interface IConfigElement
|
||||||
{
|
{
|
79
src/Config/InternalConfigHandler.cs
Normal file
79
src/Config/InternalConfigHandler.cs
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityExplorer.UI;
|
||||||
|
using Tomlet;
|
||||||
|
using Tomlet.Models;
|
||||||
|
|
||||||
|
namespace UnityExplorer.Config
|
||||||
|
{
|
||||||
|
public class InternalConfigHandler : ConfigHandler
|
||||||
|
{
|
||||||
|
internal static string CONFIG_PATH;
|
||||||
|
|
||||||
|
public override void Init()
|
||||||
|
{
|
||||||
|
CONFIG_PATH = Path.Combine(ExplorerCore.Loader.ExplorerFolder, "data.cfg");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void LoadConfig()
|
||||||
|
{
|
||||||
|
if (!TryLoadConfig())
|
||||||
|
SaveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RegisterConfigElement<T>(ConfigElement<T> element)
|
||||||
|
{
|
||||||
|
// Not necessary
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetConfigValue<T>(ConfigElement<T> element, T value)
|
||||||
|
{
|
||||||
|
// Not necessary
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not necessary, just return the value.
|
||||||
|
public override T GetConfigValue<T>(ConfigElement<T> element) => element.Value;
|
||||||
|
|
||||||
|
// Always just auto-save.
|
||||||
|
public override void OnAnyConfigChanged() => SaveConfig();
|
||||||
|
|
||||||
|
public bool TryLoadConfig()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!File.Exists(CONFIG_PATH))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
TomlDocument document = TomlParser.ParseFile(CONFIG_PATH);
|
||||||
|
foreach (var key in document.Keys)
|
||||||
|
{
|
||||||
|
var panelKey = (UIManager.Panels)Enum.Parse(typeof(UIManager.Panels), key);
|
||||||
|
ConfigManager.GetPanelSaveData(panelKey).Value = document.GetString(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("Error loading internal data: " + ex.ToString());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SaveConfig()
|
||||||
|
{
|
||||||
|
if (UIManager.Initializing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var tomlDocument = TomlDocument.CreateEmpty();
|
||||||
|
foreach (var entry in ConfigManager.InternalConfigs)
|
||||||
|
tomlDocument.Put(entry.Key, entry.Value.BoxedValue as string, false);
|
||||||
|
|
||||||
|
File.WriteAllText(CONFIG_PATH, tomlDocument.SerializedValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,105 +0,0 @@
|
|||||||
using IniParser.Parser;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityExplorer.UI;
|
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Config
|
|
||||||
{
|
|
||||||
public class InternalConfigHandler : ConfigHandler
|
|
||||||
{
|
|
||||||
internal static IniDataParser _parser;
|
|
||||||
internal static string INI_PATH;
|
|
||||||
|
|
||||||
public override void Init()
|
|
||||||
{
|
|
||||||
INI_PATH = Path.Combine(ExplorerCore.Loader.ExplorerFolder, "data.ini");
|
|
||||||
_parser = new IniDataParser();
|
|
||||||
_parser.Configuration.CommentString = "#";
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LoadConfig()
|
|
||||||
{
|
|
||||||
if (!TryLoadConfig())
|
|
||||||
SaveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void RegisterConfigElement<T>(ConfigElement<T> element)
|
|
||||||
{
|
|
||||||
// Not necessary
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SetConfigValue<T>(ConfigElement<T> element, T value)
|
|
||||||
{
|
|
||||||
// Not necessary
|
|
||||||
}
|
|
||||||
|
|
||||||
public override T GetConfigValue<T>(ConfigElement<T> element)
|
|
||||||
{
|
|
||||||
// Not necessary, just return the value.
|
|
||||||
return element.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnAnyConfigChanged()
|
|
||||||
{
|
|
||||||
SaveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TryLoadConfig()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!File.Exists(INI_PATH))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
string ini = File.ReadAllText(INI_PATH);
|
|
||||||
|
|
||||||
var data = _parser.Parse(ini);
|
|
||||||
|
|
||||||
foreach (var config in data.Sections["Config"])
|
|
||||||
{
|
|
||||||
if (ConfigManager.InternalConfigs.TryGetValue(config.KeyName, out IConfigElement configElement))
|
|
||||||
configElement.BoxedValue = StringToConfigValue(config.Value, configElement.ElementType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ExplorerCore.LogWarning("Error loading internal data: " + ex.ToString());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void SaveConfig()
|
|
||||||
{
|
|
||||||
if (UIManager.Initializing)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var data = new IniParser.Model.IniData();
|
|
||||||
|
|
||||||
data.Sections.AddSection("Config");
|
|
||||||
var sec = data.Sections["Config"];
|
|
||||||
|
|
||||||
foreach (var entry in ConfigManager.InternalConfigs)
|
|
||||||
sec.AddKey(entry.Key, entry.Value.BoxedValue.ToString());
|
|
||||||
|
|
||||||
File.WriteAllText(INI_PATH, data.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
public object StringToConfigValue(string value, Type elementType)
|
|
||||||
{
|
|
||||||
if (elementType.IsEnum)
|
|
||||||
return Enum.Parse(elementType, value);
|
|
||||||
else if (elementType == typeof(bool))
|
|
||||||
return bool.Parse(value);
|
|
||||||
else if (elementType == typeof(int))
|
|
||||||
return int.Parse(value);
|
|
||||||
else
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,19 +4,20 @@ using System.Collections.Generic;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.ObjectExplorer;
|
using UnityExplorer.ObjectExplorer;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
|
||||||
namespace UnityExplorer
|
namespace UnityExplorer
|
||||||
{
|
{
|
||||||
public static class ExplorerCore
|
public static class ExplorerCore
|
||||||
{
|
{
|
||||||
public const string NAME = "UnityExplorer";
|
public const string NAME = "UnityExplorer";
|
||||||
public const string VERSION = "4.4.2";
|
public const string VERSION = "4.5.4";
|
||||||
public const string AUTHOR = "Sinai";
|
public const string AUTHOR = "Sinai";
|
||||||
public const string GUID = "com.sinai.unityexplorer";
|
public const string GUID = "com.sinai.unityexplorer";
|
||||||
|
|
||||||
@ -42,17 +43,15 @@ namespace UnityExplorer
|
|||||||
Directory.CreateDirectory(Loader.ExplorerFolder);
|
Directory.CreateDirectory(Loader.ExplorerFolder);
|
||||||
|
|
||||||
ConfigManager.Init(Loader.ConfigHandler);
|
ConfigManager.Init(Loader.ConfigHandler);
|
||||||
RuntimeHelper.Init();
|
UERuntimeHelper.Init();
|
||||||
ExplorerBehaviour.Setup();
|
ExplorerBehaviour.Setup();
|
||||||
|
|
||||||
UniverseLib.Universe.Init(ConfigManager.Startup_Delay_Time.Value, LateInit, Log, new UniverseLib.Config.UUConfig
|
UniverseLib.Universe.Init(ConfigManager.Startup_Delay_Time.Value, LateInit, Log, new()
|
||||||
{
|
{
|
||||||
Disable_EventSystem_Override = ConfigManager.Disable_EventSystem_Override.Value,
|
Disable_EventSystem_Override = ConfigManager.Disable_EventSystem_Override.Value,
|
||||||
Force_Unlock_Mouse = ConfigManager.Force_Unlock_Mouse.Value,
|
Force_Unlock_Mouse = ConfigManager.Force_Unlock_Mouse.Value,
|
||||||
Unhollowed_Modules_Folder = loader.UnhollowedModulesFolder
|
Unhollowed_Modules_Folder = loader.UnhollowedModulesFolder
|
||||||
});
|
});
|
||||||
|
|
||||||
Log($"Finished core setup, waiting for late setup...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do a delayed setup so that objects aren't destroyed instantly.
|
// Do a delayed setup so that objects aren't destroyed instantly.
|
||||||
@ -69,6 +68,8 @@ namespace UnityExplorer
|
|||||||
UIManager.InitUI();
|
UIManager.InitUI();
|
||||||
|
|
||||||
Log($"{NAME} {VERSION} initialized.");
|
Log($"{NAME} {VERSION} initialized.");
|
||||||
|
|
||||||
|
//InspectorManager.Inspect(typeof(Tests.TestClass));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -7,7 +7,9 @@ using UnityEngine.UI;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
|
||||||
namespace UnityExplorer.Hooks
|
namespace UnityExplorer.Hooks
|
||||||
{
|
{
|
||||||
|
@ -5,7 +5,9 @@ using System.Text;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
|
||||||
namespace UnityExplorer.Hooks
|
namespace UnityExplorer.Hooks
|
||||||
{
|
{
|
||||||
|
@ -52,9 +52,9 @@ namespace UnityExplorer.Hooks
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Evaluator.source_file
|
// Evaluator.source_file
|
||||||
private static readonly FieldInfo fi_sourceFile = ReflectionUtility.GetFieldInfo(typeof(Evaluator), "source_file");
|
private static readonly FieldInfo fi_sourceFile = AccessTools.Field(typeof(Evaluator), "source_file");
|
||||||
// TypeDefinition.Definition
|
// TypeDefinition.Definition
|
||||||
private static readonly PropertyInfo pi_Definition = ReflectionUtility.GetPropertyInfo(typeof(TypeDefinition), "Definition");
|
private static readonly PropertyInfo pi_Definition = AccessTools.Property(typeof(TypeDefinition), "Definition");
|
||||||
|
|
||||||
public bool CompileAndGenerateProcessor(string patchSource)
|
public bool CompileAndGenerateProcessor(string patchSource)
|
||||||
{
|
{
|
||||||
|
@ -6,13 +6,15 @@ using System.Reflection;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
using UnityExplorer.CSConsole;
|
using UnityExplorer.CSConsole;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Hooks
|
namespace UnityExplorer.Hooks
|
||||||
{
|
{
|
||||||
@ -84,10 +86,10 @@ namespace UnityExplorer.Hooks
|
|||||||
cell.CurrentDisplayedIndex = index;
|
cell.CurrentDisplayedIndex = index;
|
||||||
var hook = (HookInstance)this.currentHooks[index];
|
var hook = (HookInstance)this.currentHooks[index];
|
||||||
|
|
||||||
cell.MethodNameLabel.text = HighlightMethod(hook.TargetMethod);
|
cell.MethodNameLabel.text = SignatureHighlighter.HighlightMethod(hook.TargetMethod);
|
||||||
|
|
||||||
cell.ToggleActiveButton.ButtonText.text = hook.Enabled ? "Enabled" : "Disabled";
|
cell.ToggleActiveButton.ButtonText.text = hook.Enabled ? "Enabled" : "Disabled";
|
||||||
RuntimeProvider.Instance.SetColorBlockAuto(cell.ToggleActiveButton.Component,
|
RuntimeHelper.SetColorBlockAuto(cell.ToggleActiveButton.Component,
|
||||||
hook.Enabled ? new Color(0.15f, 0.2f, 0.15f) : new Color(0.2f, 0.2f, 0.15f));
|
hook.Enabled ? new Color(0.15f, 0.2f, 0.15f) : new Color(0.2f, 0.2f, 0.15f));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +111,7 @@ namespace UnityExplorer.Hooks
|
|||||||
currentAddEligableMethods.Clear();
|
currentAddEligableMethods.Clear();
|
||||||
foreach (var method in type.GetMethods(ReflectionUtility.FLAGS))
|
foreach (var method in type.GetMethods(ReflectionUtility.FLAGS))
|
||||||
{
|
{
|
||||||
if (method.IsGenericMethod /* || method.IsAbstract */ || RuntimeHelper.IsBlacklisted(method))
|
if (method.IsGenericMethod || UERuntimeHelper.IsBlacklisted(method))
|
||||||
continue;
|
continue;
|
||||||
currentAddEligableMethods.Add(method);
|
currentAddEligableMethods.Add(method);
|
||||||
filteredEligableMethods.Add(method);
|
filteredEligableMethods.Add(method);
|
||||||
@ -183,7 +185,7 @@ namespace UnityExplorer.Hooks
|
|||||||
cell.CurrentDisplayedIndex = index;
|
cell.CurrentDisplayedIndex = index;
|
||||||
var method = this.filteredEligableMethods[index];
|
var method = this.filteredEligableMethods[index];
|
||||||
|
|
||||||
cell.MethodNameLabel.text = HighlightMethod(method);
|
cell.MethodNameLabel.text = SignatureHighlighter.HighlightMethod(method);
|
||||||
|
|
||||||
var sig = method.FullDescription();
|
var sig = method.FullDescription();
|
||||||
if (hookedSignatures.Contains(sig))
|
if (hookedSignatures.Contains(sig))
|
||||||
@ -225,50 +227,5 @@ namespace UnityExplorer.Hooks
|
|||||||
Panel.SetPage(HookManagerPanel.Pages.CurrentHooks);
|
Panel.SetPage(HookManagerPanel.Pages.CurrentHooks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ~~~~~~~~~~ Method syntax highlighting
|
|
||||||
|
|
||||||
private static readonly Dictionary<string, string> highlightedMethods = new Dictionary<string, string>();
|
|
||||||
|
|
||||||
private string HighlightMethod(MethodInfo method)
|
|
||||||
{
|
|
||||||
var sig = method.FullDescription();
|
|
||||||
if (highlightedMethods.ContainsKey(sig))
|
|
||||||
return highlightedMethods[sig];
|
|
||||||
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
|
|
||||||
// declaring type
|
|
||||||
sb.Append(SignatureHighlighter.Parse(method.DeclaringType, false));
|
|
||||||
sb.Append('.');
|
|
||||||
|
|
||||||
// method name
|
|
||||||
var color = !method.IsStatic
|
|
||||||
? SignatureHighlighter.METHOD_INSTANCE
|
|
||||||
: SignatureHighlighter.METHOD_STATIC;
|
|
||||||
sb.Append($"<color={color}>{method.Name}</color>");
|
|
||||||
|
|
||||||
// arguments
|
|
||||||
sb.Append('(');
|
|
||||||
var args = method.GetParameters();
|
|
||||||
if (args != null && args.Any())
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
foreach (var param in args)
|
|
||||||
{
|
|
||||||
sb.Append(SignatureHighlighter.Parse(param.ParameterType, false));
|
|
||||||
sb.Append(' ');
|
|
||||||
sb.Append($"<color={SignatureHighlighter.LOCAL_ARG}>{param.Name}</color>");
|
|
||||||
i++;
|
|
||||||
if (i < args.Length)
|
|
||||||
sb.Append(", ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sb.Append(')');
|
|
||||||
|
|
||||||
var ret = sb.ToString();
|
|
||||||
highlightedMethods.Add(sig, ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<InputAssemblies Include="$(OutputPath)$(AssemblyName).dll" />
|
<InputAssemblies Include="$(OutputPath)$(AssemblyName).dll" />
|
||||||
<InputAssemblies Include="..\lib\mcs-unity\mcs\bin\Release\mcs.dll" />
|
<InputAssemblies Include="..\lib\mcs-unity\mcs\bin\Release\mcs.dll" />
|
||||||
<InputAssemblies Include="packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll" />
|
<InputAssemblies Include="packages\Samboy063.Tomlet.3.1.3\lib\net35\Tomlet.dll" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<!-- Required references for ILRepack -->
|
<!-- Required references for ILRepack -->
|
||||||
|
@ -14,6 +14,8 @@ using UnityExplorer.UI.Widgets.AutoComplete;
|
|||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
@ -44,7 +46,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
GOControls.UpdateGameObjectInfo(true, true);
|
GOControls.UpdateGameObjectInfo(true, true);
|
||||||
GOControls.UpdateTransformControlValues(true);
|
GOControls.UpdateTransformControlValues(true);
|
||||||
|
|
||||||
RuntimeProvider.Instance.StartCoroutine(InitCoroutine());
|
RuntimeHelper.StartCoroutine(InitCoroutine());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator InitCoroutine()
|
private IEnumerator InitCoroutine()
|
||||||
@ -227,7 +229,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
RuntimeProvider.Instance.AddComponent<Component>(GOTarget, type);
|
RuntimeHelper.AddComponent<Component>(GOTarget, type);
|
||||||
UpdateComponents();
|
UpdateComponents();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -241,7 +243,6 @@ namespace UnityExplorer.Inspectors
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#region UI Construction
|
#region UI Construction
|
||||||
|
|
||||||
public override GameObject CreateContent(GameObject parent)
|
public override GameObject CreateContent(GameObject parent)
|
||||||
|
@ -4,10 +4,10 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.UI;
|
using UniverseLib;
|
||||||
using UnityExplorer.UI.Widgets;
|
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.Widgets.ButtonList;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
|
@ -3,9 +3,10 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.UI.Widgets;
|
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets.ButtonList;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
@ -113,7 +114,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
{
|
{
|
||||||
cell.BehaviourToggle.interactable = false;
|
cell.BehaviourToggle.interactable = false;
|
||||||
cell.BehaviourToggle.Set(true, false);
|
cell.BehaviourToggle.Set(true, false);
|
||||||
//RuntimeProvider.Instance.SetColorBlock(cell.BehaviourToggle,)
|
//RuntimeHelper.SetColorBlock(cell.BehaviourToggle,)
|
||||||
cell.BehaviourToggle.graphic.color = new Color(0.2f, 0.2f, 0.2f);
|
cell.BehaviourToggle.graphic.color = new Color(0.2f, 0.2f, 0.2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@ using UniverseLib.Input;
|
|||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
@ -51,6 +54,11 @@ namespace UnityExplorer.Inspectors
|
|||||||
ConstructTransformControls();
|
ConstructTransformControls();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnCopyClicked()
|
||||||
|
{
|
||||||
|
ClipboardPanel.Copy(this.GOTarget);
|
||||||
|
}
|
||||||
|
|
||||||
#region GO Controls
|
#region GO Controls
|
||||||
|
|
||||||
private string lastGoName;
|
private string lastGoName;
|
||||||
@ -169,7 +177,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
{
|
{
|
||||||
// look for inactive objects
|
// look for inactive objects
|
||||||
var name = input.Split('/').Last();
|
var name = input.Split('/').Last();
|
||||||
var allObjects = RuntimeProvider.Instance.FindObjectsOfTypeAll(typeof(GameObject));
|
var allObjects = RuntimeHelper.FindObjectsOfTypeAll(typeof(GameObject));
|
||||||
var shortList = new List<GameObject>();
|
var shortList = new List<GameObject>();
|
||||||
foreach (var obj in allObjects)
|
foreach (var obj in allObjects)
|
||||||
if (obj.name == name) shortList.Add(obj.TryCast<GameObject>());
|
if (obj.name == name) shortList.Add(obj.TryCast<GameObject>());
|
||||||
@ -467,6 +475,11 @@ namespace UnityExplorer.Inspectors
|
|||||||
UIFactory.SetLayoutElement(PathInput.UIRoot, minHeight: 25, minWidth: 100, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(PathInput.UIRoot, minHeight: 25, minWidth: 100, flexibleWidth: 9999);
|
||||||
PathInput.Component.lineType = InputField.LineType.MultiLineSubmit;
|
PathInput.Component.lineType = InputField.LineType.MultiLineSubmit;
|
||||||
|
|
||||||
|
var copyButton = UIFactory.CreateButton(firstRow, "CopyButton", "Copy to Clipboard", new Color(0.2f, 0.2f, 0.2f, 1));
|
||||||
|
copyButton.ButtonText.color = Color.yellow;
|
||||||
|
UIFactory.SetLayoutElement(copyButton.Component.gameObject, minHeight: 25, minWidth: 120);
|
||||||
|
copyButton.OnClick += OnCopyClicked;
|
||||||
|
|
||||||
//var pathApplyBtn = UIFactory.CreateButton(firstRow, "PathButton", "Set Parent Path", new Color(0.2f, 0.2f, 0.2f));
|
//var pathApplyBtn = UIFactory.CreateButton(firstRow, "PathButton", "Set Parent Path", new Color(0.2f, 0.2f, 0.2f));
|
||||||
//UIFactory.SetLayoutElement(pathApplyBtn.Component.gameObject, minHeight: 25, minWidth: 120);
|
//UIFactory.SetLayoutElement(pathApplyBtn.Component.gameObject, minHeight: 25, minWidth: 120);
|
||||||
//pathApplyBtn.OnClick += () => { OnPathEndEdit(PathInput.Text); };
|
//pathApplyBtn.OnClick += () => { OnPathEndEdit(PathInput.Text); };
|
||||||
@ -561,7 +574,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
var layerLabel = UIFactory.CreateLabel(thirdrow, "LayerLabel", "Layer:", TextAnchor.MiddleLeft, Color.grey);
|
var layerLabel = UIFactory.CreateLabel(thirdrow, "LayerLabel", "Layer:", TextAnchor.MiddleLeft, Color.grey);
|
||||||
UIFactory.SetLayoutElement(layerLabel.gameObject, minHeight: 25, minWidth: 50);
|
UIFactory.SetLayoutElement(layerLabel.gameObject, minHeight: 25, minWidth: 50);
|
||||||
|
|
||||||
var layerDrop = UIFactory.CreateDropdown(thirdrow, out LayerDropdown, "0", 14, OnLayerDropdownChanged);
|
var layerDrop = UIFactory.CreateDropdown(thirdrow, "LayerDropdown", out LayerDropdown, "0", 14, OnLayerDropdownChanged);
|
||||||
UIFactory.SetLayoutElement(layerDrop, minHeight: 25, minWidth: 110, flexibleWidth: 999);
|
UIFactory.SetLayoutElement(layerDrop, minHeight: 25, minWidth: 110, flexibleWidth: 999);
|
||||||
LayerDropdown.captionText.color = SignatureHighlighter.EnumGreen;
|
LayerDropdown.captionText.color = SignatureHighlighter.EnumGreen;
|
||||||
if (layerToNames == null)
|
if (layerToNames == null)
|
||||||
@ -575,7 +588,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
var flagsLabel = UIFactory.CreateLabel(thirdrow, "FlagsLabel", "Flags:", TextAnchor.MiddleRight, Color.grey);
|
var flagsLabel = UIFactory.CreateLabel(thirdrow, "FlagsLabel", "Flags:", TextAnchor.MiddleRight, Color.grey);
|
||||||
UIFactory.SetLayoutElement(flagsLabel.gameObject, minHeight: 25, minWidth: 50);
|
UIFactory.SetLayoutElement(flagsLabel.gameObject, minHeight: 25, minWidth: 50);
|
||||||
|
|
||||||
var flagsDrop = UIFactory.CreateDropdown(thirdrow, out FlagsDropdown, "None", 14, OnFlagsDropdownChanged);
|
var flagsDrop = UIFactory.CreateDropdown(thirdrow, "FlagsDropdown", out FlagsDropdown, "None", 14, OnFlagsDropdownChanged);
|
||||||
FlagsDropdown.captionText.color = SignatureHighlighter.EnumGreen;
|
FlagsDropdown.captionText.color = SignatureHighlighter.EnumGreen;
|
||||||
UIFactory.SetLayoutElement(flagsDrop, minHeight: 25, minWidth: 135, flexibleWidth: 999);
|
UIFactory.SetLayoutElement(flagsDrop, minHeight: 25, minWidth: 135, flexibleWidth: 999);
|
||||||
if (hideFlagsValues == null)
|
if (hideFlagsValues == null)
|
||||||
@ -593,7 +606,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
layerToNames = new List<string>();
|
layerToNames = new List<string>();
|
||||||
for (int i = 0; i < 32; i++)
|
for (int i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
var name = RuntimeProvider.Instance.LayerToName(i);
|
var name = RuntimeHelper.LayerToName(i);
|
||||||
if (string.IsNullOrEmpty(name))
|
if (string.IsNullOrEmpty(name))
|
||||||
name = i.ToString();
|
name = i.ToString();
|
||||||
layerToNames.Add(name);
|
layerToNames.Add(name);
|
||||||
|
@ -5,14 +5,14 @@ using System.Text;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core;
|
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
using UnityExplorer.Inspectors.MouseInspectors;
|
using UnityExplorer.Inspectors.MouseInspectors;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
@ -32,24 +32,19 @@ namespace UnityExplorer.Inspectors
|
|||||||
public static bool Inspecting { get; set; }
|
public static bool Inspecting { get; set; }
|
||||||
public static MouseInspectMode Mode { get; set; }
|
public static MouseInspectMode Mode { get; set; }
|
||||||
|
|
||||||
|
public MouseInspectorBase CurrentInspector => Mode switch
|
||||||
|
{
|
||||||
|
MouseInspectMode.UI => uiInspector,
|
||||||
|
MouseInspectMode.World => worldInspector,
|
||||||
|
_ => null,
|
||||||
|
};
|
||||||
|
|
||||||
private static Vector3 lastMousePos;
|
private static Vector3 lastMousePos;
|
||||||
|
|
||||||
public MouseInspectorBase CurrentInspector
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
switch (Mode)
|
|
||||||
{
|
|
||||||
case MouseInspectMode.UI:
|
|
||||||
return uiInspector;
|
|
||||||
case MouseInspectMode.World:
|
|
||||||
return worldInspector;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// UIPanel
|
// UIPanel
|
||||||
|
internal static readonly string UIBaseGUID = $"{ExplorerCore.GUID}.MouseInspector";
|
||||||
|
private UIBase inspectorUIBase;
|
||||||
|
|
||||||
public override string Name => "Inspect Under Mouse";
|
public override string Name => "Inspect Under Mouse";
|
||||||
public override UIManager.Panels PanelType => UIManager.Panels.MouseInspector;
|
public override UIManager.Panels PanelType => UIManager.Panels.MouseInspector;
|
||||||
public override int MinWidth => -1;
|
public override int MinWidth => -1;
|
||||||
@ -78,7 +73,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
case 1: Instance.StartInspect(MouseInspectMode.World); break;
|
case 1: Instance.StartInspect(MouseInspectMode.World); break;
|
||||||
case 2: Instance.StartInspect(MouseInspectMode.UI); break;
|
case 2: Instance.StartInspect(MouseInspectMode.UI); break;
|
||||||
}
|
}
|
||||||
UIManager.MouseInspectDropdown.value = 0;
|
InspectorPanel.Instance.MouseInspectDropdown.value = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartInspect(MouseInspectMode mode)
|
public void StartInspect(MouseInspectMode mode)
|
||||||
@ -112,7 +107,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
UIManager.NavBarRect.gameObject.SetActive(true);
|
UIManager.NavBarRect.gameObject.SetActive(true);
|
||||||
UIManager.PanelHolder.SetActive(true);
|
UIManager.PanelHolder.SetActive(true);
|
||||||
|
|
||||||
var drop = UIManager.MouseInspectDropdown;
|
var drop = InspectorPanel.Instance.MouseInspectDropdown;
|
||||||
if (drop.transform.Find("Dropdown List") is Transform list)
|
if (drop.transform.Find("Dropdown List") is Transform list)
|
||||||
drop.DestroyDropdownList(list.gameObject);
|
drop.DestroyDropdownList(list.gameObject);
|
||||||
|
|
||||||
@ -165,7 +160,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
mousePos.y -= 10;
|
mousePos.y -= 10;
|
||||||
|
|
||||||
// calculate and set our UI position
|
// calculate and set our UI position
|
||||||
var inversePos = UIManager.UIRoot.transform.InverseTransformPoint(mousePos);
|
var inversePos = inspectorUIBase.RootObject.transform.InverseTransformPoint(mousePos);
|
||||||
UIRoot.transform.localPosition = new Vector3(inversePos.x, inversePos.y, 0);
|
UIRoot.transform.localPosition = new Vector3(inversePos.x, inversePos.y, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,7 +180,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
this.titleBar.SetActive(false);
|
this.titleBar.SetActive(false);
|
||||||
this.UIRoot.transform.SetParent(UIManager.UIRoot.transform, false);
|
this.UIRoot.transform.SetParent(UIManager.UIRoot.transform, false);
|
||||||
|
|
||||||
var inspectContent = UIFactory.CreateVerticalGroup(this.content, "InspectContent", true, true, true, true, 3, new Vector4(2, 2, 2, 2));
|
var inspectContent = UIFactory.CreateVerticalGroup(this.uiRoot, "InspectContent", true, true, true, true, 3, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(inspectContent, flexibleWidth: 9999, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(inspectContent, flexibleWidth: 9999, flexibleHeight: 9999);
|
||||||
|
|
||||||
// Title text
|
// Title text
|
||||||
@ -208,10 +203,12 @@ namespace UnityExplorer.Inspectors
|
|||||||
UIFactory.SetLayoutElement(objPathLabel.gameObject, minHeight: 75);
|
UIFactory.SetLayoutElement(objPathLabel.gameObject, minHeight: 75);
|
||||||
|
|
||||||
UIRoot.SetActive(false);
|
UIRoot.SetActive(false);
|
||||||
|
|
||||||
|
// Create a new canvas for this panel to live on.
|
||||||
|
// It needs to always be shown on the main display, other panels can move displays.
|
||||||
|
|
||||||
|
inspectorUIBase = UniversalUI.RegisterUI(UIBaseGUID, null);
|
||||||
|
UIRoot.transform.SetParent(inspectorUIBase.RootObject.transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DoSaveToConfigElement() { }
|
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager() => null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ using UnityExplorer.UI;
|
|||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
|
@ -11,6 +11,8 @@ using UniverseLib.UI.Models;
|
|||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer
|
namespace UnityExplorer
|
||||||
{
|
{
|
||||||
@ -23,6 +25,8 @@ namespace UnityExplorer
|
|||||||
|
|
||||||
public static float PanelWidth;
|
public static float PanelWidth;
|
||||||
|
|
||||||
|
public static event Action OnInspectedTabsChanged;
|
||||||
|
|
||||||
public static void Inspect(object obj, CacheObjectBase sourceCache = null)
|
public static void Inspect(object obj, CacheObjectBase sourceCache = null)
|
||||||
{
|
{
|
||||||
if (obj.IsNullOrDestroyed())
|
if (obj.IsNullOrDestroyed())
|
||||||
@ -111,6 +115,8 @@ namespace UnityExplorer
|
|||||||
|
|
||||||
inspector.OnBorrowedFromPool(target);
|
inspector.OnBorrowedFromPool(target);
|
||||||
SetInspectorActive(inspector);
|
SetInspectorActive(inspector);
|
||||||
|
|
||||||
|
OnInspectedTabsChanged?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void ReleaseInspector<T>(T inspector) where T : InspectorBase
|
internal static void ReleaseInspector<T>(T inspector) where T : InspectorBase
|
||||||
@ -144,6 +150,8 @@ namespace UnityExplorer
|
|||||||
UIManager.SetPanelActive(UIManager.Panels.Inspector, false);
|
UIManager.SetPanelActive(UIManager.Panels.Inspector, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OnInspectedTabsChanged?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void Update()
|
internal static void Update()
|
||||||
|
@ -9,52 +9,50 @@ using UniverseLib.UI.Models;
|
|||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
public class InspectorTab : IPooledObject
|
public class InspectorTab : IPooledObject
|
||||||
{
|
{
|
||||||
public GameObject UIRoot { get; set; }
|
public GameObject UIRoot { get; set; }
|
||||||
|
|
||||||
public float DefaultHeight => 25f;
|
public float DefaultHeight => 25f;
|
||||||
|
|
||||||
public ButtonRef TabButton;
|
public ButtonRef TabButton;
|
||||||
public Text TabText;
|
public Text TabText;
|
||||||
|
|
||||||
public ButtonRef CloseButton;
|
public ButtonRef CloseButton;
|
||||||
|
|
||||||
private static readonly Color _enabledTabColor = new Color(0.15f, 0.22f, 0.15f);
|
private static readonly Color enabledTabColor = new(0.15f, 0.22f, 0.15f);
|
||||||
private static readonly Color _disabledTabColor = new Color(0.13f, 0.13f, 0.13f);
|
private static readonly Color disabledTabColor = new(0.13f, 0.13f, 0.13f);
|
||||||
|
|
||||||
public void SetTabColor(bool active)
|
public void SetTabColor(bool active)
|
||||||
{
|
{
|
||||||
if (active)
|
Color color = active ? enabledTabColor : disabledTabColor;
|
||||||
RuntimeProvider.Instance.SetColorBlock(TabButton.Component, _enabledTabColor, _enabledTabColor * 1.2f);
|
RuntimeHelper.SetColorBlock(TabButton.Component, color, color * 1.2f);
|
||||||
else
|
|
||||||
RuntimeProvider.Instance.SetColorBlock(TabButton.Component, _disabledTabColor, _disabledTabColor * 1.2f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameObject CreateContent(GameObject parent)
|
public GameObject CreateContent(GameObject parent)
|
||||||
{
|
{
|
||||||
UIRoot = UIFactory.CreateHorizontalGroup(parent, "TabObject", false, true, true, true, 0,
|
UIRoot = UIFactory.CreateHorizontalGroup(parent, "TabObject", false, true, true, true, 1,
|
||||||
default, new Color(0.13f, 0.13f, 0.13f), childAlignment: TextAnchor.MiddleLeft);
|
default, new Color(0.13f, 0.13f, 0.13f), childAlignment: TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(UIRoot, minWidth: 200, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(UIRoot, minWidth: 200, flexibleWidth: 0);
|
||||||
UIRoot.AddComponent<Mask>();
|
UIRoot.AddComponent<Mask>();
|
||||||
|
UIRoot.AddComponent<Outline>();
|
||||||
|
|
||||||
TabButton = UIFactory.CreateButton(UIRoot, "TabButton", "");
|
TabButton = UIFactory.CreateButton(UIRoot, "TabButton", "");
|
||||||
UIFactory.SetLayoutElement(TabButton.Component.gameObject, minWidth: 175, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(TabButton.Component.gameObject, minWidth: 173, flexibleWidth: 0);
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(TabButton.Component.gameObject, false, false, true, true, 0, 0, 0, 3);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(TabButton.Component.gameObject, false, false, true, true, 0, 0, 0, 3);
|
||||||
|
|
||||||
TabText = TabButton.Component.GetComponentInChildren<Text>();
|
TabText = TabButton.Component.GetComponentInChildren<Text>();
|
||||||
UIFactory.SetLayoutElement(TabText.gameObject, minHeight: 25, minWidth: 175, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(TabText.gameObject, minHeight: 25, minWidth: 173, flexibleWidth: 0);
|
||||||
TabText.alignment = TextAnchor.MiddleLeft;
|
TabText.alignment = TextAnchor.MiddleLeft;
|
||||||
TabText.fontSize = 12;
|
TabText.fontSize = 12;
|
||||||
TabText.horizontalOverflow = HorizontalWrapMode.Overflow;
|
TabText.horizontalOverflow = HorizontalWrapMode.Overflow;
|
||||||
|
|
||||||
CloseButton = UIFactory.CreateButton(UIRoot, "CloseButton", "X", new Color(0.2f, 0.2f, 0.2f, 1));
|
CloseButton = UIFactory.CreateButton(UIRoot, "CloseButton", "X", new Color(0.15f, 0.15f, 0.15f, 1));
|
||||||
UIFactory.SetLayoutElement(CloseButton.Component.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(CloseButton.Component.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0);
|
||||||
var closeBtnText = CloseButton.Component.GetComponentInChildren<Text>();
|
CloseButton.ButtonText.color = Color.red;
|
||||||
closeBtnText.color = Color.red;
|
|
||||||
|
|
||||||
return UIRoot;
|
return UIRoot;
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ namespace UnityExplorer.Inspectors.MouseInspectors
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
var list = new List<RaycastResult>();
|
var list = new List<RaycastResult>();
|
||||||
RuntimeProvider.Instance.GraphicRaycast(gr, ped, list);
|
RuntimeHelper.GraphicRaycast(gr, ped, list);
|
||||||
if (list.Count > 0)
|
if (list.Count > 0)
|
||||||
{
|
{
|
||||||
foreach (var hit in list)
|
foreach (var hit in list)
|
||||||
@ -77,7 +77,7 @@ namespace UnityExplorer.Inspectors.MouseInspectors
|
|||||||
|
|
||||||
private static void SetupUIRaycast()
|
private static void SetupUIRaycast()
|
||||||
{
|
{
|
||||||
foreach (var obj in RuntimeProvider.Instance.FindObjectsOfTypeAll(typeof(Canvas)))
|
foreach (var obj in RuntimeHelper.FindObjectsOfTypeAll(typeof(Canvas)))
|
||||||
{
|
{
|
||||||
var canvas = obj.TryCast<Canvas>();
|
var canvas = obj.TryCast<Canvas>();
|
||||||
if (!canvas || !canvas.enabled || !canvas.gameObject.activeInHierarchy)
|
if (!canvas || !canvas.enabled || !canvas.gameObject.activeInHierarchy)
|
||||||
@ -91,7 +91,7 @@ namespace UnityExplorer.Inspectors.MouseInspectors
|
|||||||
}
|
}
|
||||||
|
|
||||||
// recache Graphic Raycasters each time we start
|
// recache Graphic Raycasters each time we start
|
||||||
var casters = RuntimeProvider.Instance.FindObjectsOfTypeAll(typeof(GraphicRaycaster));
|
var casters = RuntimeHelper.FindObjectsOfTypeAll(typeof(GraphicRaycaster));
|
||||||
graphicRaycasters = new GraphicRaycaster[casters.Length];
|
graphicRaycasters = new GraphicRaycaster[casters.Length];
|
||||||
for (int i = 0; i < casters.Length; i++)
|
for (int i = 0; i < casters.Length; i++)
|
||||||
{
|
{
|
||||||
@ -99,7 +99,7 @@ namespace UnityExplorer.Inspectors.MouseInspectors
|
|||||||
}
|
}
|
||||||
|
|
||||||
// enable raycastTarget on Graphics
|
// enable raycastTarget on Graphics
|
||||||
foreach (var obj in RuntimeProvider.Instance.FindObjectsOfTypeAll(typeof(Graphic)))
|
foreach (var obj in RuntimeHelper.FindObjectsOfTypeAll(typeof(Graphic)))
|
||||||
{
|
{
|
||||||
var graphic = obj.TryCast<Graphic>();
|
var graphic = obj.TryCast<Graphic>();
|
||||||
if (!graphic || !graphic.enabled || graphic.raycastTarget || !graphic.gameObject.activeInHierarchy)
|
if (!graphic || !graphic.enabled || graphic.raycastTarget || !graphic.gameObject.activeInHierarchy)
|
||||||
@ -110,7 +110,7 @@ namespace UnityExplorer.Inspectors.MouseInspectors
|
|||||||
}
|
}
|
||||||
|
|
||||||
// enable blocksRaycasts on CanvasGroups
|
// enable blocksRaycasts on CanvasGroups
|
||||||
foreach (var obj in RuntimeProvider.Instance.FindObjectsOfTypeAll(typeof(CanvasGroup)))
|
foreach (var obj in RuntimeHelper.FindObjectsOfTypeAll(typeof(CanvasGroup)))
|
||||||
{
|
{
|
||||||
var canvas = obj.TryCast<CanvasGroup>();
|
var canvas = obj.TryCast<CanvasGroup>();
|
||||||
if (!canvas || !canvas.gameObject.activeInHierarchy || canvas.blocksRaycasts)
|
if (!canvas || !canvas.gameObject.activeInHierarchy || canvas.blocksRaycasts)
|
||||||
|
@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors.MouseInspectors
|
namespace UnityExplorer.Inspectors.MouseInspectors
|
||||||
{
|
{
|
||||||
@ -35,6 +36,15 @@ namespace UnityExplorer.Inspectors.MouseInspectors
|
|||||||
|
|
||||||
public override void UpdateMouseInspect(Vector2 mousePos)
|
public override void UpdateMouseInspect(Vector2 mousePos)
|
||||||
{
|
{
|
||||||
|
if (!MainCamera)
|
||||||
|
MainCamera = Camera.main;
|
||||||
|
if (!MainCamera)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("No Main Camera was found, unable to inspect world!");
|
||||||
|
InspectUnderMouse.Instance.StopInspect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var ray = MainCamera.ScreenPointToRay(mousePos);
|
var ray = MainCamera.ScreenPointToRay(mousePos);
|
||||||
Physics.Raycast(ray, out RaycastHit hit, 1000f);
|
Physics.Raycast(ray, out RaycastHit hit, 1000f);
|
||||||
|
|
||||||
|
@ -8,8 +8,8 @@ using System.Reflection.Emit;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
using UnityExplorer.CacheObject;
|
using UnityExplorer.CacheObject;
|
||||||
using UnityExplorer.CacheObject.Views;
|
using UnityExplorer.CacheObject.Views;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
@ -19,6 +19,9 @@ using UniverseLib.UI.Widgets;
|
|||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.Runtime;
|
using UniverseLib.Runtime;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.Inspectors
|
namespace UnityExplorer.Inspectors
|
||||||
{
|
{
|
||||||
@ -29,8 +32,8 @@ namespace UnityExplorer.Inspectors
|
|||||||
public bool StaticOnly { get; internal set; }
|
public bool StaticOnly { get; internal set; }
|
||||||
public bool CanWrite => true;
|
public bool CanWrite => true;
|
||||||
|
|
||||||
private List<CacheMember> members = new List<CacheMember>();
|
private List<CacheMember> members = new();
|
||||||
private readonly List<CacheMember> filteredMembers = new List<CacheMember>();
|
private readonly List<CacheMember> filteredMembers = new();
|
||||||
|
|
||||||
public bool AutoUpdateWanted => autoUpdateToggle.isOn;
|
public bool AutoUpdateWanted => autoUpdateToggle.isOn;
|
||||||
|
|
||||||
@ -58,11 +61,11 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
private string currentBaseTabText;
|
private string currentBaseTabText;
|
||||||
|
|
||||||
private readonly Color disabledButtonColor = new Color(0.24f, 0.24f, 0.24f);
|
private readonly Color disabledButtonColor = new(0.24f, 0.24f, 0.24f);
|
||||||
private readonly Color enabledButtonColor = new Color(0.2f, 0.27f, 0.2f);
|
private readonly Color enabledButtonColor = new(0.2f, 0.27f, 0.2f);
|
||||||
|
|
||||||
private readonly Dictionary<BindingFlags, ButtonRef> scopeFilterButtons = new Dictionary<BindingFlags, ButtonRef>();
|
private readonly Dictionary<BindingFlags, ButtonRef> scopeFilterButtons = new();
|
||||||
private readonly List<Toggle> memberTypeToggles = new List<Toggle>();
|
private readonly List<Toggle> memberTypeToggles = new();
|
||||||
private InputFieldRef filterInputField;
|
private InputFieldRef filterInputField;
|
||||||
|
|
||||||
// Setup / return
|
// Setup / return
|
||||||
@ -74,7 +77,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
SetTarget(target);
|
SetTarget(target);
|
||||||
|
|
||||||
RuntimeProvider.Instance.StartCoroutine(InitCoroutine());
|
RuntimeHelper.StartCoroutine(InitCoroutine());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator InitCoroutine()
|
private IEnumerator InitCoroutine()
|
||||||
@ -225,11 +228,11 @@ namespace UnityExplorer.Inspectors
|
|||||||
if (flagsFilter != FlagsFilter)
|
if (flagsFilter != FlagsFilter)
|
||||||
{
|
{
|
||||||
var btn = scopeFilterButtons[FlagsFilter].Component;
|
var btn = scopeFilterButtons[FlagsFilter].Component;
|
||||||
RuntimeProvider.Instance.SetColorBlock(btn, disabledButtonColor, disabledButtonColor * 1.3f);
|
RuntimeHelper.SetColorBlock(btn, disabledButtonColor, disabledButtonColor * 1.3f);
|
||||||
|
|
||||||
this.FlagsFilter = flagsFilter;
|
this.FlagsFilter = flagsFilter;
|
||||||
btn = scopeFilterButtons[FlagsFilter].Component;
|
btn = scopeFilterButtons[FlagsFilter].Component;
|
||||||
RuntimeProvider.Instance.SetColorBlock(btn, enabledButtonColor, enabledButtonColor * 1.3f);
|
RuntimeHelper.SetColorBlock(btn, enabledButtonColor, enabledButtonColor * 1.3f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,6 +330,11 @@ namespace UnityExplorer.Inspectors
|
|||||||
cell.Occupant.IValue.SetLayout();
|
cell.Occupant.IValue.SetLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnCopyClicked()
|
||||||
|
{
|
||||||
|
ClipboardPanel.Copy(this.Target ?? this.TargetType);
|
||||||
|
}
|
||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
private GameObject mainContentHolder;
|
private GameObject mainContentHolder;
|
||||||
@ -338,7 +346,10 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
// Class name, assembly
|
// Class name, assembly
|
||||||
|
|
||||||
var titleHolder = UIFactory.CreateUIObject("TitleHolder", UIRoot);
|
var topRow = UIFactory.CreateHorizontalGroup(UIRoot, "TopRow", false, false, true, true, 4, default, new(1, 1, 1, 0), TextAnchor.MiddleLeft);
|
||||||
|
UIFactory.SetLayoutElement(topRow, minHeight: 25, flexibleWidth: 9999);
|
||||||
|
|
||||||
|
var titleHolder = UIFactory.CreateUIObject("TitleHolder", topRow);
|
||||||
UIFactory.SetLayoutElement(titleHolder, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(titleHolder, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
NameText = UIFactory.CreateLabel(titleHolder, "VisibleTitle", "NotSet", TextAnchor.MiddleLeft);
|
NameText = UIFactory.CreateLabel(titleHolder, "VisibleTitle", "NotSet", TextAnchor.MiddleLeft);
|
||||||
@ -360,6 +371,11 @@ namespace UnityExplorer.Inspectors
|
|||||||
HiddenNameText.Component.textComponent.color = Color.clear;
|
HiddenNameText.Component.textComponent.color = Color.clear;
|
||||||
UIFactory.SetLayoutElement(HiddenNameText.Component.gameObject, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(HiddenNameText.Component.gameObject, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
|
var copyButton = UIFactory.CreateButton(topRow, "CopyButton", "Copy to Clipboard", new Color(0.2f, 0.2f, 0.2f, 1));
|
||||||
|
copyButton.ButtonText.color = Color.yellow;
|
||||||
|
UIFactory.SetLayoutElement(copyButton.Component.gameObject, minHeight: 25, minWidth: 120, flexibleWidth: 0);
|
||||||
|
copyButton.OnClick += OnCopyClicked;
|
||||||
|
|
||||||
AssemblyText = UIFactory.CreateLabel(UIRoot, "AssemblyLabel", "not set", TextAnchor.MiddleLeft);
|
AssemblyText = UIFactory.CreateLabel(UIRoot, "AssemblyLabel", "not set", TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(AssemblyText.gameObject, minHeight: 25, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(AssemblyText.gameObject, minHeight: 25, flexibleWidth: 9999);
|
||||||
|
|
||||||
@ -464,7 +480,13 @@ namespace UnityExplorer.Inspectors
|
|||||||
{
|
{
|
||||||
var toggleObj = UIFactory.CreateToggle(parent, "Toggle_" + type, out Toggle toggle, out Text toggleText);
|
var toggleObj = UIFactory.CreateToggle(parent, "Toggle_" + type, out Toggle toggle, out Text toggleText);
|
||||||
UIFactory.SetLayoutElement(toggleObj, minHeight: 25, minWidth: width);
|
UIFactory.SetLayoutElement(toggleObj, minHeight: 25, minWidth: width);
|
||||||
var color = SignatureHighlighter.GetMemberInfoColor(type);
|
var color = type switch
|
||||||
|
{
|
||||||
|
MemberTypes.Method => SignatureHighlighter.METHOD_INSTANCE,
|
||||||
|
MemberTypes.Field => SignatureHighlighter.FIELD_INSTANCE,
|
||||||
|
MemberTypes.Property => SignatureHighlighter.PROP_INSTANCE,
|
||||||
|
_ => throw new NotImplementedException()
|
||||||
|
};
|
||||||
toggleText.text = $"<color={color}>{type}</color>";
|
toggleText.text = $"<color={color}>{type}</color>";
|
||||||
|
|
||||||
toggle.graphic.TryCast<Image>().color = color.ToColor() * 0.65f;
|
toggle.graphic.TryCast<Image>().color = color.ToColor() * 0.65f;
|
||||||
@ -664,7 +686,7 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
textureSavePathInput.Text = Path.Combine(ConfigManager.Default_Output_Path.Value, $"{name}.png");
|
textureSavePathInput.Text = Path.Combine(ConfigManager.Default_Output_Path.Value, $"{name}.png");
|
||||||
|
|
||||||
var sprite = TextureUtilProvider.Instance.CreateSprite(TextureRef);
|
var sprite = TextureHelper.CreateSprite(TextureRef);
|
||||||
textureImage.sprite = sprite;
|
textureImage.sprite = sprite;
|
||||||
|
|
||||||
textureImageLayout.preferredHeight = sprite.rect.height;
|
textureImageLayout.preferredHeight = sprite.rect.height;
|
||||||
@ -700,10 +722,10 @@ namespace UnityExplorer.Inspectors
|
|||||||
|
|
||||||
var tex = TextureRef;
|
var tex = TextureRef;
|
||||||
|
|
||||||
if (!TextureUtilProvider.IsReadable(tex))
|
if (!TextureHelper.IsReadable(tex))
|
||||||
tex = TextureUtilProvider.ForceReadTexture(tex);
|
tex = TextureHelper.ForceReadTexture(tex);
|
||||||
|
|
||||||
byte[] data = TextureUtilProvider.Instance.EncodeToPNG(tex);
|
byte[] data = TextureHelper.EncodeToPNG(tex);
|
||||||
File.WriteAllBytes(path, data);
|
File.WriteAllBytes(path, data);
|
||||||
|
|
||||||
if (tex != TextureRef)
|
if (tex != TextureRef)
|
||||||
|
@ -4,7 +4,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
|
|
||||||
namespace UnityExplorer.Loader.BIE
|
namespace UnityExplorer.Loader.BIE
|
||||||
{
|
{
|
||||||
|
@ -9,8 +9,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
using UnityExplorer.Core;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Core.Config;
|
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UnityExplorer.Loader.BIE;
|
using UnityExplorer.Loader.BIE;
|
||||||
#if CPP
|
#if CPP
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
|
|
||||||
namespace UnityExplorer
|
namespace UnityExplorer
|
||||||
{
|
{
|
||||||
|
@ -3,10 +3,15 @@ using System;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using MelonLoader;
|
using MelonLoader;
|
||||||
using UnityExplorer;
|
using UnityExplorer;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Loader.ML;
|
using UnityExplorer.Loader.ML;
|
||||||
|
|
||||||
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.UNIVERSAL)]
|
#if CPP
|
||||||
|
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.IL2CPP)]
|
||||||
|
#else
|
||||||
|
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
|
||||||
|
#endif
|
||||||
|
|
||||||
[assembly: MelonInfo(typeof(ExplorerMelonMod), ExplorerCore.NAME, ExplorerCore.VERSION, ExplorerCore.AUTHOR)]
|
[assembly: MelonInfo(typeof(ExplorerMelonMod), ExplorerCore.NAME, ExplorerCore.VERSION, ExplorerCore.AUTHOR)]
|
||||||
[assembly: MelonGame(null, null)]
|
[assembly: MelonGame(null, null)]
|
||||||
[assembly: MelonColor(ConsoleColor.DarkCyan)]
|
[assembly: MelonColor(ConsoleColor.DarkCyan)]
|
||||||
|
@ -5,8 +5,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.Core;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Core.Config;
|
|
||||||
|
|
||||||
namespace UnityExplorer.Loader.ML
|
namespace UnityExplorer.Loader.ML
|
||||||
{
|
{
|
||||||
|
@ -4,11 +4,10 @@ using System;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Loader.STANDALONE;
|
using UnityExplorer.Loader.STANDALONE;
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UnityExplorer.Core;
|
|
||||||
#if CPP
|
#if CPP
|
||||||
using UnhollowerRuntimeLib;
|
using UnhollowerRuntimeLib;
|
||||||
#endif
|
#endif
|
||||||
|
@ -3,23 +3,21 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using IniParser.Parser;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Tomlet;
|
||||||
|
using Tomlet.Models;
|
||||||
|
|
||||||
namespace UnityExplorer.Loader.STANDALONE
|
namespace UnityExplorer.Loader.STANDALONE
|
||||||
{
|
{
|
||||||
public class StandaloneConfigHandler : ConfigHandler
|
public class StandaloneConfigHandler : ConfigHandler
|
||||||
{
|
{
|
||||||
internal static IniDataParser _parser;
|
|
||||||
internal static string CONFIG_PATH;
|
internal static string CONFIG_PATH;
|
||||||
|
|
||||||
public override void Init()
|
public override void Init()
|
||||||
{
|
{
|
||||||
CONFIG_PATH = Path.Combine(ExplorerCore.Loader.ExplorerFolder, "config.ini");
|
CONFIG_PATH = Path.Combine(ExplorerCore.Loader.ExplorerFolder, "config.cfg");
|
||||||
_parser = new IniDataParser();
|
|
||||||
_parser.Configuration.CommentString = "#";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void LoadConfig()
|
public override void LoadConfig()
|
||||||
@ -52,14 +50,11 @@ namespace UnityExplorer.Loader.STANDALONE
|
|||||||
if (!File.Exists(CONFIG_PATH))
|
if (!File.Exists(CONFIG_PATH))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
string ini = File.ReadAllText(CONFIG_PATH);
|
var document = TomlParser.ParseFile(CONFIG_PATH);
|
||||||
|
foreach (var key in document.Keys)
|
||||||
var data = _parser.Parse(ini);
|
|
||||||
|
|
||||||
foreach (var config in data.Sections["Config"])
|
|
||||||
{
|
{
|
||||||
if (ConfigManager.ConfigElements.TryGetValue(config.KeyName, out IConfigElement configElement))
|
var config = ConfigManager.ConfigElements[key];
|
||||||
configElement.BoxedValue = StringToConfigValue(config.Value, configElement.ElementType);
|
config.BoxedValue = StringToConfigValue(document.GetValue(key).StringValue, config.ElementType);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -89,18 +84,14 @@ namespace UnityExplorer.Loader.STANDALONE
|
|||||||
|
|
||||||
public override void SaveConfig()
|
public override void SaveConfig()
|
||||||
{
|
{
|
||||||
var data = new IniParser.Model.IniData();
|
var document = TomlDocument.CreateEmpty();
|
||||||
|
foreach (var config in ConfigManager.ConfigElements)
|
||||||
data.Sections.AddSection("Config");
|
document.Put(config.Key, config.Value.BoxedValue.ToString());
|
||||||
var sec = data.Sections["Config"];
|
|
||||||
|
|
||||||
foreach (var entry in ConfigManager.ConfigElements)
|
|
||||||
sec.AddKey(entry.Key, entry.Value.BoxedValue.ToString());
|
|
||||||
|
|
||||||
if (!Directory.Exists(ExplorerCore.Loader.ExplorerFolder))
|
if (!Directory.Exists(ExplorerCore.Loader.ExplorerFolder))
|
||||||
Directory.CreateDirectory(ExplorerCore.Loader.ExplorerFolder);
|
Directory.CreateDirectory(ExplorerCore.Loader.ExplorerFolder);
|
||||||
|
|
||||||
File.WriteAllText(CONFIG_PATH, data.ToString());
|
File.WriteAllText(CONFIG_PATH, document.SerializedValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,14 +4,14 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.UI;
|
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UnityExplorer.UI.Widgets;
|
|
||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib.UI.Widgets;
|
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.UI.Widgets.ButtonList;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.ObjectExplorer
|
namespace UnityExplorer.ObjectExplorer
|
||||||
{
|
{
|
||||||
@ -24,28 +24,25 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
Parent = parent;
|
Parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SearchContext m_context = SearchContext.UnityObject;
|
private SearchContext context = SearchContext.UnityObject;
|
||||||
private SceneFilter m_sceneFilter = SceneFilter.Any;
|
private SceneFilter sceneFilter = SceneFilter.Any;
|
||||||
private ChildFilter m_childFilter = ChildFilter.Any;
|
private ChildFilter childFilter = ChildFilter.Any;
|
||||||
private string desiredTypeInput;
|
private string desiredTypeInput;
|
||||||
private string lastCheckedTypeInput;
|
private string lastCheckedTypeInput;
|
||||||
private bool lastTypeCanHaveGO;
|
private bool lastTypeCanHaveGameObject;
|
||||||
|
|
||||||
public ButtonListHandler<object, ButtonCell> dataHandler;
|
public ButtonListHandler<object, ButtonCell> dataHandler;
|
||||||
|
|
||||||
private ScrollPool<ButtonCell> resultsScrollPool;
|
private ScrollPool<ButtonCell> resultsScrollPool;
|
||||||
private List<object> currentResults = new List<object>();
|
private List<object> currentResults = new();
|
||||||
|
|
||||||
public TypeCompleter typeAutocompleter;
|
|
||||||
|
|
||||||
public override GameObject UIRoot => uiRoot;
|
public override GameObject UIRoot => uiRoot;
|
||||||
private GameObject uiRoot;
|
private GameObject uiRoot;
|
||||||
|
|
||||||
private GameObject sceneFilterRow;
|
private GameObject sceneFilterRow;
|
||||||
private GameObject childFilterRow;
|
private GameObject childFilterRow;
|
||||||
private GameObject unityObjectClassRow;
|
private GameObject classInputRow;
|
||||||
|
public TypeCompleter typeAutocompleter;
|
||||||
|
private GameObject nameInputRow;
|
||||||
private InputFieldRef nameInputField;
|
private InputFieldRef nameInputField;
|
||||||
|
|
||||||
private Text resultsLabel;
|
private Text resultsLabel;
|
||||||
|
|
||||||
public List<object> GetEntries() => currentResults;
|
public List<object> GetEntries() => currentResults;
|
||||||
@ -54,12 +51,12 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
{
|
{
|
||||||
cachedCellTexts.Clear();
|
cachedCellTexts.Clear();
|
||||||
|
|
||||||
if (m_context == SearchContext.Singleton)
|
if (context == SearchContext.Singleton)
|
||||||
currentResults = SearchProvider.SingletonSearch(nameInputField.Text);
|
currentResults = SearchProvider.InstanceSearch(desiredTypeInput).ToList();
|
||||||
else if (m_context == SearchContext.Class)
|
else if (context == SearchContext.Class)
|
||||||
currentResults = SearchProvider.ClassSearch(nameInputField.Text);
|
currentResults = SearchProvider.ClassSearch(desiredTypeInput);
|
||||||
else
|
else
|
||||||
currentResults = SearchProvider.UnityObjectSearch(nameInputField.Text, desiredTypeInput, m_context, m_childFilter, m_sceneFilter);
|
currentResults = SearchProvider.UnityObjectSearch(nameInputField.Text, desiredTypeInput, childFilter, sceneFilter);
|
||||||
|
|
||||||
dataHandler.RefreshData();
|
dataHandler.RefreshData();
|
||||||
resultsScrollPool.Refresh(true);
|
resultsScrollPool.Refresh(true);
|
||||||
@ -69,7 +66,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
public void Update()
|
public void Update()
|
||||||
{
|
{
|
||||||
if (m_context == SearchContext.UnityObject && lastCheckedTypeInput != desiredTypeInput)
|
if (context == SearchContext.UnityObject && lastCheckedTypeInput != desiredTypeInput)
|
||||||
{
|
{
|
||||||
lastCheckedTypeInput = desiredTypeInput;
|
lastCheckedTypeInput = desiredTypeInput;
|
||||||
|
|
||||||
@ -77,15 +74,15 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
if (ReflectionUtility.GetTypeByName(desiredTypeInput) is Type cachedType)
|
if (ReflectionUtility.GetTypeByName(desiredTypeInput) is Type cachedType)
|
||||||
{
|
{
|
||||||
var type = cachedType;
|
var type = cachedType;
|
||||||
lastTypeCanHaveGO = typeof(Component).IsAssignableFrom(type) || type == typeof(GameObject);
|
lastTypeCanHaveGameObject = typeof(Component).IsAssignableFrom(type) || type == typeof(GameObject);
|
||||||
sceneFilterRow.SetActive(lastTypeCanHaveGO);
|
sceneFilterRow.SetActive(lastTypeCanHaveGameObject);
|
||||||
childFilterRow.SetActive(lastTypeCanHaveGO);
|
childFilterRow.SetActive(lastTypeCanHaveGameObject);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sceneFilterRow.SetActive(false);
|
sceneFilterRow.SetActive(false);
|
||||||
childFilterRow.SetActive(false);
|
childFilterRow.SetActive(false);
|
||||||
lastTypeCanHaveGO = false;
|
lastTypeCanHaveGameObject = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,18 +91,21 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
private void OnContextDropdownChanged(int value)
|
private void OnContextDropdownChanged(int value)
|
||||||
{
|
{
|
||||||
m_context = (SearchContext)value;
|
context = (SearchContext)value;
|
||||||
|
|
||||||
lastCheckedTypeInput = null;
|
lastCheckedTypeInput = null;
|
||||||
sceneFilterRow.SetActive(false);
|
sceneFilterRow.SetActive(false);
|
||||||
childFilterRow.SetActive(false);
|
childFilterRow.SetActive(false);
|
||||||
|
|
||||||
unityObjectClassRow.SetActive(m_context == SearchContext.UnityObject);
|
nameInputRow.SetActive(context == SearchContext.UnityObject);
|
||||||
|
|
||||||
|
typeAutocompleter.BaseType = context == SearchContext.UnityObject ? typeof(UnityEngine.Object) : typeof(object);
|
||||||
|
typeAutocompleter.CacheTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnSceneFilterDropChanged(int value) => m_sceneFilter = (SceneFilter)value;
|
private void OnSceneFilterDropChanged(int value) => sceneFilter = (SceneFilter)value;
|
||||||
|
|
||||||
private void OnChildFilterDropChanged(int value) => m_childFilter = (ChildFilter)value;
|
private void OnChildFilterDropChanged(int value) => childFilter = (ChildFilter)value;
|
||||||
|
|
||||||
private void OnTypeInputChanged(string val)
|
private void OnTypeInputChanged(string val)
|
||||||
{
|
{
|
||||||
@ -120,14 +120,14 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cache the syntax-highlighted text for each search result to reduce allocs.
|
// Cache the syntax-highlighted text for each search result to reduce allocs.
|
||||||
private static readonly Dictionary<int, string> cachedCellTexts = new Dictionary<int, string>();
|
private static readonly Dictionary<int, string> cachedCellTexts = new();
|
||||||
|
|
||||||
public void SetCell(ButtonCell cell, int index)
|
public void SetCell(ButtonCell cell, int index)
|
||||||
{
|
{
|
||||||
if (!cachedCellTexts.ContainsKey(index))
|
if (!cachedCellTexts.ContainsKey(index))
|
||||||
{
|
{
|
||||||
string text;
|
string text;
|
||||||
if (m_context == SearchContext.Class)
|
if (context == SearchContext.Class)
|
||||||
{
|
{
|
||||||
var type = currentResults[index] as Type;
|
var type = currentResults[index] as Type;
|
||||||
text = $"{SignatureHighlighter.Parse(type, true)} <color=grey><i>({type.Assembly.GetName().Name})</i></color>";
|
text = $"{SignatureHighlighter.Parse(type, true)} <color=grey><i>({type.Assembly.GetName().Name})</i></color>";
|
||||||
@ -143,7 +143,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
private void OnCellClicked(int dataIndex)
|
private void OnCellClicked(int dataIndex)
|
||||||
{
|
{
|
||||||
if (m_context == SearchContext.Class)
|
if (context == SearchContext.Class)
|
||||||
InspectorManager.Inspect(currentResults[dataIndex] as Type);
|
InspectorManager.Inspect(currentResults[dataIndex] as Type);
|
||||||
else
|
else
|
||||||
InspectorManager.Inspect(currentResults[dataIndex]);
|
InspectorManager.Inspect(currentResults[dataIndex]);
|
||||||
@ -164,20 +164,20 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
var contextLbl = UIFactory.CreateLabel(contextGroup, "SearchContextLabel", "Searching for:", TextAnchor.MiddleLeft);
|
var contextLbl = UIFactory.CreateLabel(contextGroup, "SearchContextLabel", "Searching for:", TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(contextLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(contextLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
||||||
|
|
||||||
var contextDropObj = UIFactory.CreateDropdown(contextGroup, out Dropdown contextDrop, null, 14, OnContextDropdownChanged);
|
var contextDropObj = UIFactory.CreateDropdown(contextGroup, "ContextDropdown", out Dropdown contextDrop, null, 14, OnContextDropdownChanged);
|
||||||
foreach (var name in Enum.GetNames(typeof(SearchContext)))
|
foreach (var name in Enum.GetNames(typeof(SearchContext)))
|
||||||
contextDrop.options.Add(new Dropdown.OptionData(name));
|
contextDrop.options.Add(new Dropdown.OptionData(name));
|
||||||
UIFactory.SetLayoutElement(contextDropObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(contextDropObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
// Unity class input
|
// Class input
|
||||||
|
|
||||||
unityObjectClassRow = UIFactory.CreateHorizontalGroup(uiRoot, "UnityClassRow", false, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
classInputRow = UIFactory.CreateHorizontalGroup(uiRoot, "ClassRow", false, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(unityObjectClassRow, minHeight: 25, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(classInputRow, minHeight: 25, flexibleHeight: 0);
|
||||||
|
|
||||||
var unityClassLbl = UIFactory.CreateLabel(unityObjectClassRow, "UnityClassLabel", "Class filter:", TextAnchor.MiddleLeft);
|
var unityClassLbl = UIFactory.CreateLabel(classInputRow, "ClassLabel", "Class filter:", TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(unityClassLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(unityClassLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
||||||
|
|
||||||
var classInputField = UIFactory.CreateInputField(unityObjectClassRow, "ClassInput", "...");
|
var classInputField = UIFactory.CreateInputField(classInputRow, "ClassInput", "...");
|
||||||
UIFactory.SetLayoutElement(classInputField.UIRoot, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(classInputField.UIRoot, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
typeAutocompleter = new TypeCompleter(typeof(UnityEngine.Object), classInputField);
|
typeAutocompleter = new TypeCompleter(typeof(UnityEngine.Object), classInputField);
|
||||||
@ -193,7 +193,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
var childLbl = UIFactory.CreateLabel(childFilterRow, "ChildLabel", "Child filter:", TextAnchor.MiddleLeft);
|
var childLbl = UIFactory.CreateLabel(childFilterRow, "ChildLabel", "Child filter:", TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(childLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(childLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
||||||
|
|
||||||
var childDropObj = UIFactory.CreateDropdown(childFilterRow, out Dropdown childDrop, null, 14, OnChildFilterDropChanged);
|
var childDropObj = UIFactory.CreateDropdown(childFilterRow, "ChildFilterDropdown", out Dropdown childDrop, null, 14, OnChildFilterDropChanged);
|
||||||
foreach (var name in Enum.GetNames(typeof(ChildFilter)))
|
foreach (var name in Enum.GetNames(typeof(ChildFilter)))
|
||||||
childDrop.options.Add(new Dropdown.OptionData(name));
|
childDrop.options.Add(new Dropdown.OptionData(name));
|
||||||
UIFactory.SetLayoutElement(childDropObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(childDropObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
@ -208,22 +208,26 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
var sceneLbl = UIFactory.CreateLabel(sceneFilterRow, "SceneLabel", "Scene filter:", TextAnchor.MiddleLeft);
|
var sceneLbl = UIFactory.CreateLabel(sceneFilterRow, "SceneLabel", "Scene filter:", TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(sceneLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(sceneLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
||||||
|
|
||||||
var sceneDropObj = UIFactory.CreateDropdown(sceneFilterRow, out Dropdown sceneDrop, null, 14, OnSceneFilterDropChanged);
|
var sceneDropObj = UIFactory.CreateDropdown(sceneFilterRow, "SceneFilterDropdown", out Dropdown sceneDrop, null, 14, OnSceneFilterDropChanged);
|
||||||
foreach (var name in Enum.GetNames(typeof(SceneFilter)))
|
foreach (var name in Enum.GetNames(typeof(SceneFilter)))
|
||||||
|
{
|
||||||
|
if (!SceneHandler.DontDestroyExists && name == "DontDestroyOnLoad")
|
||||||
|
continue;
|
||||||
sceneDrop.options.Add(new Dropdown.OptionData(name));
|
sceneDrop.options.Add(new Dropdown.OptionData(name));
|
||||||
|
}
|
||||||
UIFactory.SetLayoutElement(sceneDropObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(sceneDropObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
sceneFilterRow.SetActive(false);
|
sceneFilterRow.SetActive(false);
|
||||||
|
|
||||||
// Name filter input
|
// Name filter input
|
||||||
|
|
||||||
var nameRow = UIFactory.CreateHorizontalGroup(uiRoot, "NameRow", true, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
nameInputRow = UIFactory.CreateHorizontalGroup(uiRoot, "NameRow", true, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(nameRow, minHeight: 25, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(nameInputRow, minHeight: 25, flexibleHeight: 0);
|
||||||
|
|
||||||
var nameLbl = UIFactory.CreateLabel(nameRow, "NameFilterLabel", "Name contains:", TextAnchor.MiddleLeft);
|
var nameLbl = UIFactory.CreateLabel(nameInputRow, "NameFilterLabel", "Name contains:", TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(nameLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(nameLbl.gameObject, minWidth: 110, flexibleWidth: 0);
|
||||||
|
|
||||||
nameInputField = UIFactory.CreateInputField(nameRow, "NameFilterInput", "...");
|
nameInputField = UIFactory.CreateInputField(nameInputRow, "NameFilterInput", "...");
|
||||||
UIFactory.SetLayoutElement(nameInputField.UIRoot, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(nameInputField.UIRoot, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
// Search button
|
// Search button
|
||||||
|
@ -7,7 +7,6 @@ using System.Text;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core;
|
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
@ -15,6 +14,7 @@ using UnityExplorer.UI.Widgets;
|
|||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.ObjectExplorer
|
namespace UnityExplorer.ObjectExplorer
|
||||||
{
|
{
|
||||||
@ -30,8 +30,8 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
SceneHandler.OnLoadedScenesChanged += SceneHandler_OnLoadedScenesChanged;
|
SceneHandler.OnLoadedScenesChanged += SceneHandler_OnLoadedScenesChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override GameObject UIRoot => m_uiRoot;
|
public override GameObject UIRoot => uiRoot;
|
||||||
private GameObject m_uiRoot;
|
private GameObject uiRoot;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether to automatically update per auto-update interval or not.
|
/// Whether to automatically update per auto-update interval or not.
|
||||||
@ -43,7 +43,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
private GameObject refreshRow;
|
private GameObject refreshRow;
|
||||||
private Dropdown sceneDropdown;
|
private Dropdown sceneDropdown;
|
||||||
private readonly Dictionary<Scene, Dropdown.OptionData> sceneToDropdownOption = new Dictionary<Scene, Dropdown.OptionData>();
|
private readonly Dictionary<Scene, Dropdown.OptionData> sceneToDropdownOption = new();
|
||||||
|
|
||||||
// scene loader
|
// scene loader
|
||||||
private Dropdown allSceneDropdown;
|
private Dropdown allSceneDropdown;
|
||||||
@ -181,13 +181,13 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
public override void ConstructUI(GameObject content)
|
public override void ConstructUI(GameObject content)
|
||||||
{
|
{
|
||||||
m_uiRoot = UIFactory.CreateUIObject("SceneExplorer", content);
|
uiRoot = UIFactory.CreateUIObject("SceneExplorer", content);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(m_uiRoot, true, true, true, true, 0, 2, 2, 2, 2);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(uiRoot, true, true, true, true, 0, 2, 2, 2, 2);
|
||||||
UIFactory.SetLayoutElement(m_uiRoot, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(uiRoot, flexibleHeight: 9999);
|
||||||
|
|
||||||
// Tool bar (top area)
|
// Tool bar (top area)
|
||||||
|
|
||||||
var toolbar = UIFactory.CreateVerticalGroup(m_uiRoot, "Toolbar", true, true, true, true, 2, new Vector4(2, 2, 2, 2),
|
var toolbar = UIFactory.CreateVerticalGroup(uiRoot, "Toolbar", true, true, true, true, 2, new Vector4(2, 2, 2, 2),
|
||||||
new Color(0.15f, 0.15f, 0.15f));
|
new Color(0.15f, 0.15f, 0.15f));
|
||||||
|
|
||||||
// Scene selector dropdown
|
// Scene selector dropdown
|
||||||
@ -198,7 +198,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
var dropLabel = UIFactory.CreateLabel(dropRow, "SelectorLabel", "Scene:", TextAnchor.MiddleLeft, Color.cyan, false, 15);
|
var dropLabel = UIFactory.CreateLabel(dropRow, "SelectorLabel", "Scene:", TextAnchor.MiddleLeft, Color.cyan, false, 15);
|
||||||
UIFactory.SetLayoutElement(dropLabel.gameObject, minHeight: 25, minWidth: 60, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(dropLabel.gameObject, minHeight: 25, minWidth: 60, flexibleWidth: 0);
|
||||||
|
|
||||||
var dropdownObj = UIFactory.CreateDropdown(dropRow, out sceneDropdown, "<notset>", 13, OnDropdownChanged);
|
var dropdownObj = UIFactory.CreateDropdown(dropRow, "SceneDropdown", out sceneDropdown, "<notset>", 13, OnDropdownChanged);
|
||||||
UIFactory.SetLayoutElement(dropdownObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(dropdownObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
SceneHandler.Update();
|
SceneHandler.Update();
|
||||||
@ -213,7 +213,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
//Filter input field
|
//Filter input field
|
||||||
var inputField = UIFactory.CreateInputField(filterRow, "FilterInput", "Search and press enter...");
|
var inputField = UIFactory.CreateInputField(filterRow, "FilterInput", "Search and press enter...");
|
||||||
inputField.Component.targetGraphic.color = new Color(0.2f, 0.2f, 0.2f);
|
inputField.Component.targetGraphic.color = new Color(0.2f, 0.2f, 0.2f);
|
||||||
RuntimeProvider.Instance.SetColorBlock(inputField.Component, new Color(0.4f, 0.4f, 0.4f), new Color(0.2f, 0.2f, 0.2f),
|
RuntimeHelper.SetColorBlock(inputField.Component, new Color(0.4f, 0.4f, 0.4f), new Color(0.2f, 0.2f, 0.2f),
|
||||||
new Color(0.08f, 0.08f, 0.08f));
|
new Color(0.08f, 0.08f, 0.08f));
|
||||||
UIFactory.SetLayoutElement(inputField.UIRoot, minHeight: 25);
|
UIFactory.SetLayoutElement(inputField.UIRoot, minHeight: 25);
|
||||||
//inputField.OnValueChanged += OnFilterInput;
|
//inputField.OnValueChanged += OnFilterInput;
|
||||||
@ -241,7 +241,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
// Transform Tree
|
// Transform Tree
|
||||||
|
|
||||||
var scrollPool = UIFactory.CreateScrollPool<TransformCell>(m_uiRoot, "TransformTree", out GameObject scrollObj,
|
var scrollPool = UIFactory.CreateScrollPool<TransformCell>(uiRoot, "TransformTree", out GameObject scrollObj,
|
||||||
out GameObject scrollContent, new Color(0.11f, 0.11f, 0.11f));
|
out GameObject scrollContent, new Color(0.11f, 0.11f, 0.11f));
|
||||||
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
||||||
UIFactory.SetLayoutElement(scrollContent, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(scrollContent, flexibleHeight: 9999);
|
||||||
@ -256,7 +256,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
ConstructSceneLoader();
|
ConstructSceneLoader();
|
||||||
|
|
||||||
RuntimeProvider.Instance.StartCoroutine(TempFixCoro());
|
RuntimeHelper.StartCoroutine(TempFixCoro());
|
||||||
}
|
}
|
||||||
|
|
||||||
// To "fix" a strange FPS drop issue with MelonLoader.
|
// To "fix" a strange FPS drop issue with MelonLoader.
|
||||||
@ -313,7 +313,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
{
|
{
|
||||||
if (SceneHandler.WasAbleToGetScenesInBuild)
|
if (SceneHandler.WasAbleToGetScenesInBuild)
|
||||||
{
|
{
|
||||||
var sceneLoaderObj = UIFactory.CreateVerticalGroup(m_uiRoot, "SceneLoader", true, true, true, true);
|
var sceneLoaderObj = UIFactory.CreateVerticalGroup(uiRoot, "SceneLoader", true, true, true, true);
|
||||||
UIFactory.SetLayoutElement(sceneLoaderObj, minHeight: 25);
|
UIFactory.SetLayoutElement(sceneLoaderObj, minHeight: 25);
|
||||||
|
|
||||||
// Title
|
// Title
|
||||||
@ -329,7 +329,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
// Dropdown
|
// Dropdown
|
||||||
|
|
||||||
var allSceneDropObj = UIFactory.CreateDropdown(sceneLoaderObj, out allSceneDropdown, "", 14, null);
|
var allSceneDropObj = UIFactory.CreateDropdown(sceneLoaderObj, "SceneLoaderDropdown", out allSceneDropdown, "", 14, null);
|
||||||
UIFactory.SetLayoutElement(allSceneDropObj, minHeight: 25, minWidth: 150, flexibleWidth: 0, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(allSceneDropObj, minHeight: 25, minWidth: 150, flexibleWidth: 0, flexibleHeight: 0);
|
||||||
|
|
||||||
RefreshSceneLoaderOptions(string.Empty);
|
RefreshSceneLoaderOptions(string.Empty);
|
||||||
@ -353,8 +353,8 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
};
|
};
|
||||||
|
|
||||||
var disabledColor = new Color(0.24f, 0.24f, 0.24f);
|
var disabledColor = new Color(0.24f, 0.24f, 0.24f);
|
||||||
RuntimeProvider.Instance.SetColorBlock(loadButton.Component, disabled: disabledColor);
|
RuntimeHelper.SetColorBlock(loadButton.Component, disabled: disabledColor);
|
||||||
RuntimeProvider.Instance.SetColorBlock(loadAdditiveButton.Component, disabled: disabledColor);
|
RuntimeHelper.SetColorBlock(loadAdditiveButton.Component, disabled: disabledColor);
|
||||||
|
|
||||||
loadButton.Component.interactable = false;
|
loadButton.Component.interactable = false;
|
||||||
loadAdditiveButton.Component.interactable = false;
|
loadAdditiveButton.Component.interactable = false;
|
||||||
|
@ -11,9 +11,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
{
|
{
|
||||||
public static class SceneHandler
|
public static class SceneHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>The currently inspected Scene.</summary>
|
||||||
/// The currently inspected Scene.
|
|
||||||
/// </summary>
|
|
||||||
public static Scene? SelectedScene
|
public static Scene? SelectedScene
|
||||||
{
|
{
|
||||||
get => selectedScene;
|
get => selectedScene;
|
||||||
@ -27,63 +25,39 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
}
|
}
|
||||||
private static Scene? selectedScene;
|
private static Scene? selectedScene;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>The GameObjects in the currently inspected scene.</summary>
|
||||||
/// The GameObjects in the currently inspected scene.
|
|
||||||
/// </summary>
|
|
||||||
public static GameObject[] CurrentRootObjects { get; private set; } = new GameObject[0];
|
public static GameObject[] CurrentRootObjects { get; private set; } = new GameObject[0];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>All currently loaded Scenes.</summary>
|
||||||
/// All currently loaded Scenes.
|
public static List<Scene> LoadedScenes { get; private set; } = new();
|
||||||
/// </summary>
|
|
||||||
public static List<Scene> LoadedScenes { get; private set; } = new List<Scene>();
|
|
||||||
private static HashSet<Scene> previousLoadedScenes;
|
private static HashSet<Scene> previousLoadedScenes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>The names of all scenes in the build settings, if they could be retrieved.</summary>
|
||||||
/// The names of all scenes in the build settings, if they could be retrieved.
|
public static List<string> AllSceneNames { get; private set; } = new();
|
||||||
/// </summary>
|
|
||||||
public static readonly List<string> AllSceneNames = new List<string>();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>Invoked when the currently inspected Scene changes. The argument is the new scene.</summary>
|
||||||
/// Whether or not we successfuly retrieved the names of the scenes in the build settings.
|
|
||||||
/// </summary>
|
|
||||||
public static bool WasAbleToGetScenesInBuild { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Invoked when the currently inspected Scene changes. The argument is the new scene.
|
|
||||||
/// </summary>
|
|
||||||
public static event Action<Scene> OnInspectedSceneChanged;
|
public static event Action<Scene> OnInspectedSceneChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>Invoked whenever the list of currently loaded Scenes changes. The argument contains all loaded scenes after the change.</summary>
|
||||||
/// Invoked whenever the list of currently loaded Scenes changes. The argument contains all loaded scenes after the change.
|
|
||||||
/// </summary>
|
|
||||||
public static event Action<List<Scene>> OnLoadedScenesChanged;
|
public static event Action<List<Scene>> OnLoadedScenesChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>Generally will be 2, unless DontDestroyExists == false, then this will be 1.</summary>
|
||||||
/// Equivalent to <see cref="SceneManager.sceneCount"/> + 2, to include 'DontDestroyOnLoad' and the 'None' scene.
|
internal static int DefaultSceneCount => 1 + (DontDestroyExists ? 1 : 0);
|
||||||
/// </summary>
|
|
||||||
public static int LoadedSceneCount => SceneManager.sceneCount + 2;
|
|
||||||
|
|
||||||
internal static Scene DontDestroyScene => DontDestroyMe.scene;
|
|
||||||
internal static int DontDestroyHandle => DontDestroyScene.handle;
|
|
||||||
|
|
||||||
internal static GameObject DontDestroyMe
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (!dontDestroyObject)
|
|
||||||
{
|
|
||||||
dontDestroyObject = new GameObject("DontDestroyMe");
|
|
||||||
GameObject.DontDestroyOnLoad(dontDestroyObject);
|
|
||||||
}
|
|
||||||
return dontDestroyObject;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static GameObject dontDestroyObject;
|
|
||||||
|
|
||||||
|
/// <summary>Whether or not we are currently inspecting the "HideAndDontSave" asset scene.</summary>
|
||||||
public static bool InspectingAssetScene => SelectedScene.HasValue && SelectedScene.Value == default;
|
public static bool InspectingAssetScene => SelectedScene.HasValue && SelectedScene.Value == default;
|
||||||
|
|
||||||
|
/// <summary>Whether or not we successfuly retrieved the names of the scenes in the build settings.</summary>
|
||||||
|
public static bool WasAbleToGetScenesInBuild { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>Whether or not the "DontDestroyOnLoad" scene exists in this game.</summary>
|
||||||
|
public static bool DontDestroyExists { get; private set; }
|
||||||
|
|
||||||
internal static void Init()
|
internal static void Init()
|
||||||
{
|
{
|
||||||
|
// Check if the game has "DontDestroyOnLoad"
|
||||||
|
DontDestroyExists = Scene.GetNameInternal(-12) == "DontDestroyOnLoad";
|
||||||
|
|
||||||
// Try to get all scenes in the build settings. This may not work.
|
// Try to get all scenes in the build settings. This may not work.
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -111,8 +85,9 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
internal static void Update()
|
internal static void Update()
|
||||||
{
|
{
|
||||||
// check if the loaded scenes changed. always confirm DontDestroy / HideAndDontSave
|
// check if the loaded scenes changed. always confirm DontDestroy / HideAndDontSave
|
||||||
int confirmedCount = 2;
|
int confirmedCount = DefaultSceneCount;
|
||||||
bool inspectedExists = SelectedScene == DontDestroyScene || (SelectedScene.HasValue && SelectedScene.Value == default);
|
bool inspectedExists = (SelectedScene.HasValue && SelectedScene.Value.handle == -12)
|
||||||
|
|| (SelectedScene.HasValue && SelectedScene.Value.handle == -1);
|
||||||
|
|
||||||
LoadedScenes.Clear();
|
LoadedScenes.Clear();
|
||||||
|
|
||||||
@ -133,8 +108,9 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
LoadedScenes.Add(scene);
|
LoadedScenes.Add(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadedScenes.Add(DontDestroyScene);
|
if (DontDestroyExists)
|
||||||
LoadedScenes.Add(default);
|
LoadedScenes.Add(new Scene { m_Handle = -12 });
|
||||||
|
LoadedScenes.Add(new Scene { m_Handle = -1 });
|
||||||
|
|
||||||
bool anyChange = confirmedCount != LoadedScenes.Count;
|
bool anyChange = confirmedCount != LoadedScenes.Count;
|
||||||
|
|
||||||
@ -150,10 +126,10 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
// Finally, update the root objects list.
|
// Finally, update the root objects list.
|
||||||
if (SelectedScene != null && ((Scene)SelectedScene).IsValid())
|
if (SelectedScene != null && ((Scene)SelectedScene).IsValid())
|
||||||
CurrentRootObjects = RuntimeProvider.Instance.GetRootGameObjects((Scene)SelectedScene);
|
CurrentRootObjects = RuntimeHelper.GetRootGameObjects((Scene)SelectedScene);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var allObjects = RuntimeProvider.Instance.FindObjectsOfTypeAll(typeof(GameObject));
|
var allObjects = RuntimeHelper.FindObjectsOfTypeAll(typeof(GameObject));
|
||||||
var objects = new List<GameObject>();
|
var objects = new List<GameObject>();
|
||||||
foreach (var obj in allObjects)
|
foreach (var obj in allObjects)
|
||||||
{
|
{
|
||||||
|
@ -5,9 +5,10 @@ using System.Reflection;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityExplorer.Core;
|
using UnityExplorer.Runtime;
|
||||||
using UnityExplorer.Core.Runtime;
|
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.Input;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.ObjectExplorer
|
namespace UnityExplorer.ObjectExplorer
|
||||||
{
|
{
|
||||||
@ -35,26 +36,19 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
|
|
||||||
public static class SearchProvider
|
public static class SearchProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
private static bool Filter(Scene scene, SceneFilter filter)
|
private static bool Filter(Scene scene, SceneFilter filter)
|
||||||
{
|
{
|
||||||
switch (filter)
|
return filter switch
|
||||||
{
|
{
|
||||||
case SceneFilter.Any:
|
SceneFilter.Any => true,
|
||||||
return true;
|
SceneFilter.DontDestroyOnLoad => scene.handle == -12,
|
||||||
case SceneFilter.DontDestroyOnLoad:
|
SceneFilter.HideAndDontSave => scene == default,
|
||||||
return scene == SceneHandler.DontDestroyScene;
|
SceneFilter.ActivelyLoaded => scene.buildIndex != -1,
|
||||||
case SceneFilter.HideAndDontSave:
|
_ => false,
|
||||||
return scene == default;
|
};
|
||||||
case SceneFilter.ActivelyLoaded:
|
|
||||||
return scene != SceneHandler.DontDestroyScene && scene != default;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static List<object> UnityObjectSearch(string input, string customTypeInput, SearchContext context,
|
internal static List<object> UnityObjectSearch(string input, string customTypeInput, ChildFilter childFilter, SceneFilter sceneFilter)
|
||||||
ChildFilter childFilter, SceneFilter sceneFilter)
|
|
||||||
{
|
{
|
||||||
var results = new List<object>();
|
var results = new List<object>();
|
||||||
|
|
||||||
@ -75,7 +69,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
if (searchType == null)
|
if (searchType == null)
|
||||||
searchType = typeof(UnityEngine.Object);
|
searchType = typeof(UnityEngine.Object);
|
||||||
|
|
||||||
var allObjects = RuntimeProvider.Instance.FindObjectsOfTypeAll(searchType);
|
var allObjects = RuntimeHelper.FindObjectsOfTypeAll(searchType);
|
||||||
|
|
||||||
// perform filter comparers
|
// perform filter comparers
|
||||||
|
|
||||||
@ -169,7 +163,7 @@ namespace UnityExplorer.ObjectExplorer
|
|||||||
"<instance>k__BackingField",
|
"<instance>k__BackingField",
|
||||||
};
|
};
|
||||||
|
|
||||||
internal static List<object> SingletonSearch(string input)
|
internal static List<object> InstanceSearch(string input)
|
||||||
{
|
{
|
||||||
var instances = new List<object>();
|
var instances = new List<object>();
|
||||||
|
|
||||||
|
@ -2,21 +2,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
|
||||||
using BF = System.Reflection.BindingFlags;
|
|
||||||
using System.Text;
|
|
||||||
using UnhollowerBaseLib;
|
|
||||||
using UnhollowerRuntimeLib;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Events;
|
|
||||||
using UnityEngine.SceneManagement;
|
|
||||||
using System.Collections;
|
|
||||||
using UnityEngine.UI;
|
|
||||||
using UnityEngine.EventSystems;
|
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Runtime
|
namespace UnityExplorer.Runtime
|
||||||
{
|
{
|
||||||
public class Il2CppProvider : RuntimeHelper
|
public class Il2CppHelper : UERuntimeHelper
|
||||||
{
|
{
|
||||||
public override void SetupEvents()
|
public override void SetupEvents()
|
||||||
{
|
{
|
||||||
@ -41,7 +31,7 @@ namespace UnityExplorer.Core.Runtime
|
|||||||
// These methods currently cause a crash in most il2cpp games,
|
// These methods currently cause a crash in most il2cpp games,
|
||||||
// even from doing "GetParameters()" on the MemberInfo.
|
// even from doing "GetParameters()" on the MemberInfo.
|
||||||
// Blacklisting until the issue is fixed in Unhollower.
|
// Blacklisting until the issue is fixed in Unhollower.
|
||||||
public static HashSet<string> defaultIl2CppBlacklist = new HashSet<string>
|
public static HashSet<string> defaultIl2CppBlacklist = new()
|
||||||
{
|
{
|
||||||
// These were deprecated a long time ago, still show up in some IL2CPP games for some reason
|
// These were deprecated a long time ago, still show up in some IL2CPP games for some reason
|
||||||
"UnityEngine.MonoBehaviour.allowPrefabModeInPlayMode",
|
"UnityEngine.MonoBehaviour.allowPrefabModeInPlayMode",
|
@ -1,20 +1,10 @@
|
|||||||
#if MONO
|
#if MONO
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Events;
|
|
||||||
using UnityEngine.EventSystems;
|
|
||||||
using UnityEngine.SceneManagement;
|
|
||||||
using UnityEngine.UI;
|
|
||||||
using UnityExplorer;
|
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Runtime
|
namespace UnityExplorer.Runtime
|
||||||
{
|
{
|
||||||
public class MonoProvider : RuntimeHelper
|
public class MonoHelper : UERuntimeHelper
|
||||||
{
|
{
|
||||||
public override void SetupEvents()
|
public override void SetupEvents()
|
||||||
{
|
{
|
@ -8,21 +8,23 @@ using UnityEngine;
|
|||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
|
||||||
namespace UnityExplorer.Core.Runtime
|
namespace UnityExplorer.Runtime
|
||||||
{
|
{
|
||||||
public abstract class RuntimeHelper
|
// Not really that necessary anymore, can eventually just be refactored away into the few classes that use this class.
|
||||||
|
|
||||||
|
public abstract class UERuntimeHelper
|
||||||
{
|
{
|
||||||
public static RuntimeHelper Instance;
|
public static UERuntimeHelper Instance;
|
||||||
|
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
#if CPP
|
#if CPP
|
||||||
Instance = new Il2CppProvider();
|
Instance = new Il2CppHelper();
|
||||||
#else
|
#else
|
||||||
Instance = new MonoProvider();
|
Instance = new MonoHelper();
|
||||||
#endif
|
#endif
|
||||||
Instance.SetupEvents();
|
Instance.SetupEvents();
|
||||||
|
|
||||||
@ -35,9 +37,7 @@ namespace UnityExplorer.Core.Runtime
|
|||||||
|
|
||||||
public abstract void SetupEvents();
|
public abstract void SetupEvents();
|
||||||
|
|
||||||
#region Reflection Blacklist
|
private static readonly HashSet<string> currentBlacklist = new();
|
||||||
|
|
||||||
private static readonly HashSet<string> currentBlacklist = new HashSet<string>();
|
|
||||||
|
|
||||||
public virtual string[] DefaultReflectionBlacklist => new string[0];
|
public virtual string[] DefaultReflectionBlacklist => new string[0];
|
||||||
|
|
||||||
@ -88,7 +88,5 @@ namespace UnityExplorer.Core.Runtime
|
|||||||
|
|
||||||
return currentBlacklist.Contains(sig);
|
return currentBlacklist.Contains(sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -14,7 +14,7 @@ using UnhollowerBaseLib;
|
|||||||
|
|
||||||
namespace UnityExplorer.Tests
|
namespace UnityExplorer.Tests
|
||||||
{
|
{
|
||||||
public static class TestClass
|
public class TestClass
|
||||||
{
|
{
|
||||||
static TestClass()
|
static TestClass()
|
||||||
{
|
{
|
||||||
@ -24,21 +24,31 @@ namespace UnityExplorer.Tests
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static object LiterallyAnything = null;
|
||||||
|
|
||||||
// Test enumerables
|
// Test enumerables
|
||||||
|
public static int[,,] MultiDimensionalArray = new int[45, 45, 45];
|
||||||
public static List<object> ListOfInts;
|
public static List<object> ListOfInts;
|
||||||
public static List<List<List<string>>> NestedList;
|
public static List<List<List<string>>> NestedList;
|
||||||
public static IDictionary MixedDictionary;
|
public static IDictionary MixedDictionary;
|
||||||
public static Hashtable Hashtable;
|
public static Hashtable Hashtable;
|
||||||
public static byte[] ByteArray = new byte[16];
|
public static byte[] ByteArray = new byte[16];
|
||||||
public static List<short> ABigList = new List<short>(10000);
|
public static List<short> ABigList = new(10000);
|
||||||
|
|
||||||
// Test const behaviour (should be a readonly field)
|
// Test const behaviour (should be a readonly field)
|
||||||
public const int ConstantInt5 = 5;
|
public const int ConstantInt5 = 5;
|
||||||
|
|
||||||
// Testing other InteractiveValues
|
// Testing other InteractiveValues
|
||||||
|
public static BindingFlags EnumTest;
|
||||||
|
public static CameraClearFlags EnumTest2;
|
||||||
public static Color Color = Color.magenta;
|
public static Color Color = Color.magenta;
|
||||||
public static Color32 Color32 = Color.red;
|
public static Color32 Color32 = Color.red;
|
||||||
public static string ALongString = new string('#', 10000);
|
public static string ALongString = new('#', 10000);
|
||||||
|
|
||||||
|
public static float[] AParseTest(ref List<float[,,]> arg0, ref float[,] arg1)
|
||||||
|
{
|
||||||
|
return new float[] { 1, 2, 3 };
|
||||||
|
}
|
||||||
|
|
||||||
public static List<object> RandomList
|
public static List<object> RandomList
|
||||||
{
|
{
|
||||||
@ -52,25 +62,27 @@ namespace UnityExplorer.Tests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int this[int index]
|
||||||
|
{
|
||||||
|
get => UnityEngine.Random.Range(0, int.MaxValue);
|
||||||
|
set => ExplorerCore.Log(index);
|
||||||
|
}
|
||||||
|
|
||||||
// Test methods
|
// Test methods
|
||||||
|
|
||||||
private static object GetRandomObject()
|
private static object GetRandomObject()
|
||||||
{
|
{
|
||||||
object ret = null;
|
return UnityEngine.Random.Range(0, 7) switch
|
||||||
|
|
||||||
int ran = UnityEngine.Random.Range(0, 7);
|
|
||||||
switch (ran)
|
|
||||||
{
|
{
|
||||||
case 0: return null;
|
0 => null,
|
||||||
case 1: return 123;
|
1 => 123,
|
||||||
case 2: return true;
|
2 => true,
|
||||||
case 3: return "hello";
|
3 => "hello",
|
||||||
case 4: return 50.5f;
|
4 => 50.5f,
|
||||||
case 5: return CameraClearFlags.Color;
|
5 => CameraClearFlags.Color,
|
||||||
case 6: return new List<string> { "one", "two" };
|
6 => new List<string> { "one", "two" },
|
||||||
}
|
_ => null,
|
||||||
|
};
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TestComponent<T>() where T : Component
|
public static void TestComponent<T>() where T : Component
|
||||||
@ -78,9 +90,19 @@ namespace UnityExplorer.Tests
|
|||||||
ExplorerCore.Log($"Test3 {typeof(T).FullName}");
|
ExplorerCore.Log($"Test3 {typeof(T).FullName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void TestArgumentParse(string s, int i, Color color, CameraClearFlags flags, Vector3 vector, Quaternion quaternion)
|
public static void TestArgumentParse(string _string,
|
||||||
|
int integer,
|
||||||
|
Color color,
|
||||||
|
CameraClearFlags flags,
|
||||||
|
Vector3 vector,
|
||||||
|
Quaternion quaternion,
|
||||||
|
object obj,
|
||||||
|
Type type,
|
||||||
|
GameObject go)
|
||||||
{
|
{
|
||||||
ExplorerCore.Log($"{s}, {i}, {color.ToString()}, {flags}, {vector.ToString()}, {quaternion.ToString()}");
|
ExplorerCore.Log($"_string: {_string}, integer: {integer}, color: {color.ToString()}, flags: {flags}, " +
|
||||||
|
$"vector: {vector.ToString()}, quaternion: {quaternion.ToString()}, obj: {obj?.ToString() ?? "null"}," +
|
||||||
|
$"type: {type?.FullName ?? "null"}, go: {go?.ToString() ?? "null"}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Init_Mono()
|
private static void Init_Mono()
|
80
src/UI/DisplayManager.cs
Normal file
80
src/UI/DisplayManager.cs
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityExplorer.Config;
|
||||||
|
using UniverseLib;
|
||||||
|
using UniverseLib.Input;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI
|
||||||
|
{
|
||||||
|
public static class DisplayManager
|
||||||
|
{
|
||||||
|
public static int ActiveDisplayIndex { get; private set; }
|
||||||
|
public static Display ActiveDisplay => Display.displays[ActiveDisplayIndex];
|
||||||
|
|
||||||
|
public static int Width => ActiveDisplay.renderingWidth;
|
||||||
|
public static int Height => ActiveDisplay.renderingHeight;
|
||||||
|
|
||||||
|
public static Vector3 MousePosition => Display.RelativeMouseAt(InputManager.MousePosition);
|
||||||
|
public static bool MouseInTargetDisplay => MousePosition.z == ActiveDisplayIndex;
|
||||||
|
|
||||||
|
private static Camera canvasCamera;
|
||||||
|
|
||||||
|
internal static void Init()
|
||||||
|
{
|
||||||
|
SetDisplay(ConfigManager.Target_Display.Value);
|
||||||
|
ConfigManager.Target_Display.OnValueChanged += SetDisplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetDisplay(int display)
|
||||||
|
{
|
||||||
|
if (ActiveDisplayIndex == display)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Display.displays.Length <= display)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning($"Cannot set display index to {display} as there are not enough monitors connected!");
|
||||||
|
|
||||||
|
if (ConfigManager.Target_Display.Value == display)
|
||||||
|
ConfigManager.Target_Display.Value = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ActiveDisplayIndex = display;
|
||||||
|
ActiveDisplay.Activate();
|
||||||
|
|
||||||
|
UIManager.UICanvas.targetDisplay = display;
|
||||||
|
|
||||||
|
// ensure a camera is targeting the display
|
||||||
|
if (!Camera.main || Camera.main.targetDisplay != display)
|
||||||
|
{
|
||||||
|
if (!canvasCamera)
|
||||||
|
{
|
||||||
|
canvasCamera = new GameObject("UnityExplorer_CanvasCamera").AddComponent<Camera>();
|
||||||
|
GameObject.DontDestroyOnLoad(canvasCamera.gameObject);
|
||||||
|
canvasCamera.hideFlags = HideFlags.HideAndDontSave;
|
||||||
|
}
|
||||||
|
canvasCamera.targetDisplay = display;
|
||||||
|
}
|
||||||
|
|
||||||
|
RuntimeHelper.StartCoroutine(FixPanels());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerator FixPanels()
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
yield return null;
|
||||||
|
|
||||||
|
foreach (var panel in UIManager.UIPanels.Values)
|
||||||
|
{
|
||||||
|
panel.EnsureValidSize();
|
||||||
|
panel.EnsureValidPosition();
|
||||||
|
panel.Dragger.OnEndResize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
55
src/UI/Notification.cs
Normal file
55
src/UI/Notification.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UniverseLib.Input;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI
|
||||||
|
{
|
||||||
|
public static class Notification
|
||||||
|
{
|
||||||
|
private static Text popupLabel;
|
||||||
|
|
||||||
|
private static string _currentNotification;
|
||||||
|
private static float _timeOfLastNotification;
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
ConstructUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowMessage(string message)
|
||||||
|
{
|
||||||
|
popupLabel.text = message;
|
||||||
|
_currentNotification = message;
|
||||||
|
_timeOfLastNotification = Time.realtimeSinceStartup;
|
||||||
|
|
||||||
|
popupLabel.transform.localPosition = UIManager.UIRootRect.InverseTransformPoint(DisplayManager.MousePosition) + (Vector3.up * 25);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Update()
|
||||||
|
{
|
||||||
|
if (_currentNotification != null)
|
||||||
|
{
|
||||||
|
if (Time.realtimeSinceStartup - _timeOfLastNotification > 2f)
|
||||||
|
{
|
||||||
|
_currentNotification = null;
|
||||||
|
popupLabel.text = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ConstructUI()
|
||||||
|
{
|
||||||
|
|
||||||
|
popupLabel = UIFactory.CreateLabel(UIManager.UIRoot, "ClipboardNotification", "", TextAnchor.MiddleCenter);
|
||||||
|
popupLabel.rectTransform.sizeDelta = new(500, 100);
|
||||||
|
popupLabel.gameObject.AddComponent<Outline>();
|
||||||
|
var popupGroup = popupLabel.gameObject.AddComponent<CanvasGroup>();
|
||||||
|
popupGroup.blocksRaycasts = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -6,11 +6,12 @@ using System.Text;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.CSConsole;
|
using UnityExplorer.CSConsole;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
@ -55,15 +56,6 @@ namespace UnityExplorer.UI.Panels
|
|||||||
ConsoleController.Update();
|
ConsoleController.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Saving
|
|
||||||
|
|
||||||
public override void DoSaveToConfigElement()
|
|
||||||
{
|
|
||||||
ConfigManager.CSConsoleData.Value = this.ToSaveData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager() => ConfigManager.CSConsoleData.Value;
|
|
||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
public override void OnFinishResize(RectTransform panel)
|
public override void OnFinishResize(RectTransform panel)
|
||||||
@ -83,7 +75,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
{
|
{
|
||||||
// Tools Row
|
// Tools Row
|
||||||
|
|
||||||
var toolsRow = UIFactory.CreateHorizontalGroup(this.content, "ToggleRow", false, false, true, true, 5, new Vector4(8, 8, 10, 5),
|
var toolsRow = UIFactory.CreateHorizontalGroup(this.uiRoot, "ToggleRow", false, false, true, true, 5, new Vector4(8, 8, 10, 5),
|
||||||
default, TextAnchor.MiddleLeft);
|
default, TextAnchor.MiddleLeft);
|
||||||
UIFactory.SetLayoutElement(toolsRow, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(toolsRow, minHeight: 25, flexibleHeight: 0, flexibleWidth: 9999);
|
||||||
|
|
||||||
@ -101,7 +93,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// Help dropdown
|
// Help dropdown
|
||||||
|
|
||||||
var helpDrop = UIFactory.CreateDropdown(toolsRow, out var dropdown, "Help", 14, null);
|
var helpDrop = UIFactory.CreateDropdown(toolsRow, "HelpDropdown", out var dropdown, "Help", 14, null);
|
||||||
UIFactory.SetLayoutElement(helpDrop, minHeight: 25, minWidth: 100);
|
UIFactory.SetLayoutElement(helpDrop, minHeight: 25, minWidth: 100);
|
||||||
HelpDropdown = dropdown;
|
HelpDropdown = dropdown;
|
||||||
HelpDropdown.onValueChanged.AddListener((int val) => { this.OnHelpDropdownChanged?.Invoke(val); });
|
HelpDropdown.onValueChanged.AddListener((int val) => { this.OnHelpDropdownChanged?.Invoke(val); });
|
||||||
@ -132,7 +124,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// Console Input
|
// Console Input
|
||||||
|
|
||||||
var inputArea = UIFactory.CreateUIObject("InputGroup", content);
|
var inputArea = UIFactory.CreateUIObject("InputGroup", uiRoot);
|
||||||
UIFactory.SetLayoutElement(inputArea, flexibleWidth: 9999, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(inputArea, flexibleWidth: 9999, flexibleHeight: 9999);
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(inputArea, false, true, true, true);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(inputArea, false, true, true, true);
|
||||||
inputArea.AddComponent<Image>().color = Color.white;
|
inputArea.AddComponent<Image>().color = Color.white;
|
||||||
@ -199,7 +191,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
Input.PlaceholderText.font = UniversalUI.ConsoleFont;
|
Input.PlaceholderText.font = UniversalUI.ConsoleFont;
|
||||||
HighlightText.font = UniversalUI.ConsoleFont;
|
HighlightText.font = UniversalUI.ConsoleFont;
|
||||||
|
|
||||||
RuntimeProvider.Instance.StartCoroutine(DelayedLayoutSetup());
|
RuntimeHelper.StartCoroutine(DelayedLayoutSetup());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator DelayedLayoutSetup()
|
private IEnumerator DelayedLayoutSetup()
|
||||||
@ -210,8 +202,8 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
public void SetInputLayout()
|
public void SetInputLayout()
|
||||||
{
|
{
|
||||||
Input.Rect.offsetMin = new Vector2(52, Input.Rect.offsetMin.y);
|
Input.Transform.offsetMin = new Vector2(52, Input.Transform.offsetMin.y);
|
||||||
Input.Rect.offsetMax = new Vector2(2, Input.Rect.offsetMax.y);
|
Input.Transform.offsetMax = new Vector2(2, Input.Transform.offsetMax.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
119
src/UI/Panels/ClipboardPanel.cs
Normal file
119
src/UI/Panels/ClipboardPanel.cs
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.CacheObject;
|
||||||
|
using UnityExplorer.CacheObject.Views;
|
||||||
|
using UnityExplorer.Config;
|
||||||
|
using UniverseLib;
|
||||||
|
using UniverseLib.Input;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Panels
|
||||||
|
{
|
||||||
|
public class ClipboardPanel : UIPanel
|
||||||
|
{
|
||||||
|
public static object Current { get; private set; }
|
||||||
|
|
||||||
|
public override UIManager.Panels PanelType => UIManager.Panels.Clipboard;
|
||||||
|
public override string Name => "Clipboard";
|
||||||
|
public override int MinWidth => 500;
|
||||||
|
public override int MinHeight => 95;
|
||||||
|
public override bool CanDragAndResize => true;
|
||||||
|
public override bool NavButtonWanted => true;
|
||||||
|
public override bool ShouldSaveActiveState => true;
|
||||||
|
public override bool ShowByDefault => true;
|
||||||
|
|
||||||
|
private static Text CurrentPasteLabel;
|
||||||
|
|
||||||
|
public static void Copy(object obj)
|
||||||
|
{
|
||||||
|
Current = obj;
|
||||||
|
Notification.ShowMessage("Copied!");
|
||||||
|
UpdateCurrentPasteInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool TryPaste(Type targetType, out object paste)
|
||||||
|
{
|
||||||
|
paste = Current;
|
||||||
|
var pasteType = Current?.GetActualType();
|
||||||
|
|
||||||
|
if (Current != null && !targetType.IsAssignableFrom(pasteType))
|
||||||
|
{
|
||||||
|
Notification.ShowMessage($"Cannot assign '{pasteType.Name}' to '{targetType.Name}'!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Notification.ShowMessage("Pasted!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ClearClipboard()
|
||||||
|
{
|
||||||
|
Current = null;
|
||||||
|
UpdateCurrentPasteInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void UpdateCurrentPasteInfo()
|
||||||
|
{
|
||||||
|
CurrentPasteLabel.text = ToStringUtility.ToStringWithType(Current, typeof(object), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void InspectClipboard()
|
||||||
|
{
|
||||||
|
if (Current.IsNullOrDestroyed())
|
||||||
|
{
|
||||||
|
Notification.ShowMessage("Cannot inspect a null or destroyed object!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InspectorManager.Inspect(Current);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected internal override void DoSetDefaultPosAndAnchors()
|
||||||
|
{
|
||||||
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, MinWidth);
|
||||||
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
||||||
|
this.Rect.anchorMin = new Vector2(0.1f, 0.05f);
|
||||||
|
this.Rect.anchorMax = new Vector2(0.4f, 0.15f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ConstructPanelContent()
|
||||||
|
{
|
||||||
|
this.UIRoot.GetComponent<Image>().color = new(0.1f, 0.1f, 0.1f);
|
||||||
|
|
||||||
|
// Actual panel content
|
||||||
|
|
||||||
|
var firstRow = UIFactory.CreateHorizontalGroup(UIRoot, "FirstRow", false, false, true, true, 5, new(2,2,2,2), new(1,1,1,0));
|
||||||
|
UIFactory.SetLayoutElement(firstRow, minHeight: 25, flexibleWidth: 999);
|
||||||
|
|
||||||
|
// Title for "Current Paste:"
|
||||||
|
var currentPasteTitle = UIFactory.CreateLabel(firstRow, "CurrentPasteTitle", "Current paste:", TextAnchor.MiddleLeft, color: Color.grey);
|
||||||
|
UIFactory.SetLayoutElement(currentPasteTitle.gameObject, minHeight: 25, minWidth: 100, flexibleWidth: 999);
|
||||||
|
|
||||||
|
// Clear clipboard button
|
||||||
|
var clearButton = UIFactory.CreateButton(firstRow, "ClearPasteButton", "Clear Clipboard");
|
||||||
|
UIFactory.SetLayoutElement(clearButton.Component.gameObject, minWidth: 120, minHeight: 25, flexibleWidth: 0);
|
||||||
|
clearButton.OnClick += () => Copy(null);
|
||||||
|
|
||||||
|
// Current Paste info row
|
||||||
|
var currentPasteHolder = UIFactory.CreateHorizontalGroup(UIRoot, "SecondRow", false, false, true, true, 0,
|
||||||
|
new(2, 2, 2, 2), childAlignment: TextAnchor.UpperCenter);
|
||||||
|
|
||||||
|
// Actual current paste info label
|
||||||
|
CurrentPasteLabel = UIFactory.CreateLabel(currentPasteHolder, "CurrentPasteInfo", "not set", TextAnchor.UpperLeft);
|
||||||
|
UIFactory.SetLayoutElement(CurrentPasteLabel.gameObject, minHeight: 25, minWidth: 100, flexibleWidth: 999, flexibleHeight: 999);
|
||||||
|
UpdateCurrentPasteInfo();
|
||||||
|
|
||||||
|
// Inspect button
|
||||||
|
var inspectButton = UIFactory.CreateButton(currentPasteHolder, "InspectButton", "Inspect");
|
||||||
|
UIFactory.SetLayoutElement(inspectButton.Component.gameObject, minHeight: 25, flexibleHeight: 0, minWidth: 80, flexibleWidth: 0);
|
||||||
|
inspectButton.OnClick += InspectClipboard;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,12 +4,14 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Hooks;
|
using UnityExplorer.Hooks;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
@ -46,10 +48,6 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public Text EditorInputText { get; private set; }
|
public Text EditorInputText { get; private set; }
|
||||||
public Text EditorHighlightText { get; private set; }
|
public Text EditorHighlightText { get; private set; }
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager() => ConfigManager.HookManagerData.Value;
|
|
||||||
|
|
||||||
public override void DoSaveToConfigElement() => ConfigManager.HookManagerData.Value = this.ToSaveData();
|
|
||||||
|
|
||||||
private void OnClassInputAddClicked()
|
private void OnClassInputAddClicked()
|
||||||
{
|
{
|
||||||
HookManager.Instance.OnClassSelectedForHooks(this.classSelectorInputField.Text);
|
HookManager.Instance.OnClassSelectedForHooks(this.classSelectorInputField.Text);
|
||||||
@ -85,7 +83,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
{
|
{
|
||||||
// ~~~~~~~~~ Active hooks scroll pool
|
// ~~~~~~~~~ Active hooks scroll pool
|
||||||
|
|
||||||
currentHooksPanel = UIFactory.CreateUIObject("CurrentHooksPanel", this.content);
|
currentHooksPanel = UIFactory.CreateUIObject("CurrentHooksPanel", this.uiRoot);
|
||||||
UIFactory.SetLayoutElement(currentHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(currentHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(currentHooksPanel, true, true, true, true);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(currentHooksPanel, true, true, true, true);
|
||||||
|
|
||||||
@ -111,7 +109,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// ~~~~~~~~~ Add hooks panel
|
// ~~~~~~~~~ Add hooks panel
|
||||||
|
|
||||||
addHooksPanel = UIFactory.CreateUIObject("AddHooksPanel", this.content);
|
addHooksPanel = UIFactory.CreateUIObject("AddHooksPanel", this.uiRoot);
|
||||||
UIFactory.SetLayoutElement(addHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(addHooksPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(addHooksPanel, true, true, true, true);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(addHooksPanel, true, true, true, true);
|
||||||
|
|
||||||
@ -138,7 +136,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// ~~~~~~~~~ Hook source editor panel
|
// ~~~~~~~~~ Hook source editor panel
|
||||||
|
|
||||||
editorPanel = UIFactory.CreateUIObject("HookSourceEditor", this.content);
|
editorPanel = UIFactory.CreateUIObject("HookSourceEditor", this.uiRoot);
|
||||||
UIFactory.SetLayoutElement(editorPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(editorPanel, flexibleHeight: 9999, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(editorPanel, true, true, true, true);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(editorPanel, true, true, true, true);
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Inspectors;
|
using UnityExplorer.Inspectors;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
|
||||||
@ -24,6 +24,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public override int MinHeight => 350;
|
public override int MinHeight => 350;
|
||||||
|
|
||||||
public GameObject NavbarHolder;
|
public GameObject NavbarHolder;
|
||||||
|
public Dropdown MouseInspectDropdown;
|
||||||
public GameObject ContentHolder;
|
public GameObject ContentHolder;
|
||||||
public RectTransform ContentRect;
|
public RectTransform ContentRect;
|
||||||
|
|
||||||
@ -43,13 +44,6 @@ namespace UnityExplorer.UI.Panels
|
|||||||
InspectorManager.OnPanelResized(panel.rect.width);
|
InspectorManager.OnPanelResized(panel.rect.width);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager() => ConfigManager.InspectorData.Value;
|
|
||||||
|
|
||||||
public override void DoSaveToConfigElement()
|
|
||||||
{
|
|
||||||
ConfigManager.InspectorData.Value = this.ToSaveData();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
protected internal override void DoSetDefaultPosAndAnchors()
|
||||||
{
|
{
|
||||||
Rect.localPosition = Vector2.zero;
|
Rect.localPosition = Vector2.zero;
|
||||||
@ -60,9 +54,21 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
public override void ConstructPanelContent()
|
public override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
|
var closeHolder = this.titleBar.transform.Find("CloseHolder").gameObject;
|
||||||
|
|
||||||
|
// Inspect under mouse dropdown on title bar
|
||||||
|
|
||||||
|
var mouseDropdown = UIFactory.CreateDropdown(closeHolder, "MouseInspectDropdown", out MouseInspectDropdown, "Mouse Inspect", 14,
|
||||||
|
InspectUnderMouse.OnDropdownSelect);
|
||||||
|
UIFactory.SetLayoutElement(mouseDropdown, minHeight: 25, minWidth: 140);
|
||||||
|
MouseInspectDropdown.options.Add(new Dropdown.OptionData("Mouse Inspect"));
|
||||||
|
MouseInspectDropdown.options.Add(new Dropdown.OptionData("World"));
|
||||||
|
MouseInspectDropdown.options.Add(new Dropdown.OptionData("UI"));
|
||||||
|
mouseDropdown.transform.SetSiblingIndex(0);
|
||||||
|
|
||||||
// add close all button to titlebar
|
// add close all button to titlebar
|
||||||
|
|
||||||
var closeAllBtn = UIFactory.CreateButton(this.titleBar.transform.Find("CloseHolder").gameObject, "CloseAllBtn", "Close All",
|
var closeAllBtn = UIFactory.CreateButton(closeHolder.gameObject, "CloseAllBtn", "Close All",
|
||||||
new Color(0.3f, 0.2f, 0.2f));
|
new Color(0.3f, 0.2f, 0.2f));
|
||||||
UIFactory.SetLayoutElement(closeAllBtn.Component.gameObject, minHeight: 25, minWidth: 80);
|
UIFactory.SetLayoutElement(closeAllBtn.Component.gameObject, minHeight: 25, minWidth: 80);
|
||||||
closeAllBtn.Component.transform.SetSiblingIndex(closeAllBtn.Component.transform.GetSiblingIndex() - 1);
|
closeAllBtn.Component.transform.SetSiblingIndex(closeAllBtn.Component.transform.GetSiblingIndex() - 1);
|
||||||
@ -70,14 +76,14 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// this.UIRoot.GetComponent<Mask>().enabled = false;
|
// this.UIRoot.GetComponent<Mask>().enabled = false;
|
||||||
|
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.content, true, true, true, true, 4, padLeft: 5, padRight: 5);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.uiRoot, true, true, true, true, 4, padLeft: 5, padRight: 5);
|
||||||
|
|
||||||
this.NavbarHolder = UIFactory.CreateGridGroup(this.content, "Navbar", new Vector2(200, 22), new Vector2(4, 4),
|
this.NavbarHolder = UIFactory.CreateGridGroup(this.uiRoot, "Navbar", new Vector2(200, 22), new Vector2(4, 4),
|
||||||
new Color(0.05f, 0.05f, 0.05f));
|
new Color(0.05f, 0.05f, 0.05f));
|
||||||
//UIFactory.SetLayoutElement(NavbarHolder, flexibleWidth: 9999, minHeight: 0, preferredHeight: 0, flexibleHeight: 9999);
|
//UIFactory.SetLayoutElement(NavbarHolder, flexibleWidth: 9999, minHeight: 0, preferredHeight: 0, flexibleHeight: 9999);
|
||||||
NavbarHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
NavbarHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
this.ContentHolder = UIFactory.CreateVerticalGroup(this.content, "ContentHolder", true, true, true, true, 0, default,
|
this.ContentHolder = UIFactory.CreateVerticalGroup(this.uiRoot, "ContentHolder", true, true, true, true, 0, default,
|
||||||
new Color(0.1f, 0.1f, 0.1f));
|
new Color(0.1f, 0.1f, 0.1f));
|
||||||
UIFactory.SetLayoutElement(ContentHolder, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(ContentHolder, flexibleHeight: 9999);
|
||||||
ContentRect = ContentHolder.GetComponent<RectTransform>();
|
ContentRect = ContentHolder.GetComponent<RectTransform>();
|
||||||
|
@ -6,11 +6,14 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
@ -141,19 +144,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
cell.Input.Component.textComponent.color = logColors[log.type];
|
cell.Input.Component.textComponent.color = logColors[log.type];
|
||||||
|
|
||||||
var color = index % 2 == 0 ? logEvenColor : logOddColor;
|
var color = index % 2 == 0 ? logEvenColor : logOddColor;
|
||||||
RuntimeProvider.Instance.SetColorBlock(cell.Input.Component, color);
|
RuntimeHelper.SetColorBlock(cell.Input.Component, color);
|
||||||
}
|
|
||||||
|
|
||||||
// Panel save data
|
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager()
|
|
||||||
{
|
|
||||||
return ConfigManager.ConsoleLogData.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void DoSaveToConfigElement()
|
|
||||||
{
|
|
||||||
ConfigManager.ConsoleLogData.Value = this.ToSaveData();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
protected internal override void DoSetDefaultPosAndAnchors()
|
||||||
@ -170,13 +161,13 @@ namespace UnityExplorer.UI.Panels
|
|||||||
{
|
{
|
||||||
// Log scroll pool
|
// Log scroll pool
|
||||||
|
|
||||||
logScrollPool = UIFactory.CreateScrollPool<ConsoleLogCell>(this.content, "Logs", out GameObject scrollObj,
|
logScrollPool = UIFactory.CreateScrollPool<ConsoleLogCell>(this.uiRoot, "Logs", out GameObject scrollObj,
|
||||||
out GameObject scrollContent, new Color(0.03f, 0.03f, 0.03f));
|
out GameObject scrollContent, new Color(0.03f, 0.03f, 0.03f));
|
||||||
UIFactory.SetLayoutElement(scrollObj, flexibleWidth: 9999, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(scrollObj, flexibleWidth: 9999, flexibleHeight: 9999);
|
||||||
|
|
||||||
// Buttons and toggles
|
// Buttons and toggles
|
||||||
|
|
||||||
var optionsRow = UIFactory.CreateUIObject("OptionsRow", this.content);
|
var optionsRow = UIFactory.CreateUIObject("OptionsRow", this.uiRoot);
|
||||||
UIFactory.SetLayoutElement(optionsRow, minHeight: 25, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(optionsRow, minHeight: 25, flexibleWidth: 9999);
|
||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(optionsRow, false, false, true, true, 5, 2, 2, 2, 2);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(optionsRow, false, false, true, true, 5, 2, 2, 2, 2);
|
||||||
|
|
||||||
@ -229,7 +220,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
Input = UIFactory.CreateInputField(UIRoot, "Input", "");
|
Input = UIFactory.CreateInputField(UIRoot, "Input", "");
|
||||||
//Input.Component.gameObject.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
//Input.Component.gameObject.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
UIFactory.SetLayoutElement(Input.UIRoot, minHeight: 25, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(Input.UIRoot, minHeight: 25, flexibleWidth: 9999);
|
||||||
RuntimeProvider.Instance.SetColorBlock(Input.Component, new Color(0.1f, 0.1f, 0.1f), new Color(0.13f, 0.13f, 0.13f),
|
RuntimeHelper.SetColorBlock(Input.Component, new Color(0.1f, 0.1f, 0.1f), new Color(0.13f, 0.13f, 0.13f),
|
||||||
new Color(0.07f, 0.07f, 0.07f));
|
new Color(0.07f, 0.07f, 0.07f));
|
||||||
Input.Component.GetComponent<Image>().color = new Color(0.2f, 0.2f, 0.2f);
|
Input.Component.GetComponent<Image>().color = new Color(0.2f, 0.2f, 0.2f);
|
||||||
|
|
||||||
|
@ -8,8 +8,7 @@ using System.Text;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.Core.Config;
|
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UnityExplorer.ObjectExplorer;
|
using UnityExplorer.ObjectExplorer;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
@ -44,16 +43,16 @@ namespace UnityExplorer.UI.Panels
|
|||||||
content.SetActive(true);
|
content.SetActive(true);
|
||||||
|
|
||||||
var button = tabButtons[tabIndex];
|
var button = tabButtons[tabIndex];
|
||||||
RuntimeProvider.Instance.SetColorBlock(button.Component, UniversalUI.enabledButtonColor, UniversalUI.enabledButtonColor * 1.2f);
|
RuntimeHelper.SetColorBlock(button.Component, UniversalUI.EnabledButtonColor, UniversalUI.EnabledButtonColor * 1.2f);
|
||||||
|
|
||||||
SelectedTab = tabIndex;
|
SelectedTab = tabIndex;
|
||||||
SaveToConfigManager();
|
SaveInternalData();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisableTab(int tabIndex)
|
private void DisableTab(int tabIndex)
|
||||||
{
|
{
|
||||||
tabPages[tabIndex].SetActive(false);
|
tabPages[tabIndex].SetActive(false);
|
||||||
RuntimeProvider.Instance.SetColorBlock(tabButtons[tabIndex].Component, UniversalUI.disabledButtonColor, UniversalUI.disabledButtonColor * 1.2f);
|
RuntimeHelper.SetColorBlock(tabButtons[tabIndex].Component, UniversalUI.DisabledButtonColor, UniversalUI.DisabledButtonColor * 1.2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Update()
|
public override void Update()
|
||||||
@ -64,21 +63,12 @@ namespace UnityExplorer.UI.Panels
|
|||||||
ObjectSearch.Update();
|
ObjectSearch.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager() => ConfigManager.ObjectExplorerData.Value;
|
|
||||||
|
|
||||||
public override void DoSaveToConfigElement()
|
|
||||||
{
|
|
||||||
ConfigManager.ObjectExplorerData.Value = this.ToSaveData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToSaveData()
|
public override string ToSaveData()
|
||||||
{
|
{
|
||||||
string ret = base.ToSaveData();
|
return string.Join("|", new string[] { base.ToSaveData(), SelectedTab.ToString() });
|
||||||
ret += "|" + SelectedTab;
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ApplySaveData(string data)
|
protected override void ApplySaveData(string data)
|
||||||
{
|
{
|
||||||
base.ApplySaveData(data);
|
base.ApplySaveData(data);
|
||||||
|
|
||||||
@ -109,17 +99,17 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public override void ConstructPanelContent()
|
public override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
// Tab bar
|
// Tab bar
|
||||||
var tabGroup = UIFactory.CreateHorizontalGroup(content, "TabBar", true, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
var tabGroup = UIFactory.CreateHorizontalGroup(uiRoot, "TabBar", true, true, true, true, 2, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(tabGroup, minHeight: 25, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(tabGroup, minHeight: 25, flexibleHeight: 0);
|
||||||
|
|
||||||
// Scene Explorer
|
// Scene Explorer
|
||||||
SceneExplorer = new SceneExplorer(this);
|
SceneExplorer = new SceneExplorer(this);
|
||||||
SceneExplorer.ConstructUI(content);
|
SceneExplorer.ConstructUI(uiRoot);
|
||||||
tabPages.Add(SceneExplorer);
|
tabPages.Add(SceneExplorer);
|
||||||
|
|
||||||
// Object search
|
// Object search
|
||||||
ObjectSearch = new ObjectSearch(this);
|
ObjectSearch = new ObjectSearch(this);
|
||||||
ObjectSearch.ConstructUI(content);
|
ObjectSearch.ConstructUI(uiRoot);
|
||||||
tabPages.Add(ObjectSearch);
|
tabPages.Add(ObjectSearch);
|
||||||
|
|
||||||
// set up tabs
|
// set up tabs
|
||||||
|
@ -4,12 +4,13 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.CacheObject;
|
using UnityExplorer.CacheObject;
|
||||||
using UnityExplorer.CacheObject.Views;
|
using UnityExplorer.CacheObject.Views;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
@ -55,17 +56,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
CacheObjectControllerHelper.SetCell(cell, index, this.configEntries, null);
|
CacheObjectControllerHelper.SetCell(cell, index, this.configEntries, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Panel save data
|
// UI Construction
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager()
|
|
||||||
{
|
|
||||||
return ConfigManager.OptionsPanelData.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void DoSaveToConfigElement()
|
|
||||||
{
|
|
||||||
ConfigManager.OptionsPanelData.Value = this.ToSaveData();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
protected internal override void DoSetDefaultPosAndAnchors()
|
||||||
{
|
{
|
||||||
@ -76,19 +67,17 @@ namespace UnityExplorer.UI.Panels
|
|||||||
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 600f);
|
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 600f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// UI Construction
|
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
public override void ConstructPanelContent()
|
||||||
{
|
{
|
||||||
// Save button
|
// Save button
|
||||||
|
|
||||||
var saveBtn = UIFactory.CreateButton(this.content, "Save", "Save Options", new Color(0.2f, 0.3f, 0.2f));
|
var saveBtn = UIFactory.CreateButton(this.uiRoot, "Save", "Save Options", new Color(0.2f, 0.3f, 0.2f));
|
||||||
UIFactory.SetLayoutElement(saveBtn.Component.gameObject, flexibleWidth: 9999, minHeight: 30, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(saveBtn.Component.gameObject, flexibleWidth: 9999, minHeight: 30, flexibleHeight: 0);
|
||||||
saveBtn.OnClick += ConfigManager.Handler.SaveConfig;
|
saveBtn.OnClick += ConfigManager.Handler.SaveConfig;
|
||||||
|
|
||||||
// Config entries
|
// Config entries
|
||||||
|
|
||||||
var scrollPool = UIFactory.CreateScrollPool<ConfigEntryCell>(this.content, "ConfigEntries", out GameObject scrollObj,
|
var scrollPool = UIFactory.CreateScrollPool<ConfigEntryCell>(this.uiRoot, "ConfigEntries", out GameObject scrollObj,
|
||||||
out GameObject scrollContent);
|
out GameObject scrollContent);
|
||||||
|
|
||||||
scrollPool.Initialize(this);
|
scrollPool.Initialize(this);
|
||||||
|
@ -10,20 +10,39 @@ using UniverseLib.UI.Models;
|
|||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
public class PanelDragger
|
public class PanelDragger
|
||||||
{
|
{
|
||||||
|
private enum MouseState
|
||||||
|
{
|
||||||
|
Down,
|
||||||
|
Held,
|
||||||
|
NotPressed
|
||||||
|
}
|
||||||
|
|
||||||
#region Static
|
#region Static
|
||||||
|
|
||||||
public static bool Resizing { get; private set; }
|
public static bool Resizing { get; private set; }
|
||||||
|
public static bool ResizePrompting => resizeCursorObj && resizeCursorObj.activeSelf;
|
||||||
|
|
||||||
public static bool ResizePrompting => s_resizeCursorObj && s_resizeCursorObj.activeSelf;
|
public static GameObject resizeCursorObj;
|
||||||
|
internal static bool wasAnyDragging;
|
||||||
|
|
||||||
|
internal static List<PanelDragger> Instances = new();
|
||||||
|
|
||||||
|
private static bool handledInstanceThisFrame;
|
||||||
|
|
||||||
|
static PanelDragger()
|
||||||
|
{
|
||||||
|
UIPanel.OnPanelsReordered += OnPanelsReordered;
|
||||||
|
}
|
||||||
|
|
||||||
internal static void ForceEnd()
|
internal static void ForceEnd()
|
||||||
{
|
{
|
||||||
s_resizeCursorObj.SetActive(false);
|
resizeCursorObj.SetActive(false);
|
||||||
wasAnyDragging = false;
|
wasAnyDragging = false;
|
||||||
Resizing = false;
|
Resizing = false;
|
||||||
|
|
||||||
@ -34,13 +53,6 @@ namespace UnityExplorer.UI.Panels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static List<PanelDragger> Instances = new List<PanelDragger>();
|
|
||||||
|
|
||||||
static PanelDragger()
|
|
||||||
{
|
|
||||||
UIPanel.OnPanelsReordered += OnPanelsReordered;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void OnPanelsReordered()
|
public static void OnPanelsReordered()
|
||||||
{
|
{
|
||||||
Instances.Sort((a, b) => b.Panel.GetSiblingIndex().CompareTo(a.Panel.GetSiblingIndex()));
|
Instances.Sort((a, b) => b.Panel.GetSiblingIndex().CompareTo(a.Panel.GetSiblingIndex()));
|
||||||
@ -54,18 +66,12 @@ namespace UnityExplorer.UI.Panels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum MouseState
|
|
||||||
{
|
|
||||||
Down,
|
|
||||||
Held,
|
|
||||||
NotPressed
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool handledInstanceThisFrame;
|
|
||||||
|
|
||||||
public static void UpdateInstances()
|
public static void UpdateInstances()
|
||||||
{
|
{
|
||||||
if (!s_resizeCursorObj)
|
if (!DisplayManager.MouseInTargetDisplay)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!resizeCursorObj)
|
||||||
CreateCursorUI();
|
CreateCursorUI();
|
||||||
|
|
||||||
MouseState state;
|
MouseState state;
|
||||||
@ -76,7 +82,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
else
|
else
|
||||||
state = MouseState.NotPressed;
|
state = MouseState.NotPressed;
|
||||||
|
|
||||||
var mousePos = InputManager.MousePosition;
|
var mousePos = DisplayManager.MousePosition;
|
||||||
|
|
||||||
handledInstanceThisFrame = false;
|
handledInstanceThisFrame = false;
|
||||||
foreach (var instance in Instances)
|
foreach (var instance in Instances)
|
||||||
@ -99,10 +105,6 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public static GameObject s_resizeCursorObj;
|
|
||||||
|
|
||||||
internal static bool wasAnyDragging;
|
|
||||||
|
|
||||||
// Instance
|
// Instance
|
||||||
|
|
||||||
public UIPanel UIPanel { get; private set; }
|
public UIPanel UIPanel { get; private set; }
|
||||||
@ -112,27 +114,23 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public event Action<RectTransform> OnFinishResize;
|
public event Action<RectTransform> OnFinishResize;
|
||||||
public event Action<RectTransform> OnFinishDrag;
|
public event Action<RectTransform> OnFinishDrag;
|
||||||
|
|
||||||
private readonly RectTransform canvasTransform;
|
|
||||||
|
|
||||||
// Dragging
|
// Dragging
|
||||||
public RectTransform DragableArea { get; set; }
|
public RectTransform DragableArea { get; set; }
|
||||||
public bool WasDragging { get; set; }
|
public bool WasDragging { get; set; }
|
||||||
private Vector2 m_lastDragPosition;
|
private Vector2 lastDragPosition;
|
||||||
|
|
||||||
// Resizing
|
// Resizing
|
||||||
private const int RESIZE_THICKNESS = 10;
|
private const int RESIZE_THICKNESS = 10;
|
||||||
|
|
||||||
//internal readonly Vector2 minResize = new Vector2(200, 50);
|
|
||||||
|
|
||||||
private bool WasResizing { get; set; }
|
private bool WasResizing { get; set; }
|
||||||
private ResizeTypes m_currentResizeType = ResizeTypes.NONE;
|
private ResizeTypes currentResizeType = ResizeTypes.NONE;
|
||||||
private Vector2 m_lastResizePos;
|
private Vector2 lastResizePos;
|
||||||
|
|
||||||
private bool WasHoveringResize => s_resizeCursorObj.activeInHierarchy;
|
private bool WasHoveringResize => resizeCursorObj.activeInHierarchy;
|
||||||
|
|
||||||
private ResizeTypes m_lastResizeHoverType;
|
private ResizeTypes lastResizeHoverType;
|
||||||
|
|
||||||
private Rect m_totalResizeRect;
|
private Rect totalResizeRect;
|
||||||
|
|
||||||
public PanelDragger(RectTransform dragArea, RectTransform panelToDrag, UIPanel panel)
|
public PanelDragger(RectTransform dragArea, RectTransform panelToDrag, UIPanel panel)
|
||||||
{
|
{
|
||||||
@ -141,16 +139,13 @@ namespace UnityExplorer.UI.Panels
|
|||||||
DragableArea = dragArea;
|
DragableArea = dragArea;
|
||||||
Panel = panelToDrag;
|
Panel = panelToDrag;
|
||||||
|
|
||||||
if (!canvasTransform)
|
|
||||||
canvasTransform = Panel.GetComponentInParent<Canvas>().GetComponent<RectTransform>();
|
|
||||||
|
|
||||||
UpdateResizeCache();
|
UpdateResizeCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Destroy()
|
public void Destroy()
|
||||||
{
|
{
|
||||||
if (s_resizeCursorObj)
|
if (resizeCursorObj)
|
||||||
GameObject.Destroy(s_resizeCursorObj);
|
GameObject.Destroy(resizeCursorObj);
|
||||||
|
|
||||||
if (Instances.Contains(this))
|
if (Instances.Contains(this))
|
||||||
Instances.Remove(this);
|
Instances.Remove(this);
|
||||||
@ -166,7 +161,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
Vector3 dragPos = DragableArea.InverseTransformPoint(rawMousePos);
|
Vector3 dragPos = DragableArea.InverseTransformPoint(rawMousePos);
|
||||||
bool inDragPos = DragableArea.rect.Contains(dragPos);
|
bool inDragPos = DragableArea.rect.Contains(dragPos);
|
||||||
|
|
||||||
if (WasHoveringResize && s_resizeCursorObj)
|
if (WasHoveringResize && resizeCursorObj)
|
||||||
UpdateHoverImagePos();
|
UpdateHoverImagePos();
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
@ -243,15 +238,15 @@ namespace UnityExplorer.UI.Panels
|
|||||||
{
|
{
|
||||||
wasAnyDragging = true;
|
wasAnyDragging = true;
|
||||||
WasDragging = true;
|
WasDragging = true;
|
||||||
m_lastDragPosition = InputManager.MousePosition;
|
lastDragPosition = DisplayManager.MousePosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnDrag()
|
public void OnDrag()
|
||||||
{
|
{
|
||||||
var mousePos = InputManager.MousePosition;
|
var mousePos = DisplayManager.MousePosition;
|
||||||
|
|
||||||
Vector2 diff = (Vector2)mousePos - m_lastDragPosition;
|
Vector2 diff = (Vector2)mousePos - lastDragPosition;
|
||||||
m_lastDragPosition = mousePos;
|
lastDragPosition = mousePos;
|
||||||
|
|
||||||
Panel.localPosition = Panel.localPosition + (Vector3)diff;
|
Panel.localPosition = Panel.localPosition + (Vector3)diff;
|
||||||
|
|
||||||
@ -269,7 +264,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
#region RESIZE
|
#region RESIZE
|
||||||
|
|
||||||
private readonly Dictionary<ResizeTypes, Rect> m_resizeMask = new Dictionary<ResizeTypes, Rect>
|
private readonly Dictionary<ResizeTypes, Rect> m_resizeMask = new()
|
||||||
{
|
{
|
||||||
{ ResizeTypes.Top, default },
|
{ ResizeTypes.Top, default },
|
||||||
{ ResizeTypes.Left, default },
|
{ ResizeTypes.Left, default },
|
||||||
@ -296,7 +291,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
private void UpdateResizeCache()
|
private void UpdateResizeCache()
|
||||||
{
|
{
|
||||||
m_totalResizeRect = new Rect(Panel.rect.x - RESIZE_THICKNESS + 1,
|
totalResizeRect = new Rect(Panel.rect.x - RESIZE_THICKNESS + 1,
|
||||||
Panel.rect.y - RESIZE_THICKNESS + 1,
|
Panel.rect.y - RESIZE_THICKNESS + 1,
|
||||||
Panel.rect.width + DBL_THICKESS - 2,
|
Panel.rect.width + DBL_THICKESS - 2,
|
||||||
Panel.rect.height + DBL_THICKESS - 2);
|
Panel.rect.height + DBL_THICKESS - 2);
|
||||||
@ -305,34 +300,34 @@ namespace UnityExplorer.UI.Panels
|
|||||||
if (AllowDragAndResize)
|
if (AllowDragAndResize)
|
||||||
{
|
{
|
||||||
m_resizeMask[ResizeTypes.Bottom] = new Rect(
|
m_resizeMask[ResizeTypes.Bottom] = new Rect(
|
||||||
m_totalResizeRect.x,
|
totalResizeRect.x,
|
||||||
m_totalResizeRect.y,
|
totalResizeRect.y,
|
||||||
m_totalResizeRect.width,
|
totalResizeRect.width,
|
||||||
RESIZE_THICKNESS);
|
RESIZE_THICKNESS);
|
||||||
|
|
||||||
m_resizeMask[ResizeTypes.Left] = new Rect(
|
m_resizeMask[ResizeTypes.Left] = new Rect(
|
||||||
m_totalResizeRect.x,
|
totalResizeRect.x,
|
||||||
m_totalResizeRect.y,
|
totalResizeRect.y,
|
||||||
RESIZE_THICKNESS,
|
RESIZE_THICKNESS,
|
||||||
m_totalResizeRect.height);
|
totalResizeRect.height);
|
||||||
|
|
||||||
m_resizeMask[ResizeTypes.Top] = new Rect(
|
m_resizeMask[ResizeTypes.Top] = new Rect(
|
||||||
m_totalResizeRect.x,
|
totalResizeRect.x,
|
||||||
Panel.rect.y + Panel.rect.height - 2,
|
Panel.rect.y + Panel.rect.height - 2,
|
||||||
m_totalResizeRect.width,
|
totalResizeRect.width,
|
||||||
RESIZE_THICKNESS);
|
RESIZE_THICKNESS);
|
||||||
|
|
||||||
m_resizeMask[ResizeTypes.Right] = new Rect(
|
m_resizeMask[ResizeTypes.Right] = new Rect(
|
||||||
m_totalResizeRect.x + Panel.rect.width + RESIZE_THICKNESS - 2,
|
totalResizeRect.x + Panel.rect.width + RESIZE_THICKNESS - 2,
|
||||||
m_totalResizeRect.y,
|
totalResizeRect.y,
|
||||||
RESIZE_THICKNESS,
|
RESIZE_THICKNESS,
|
||||||
m_totalResizeRect.height);
|
totalResizeRect.height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool MouseInResizeArea(Vector2 mousePos)
|
private bool MouseInResizeArea(Vector2 mousePos)
|
||||||
{
|
{
|
||||||
return m_totalResizeRect.Contains(mousePos);
|
return totalResizeRect.Contains(mousePos);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResizeTypes GetResizeType(Vector2 mousePos)
|
private ResizeTypes GetResizeType(Vector2 mousePos)
|
||||||
@ -361,16 +356,16 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
public void OnHoverResize(ResizeTypes resizeType)
|
public void OnHoverResize(ResizeTypes resizeType)
|
||||||
{
|
{
|
||||||
if (WasHoveringResize && m_lastResizeHoverType == resizeType)
|
if (WasHoveringResize && lastResizeHoverType == resizeType)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// we are entering resize, or the resize type has changed.
|
// we are entering resize, or the resize type has changed.
|
||||||
|
|
||||||
//WasHoveringResize = true;
|
//WasHoveringResize = true;
|
||||||
m_lastResizeHoverType = resizeType;
|
lastResizeHoverType = resizeType;
|
||||||
|
|
||||||
s_resizeCursorObj.SetActive(true);
|
resizeCursorObj.SetActive(true);
|
||||||
s_resizeCursorObj.transform.SetAsLastSibling();
|
resizeCursorObj.transform.SetAsLastSibling();
|
||||||
|
|
||||||
// set the rotation for the resize icon
|
// set the rotation for the resize icon
|
||||||
float iconRotation = 0f;
|
float iconRotation = 0f;
|
||||||
@ -387,9 +382,9 @@ namespace UnityExplorer.UI.Panels
|
|||||||
iconRotation = 135f; break;
|
iconRotation = 135f; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion rot = s_resizeCursorObj.transform.rotation;
|
Quaternion rot = resizeCursorObj.transform.rotation;
|
||||||
rot.eulerAngles = new Vector3(0, 0, iconRotation);
|
rot.eulerAngles = new Vector3(0, 0, iconRotation);
|
||||||
s_resizeCursorObj.transform.rotation = rot;
|
resizeCursorObj.transform.rotation = rot;
|
||||||
|
|
||||||
UpdateHoverImagePos();
|
UpdateHoverImagePos();
|
||||||
}
|
}
|
||||||
@ -397,50 +392,50 @@ namespace UnityExplorer.UI.Panels
|
|||||||
// update the resize icon position to be above the mouse
|
// update the resize icon position to be above the mouse
|
||||||
private void UpdateHoverImagePos()
|
private void UpdateHoverImagePos()
|
||||||
{
|
{
|
||||||
s_resizeCursorObj.transform.localPosition = canvasTransform.InverseTransformPoint(InputManager.MousePosition);
|
resizeCursorObj.transform.localPosition = UIManager.UIRootRect.InverseTransformPoint(DisplayManager.MousePosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnHoverResizeEnd()
|
public void OnHoverResizeEnd()
|
||||||
{
|
{
|
||||||
//WasHoveringResize = false;
|
//WasHoveringResize = false;
|
||||||
s_resizeCursorObj.SetActive(false);
|
resizeCursorObj.SetActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnBeginResize(ResizeTypes resizeType)
|
public void OnBeginResize(ResizeTypes resizeType)
|
||||||
{
|
{
|
||||||
m_currentResizeType = resizeType;
|
currentResizeType = resizeType;
|
||||||
m_lastResizePos = InputManager.MousePosition;
|
lastResizePos = DisplayManager.MousePosition;
|
||||||
WasResizing = true;
|
WasResizing = true;
|
||||||
Resizing = true;
|
Resizing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnResize()
|
public void OnResize()
|
||||||
{
|
{
|
||||||
Vector3 mousePos = InputManager.MousePosition;
|
Vector3 mousePos = DisplayManager.MousePosition;
|
||||||
Vector2 diff = m_lastResizePos - (Vector2)mousePos;
|
Vector2 diff = lastResizePos - (Vector2)mousePos;
|
||||||
|
|
||||||
if ((Vector2)mousePos == m_lastResizePos)
|
if ((Vector2)mousePos == lastResizePos)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mousePos.x < 0 || mousePos.y < 0 || mousePos.x > Screen.width || mousePos.y > Screen.height)
|
if (mousePos.x < 0 || mousePos.y < 0 || mousePos.x > DisplayManager.Width || mousePos.y > DisplayManager.Height)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_lastResizePos = mousePos;
|
lastResizePos = mousePos;
|
||||||
|
|
||||||
float diffX = (float)((decimal)diff.x / Screen.width);
|
float diffX = (float)((decimal)diff.x / DisplayManager.Width);
|
||||||
float diffY = (float)((decimal)diff.y / Screen.height);
|
float diffY = (float)((decimal)diff.y / DisplayManager.Height);
|
||||||
|
|
||||||
Vector2 anchorMin = Panel.anchorMin;
|
Vector2 anchorMin = Panel.anchorMin;
|
||||||
Vector2 anchorMax = Panel.anchorMax;
|
Vector2 anchorMax = Panel.anchorMax;
|
||||||
|
|
||||||
if (m_currentResizeType.HasFlag(ResizeTypes.Left))
|
if (currentResizeType.HasFlag(ResizeTypes.Left))
|
||||||
anchorMin.x -= diffX;
|
anchorMin.x -= diffX;
|
||||||
else if (m_currentResizeType.HasFlag(ResizeTypes.Right))
|
else if (currentResizeType.HasFlag(ResizeTypes.Right))
|
||||||
anchorMax.x -= diffX;
|
anchorMax.x -= diffX;
|
||||||
|
|
||||||
if (m_currentResizeType.HasFlag(ResizeTypes.Top))
|
if (currentResizeType.HasFlag(ResizeTypes.Top))
|
||||||
anchorMax.y -= diffY;
|
anchorMax.y -= diffY;
|
||||||
else if (m_currentResizeType.HasFlag(ResizeTypes.Bottom))
|
else if (currentResizeType.HasFlag(ResizeTypes.Bottom))
|
||||||
anchorMin.y -= diffY;
|
anchorMin.y -= diffY;
|
||||||
|
|
||||||
var prevMin = Panel.anchorMin;
|
var prevMin = Panel.anchorMin;
|
||||||
@ -475,13 +470,13 @@ namespace UnityExplorer.UI.Panels
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var text = UIFactory.CreateLabel(UIManager.UIRoot, "ResizeCursor", "↔", TextAnchor.MiddleCenter, Color.white, true, 35);
|
var text = UIFactory.CreateLabel(UIManager.UIRoot, "ResizeCursor", "↔", TextAnchor.MiddleCenter, Color.white, true, 35);
|
||||||
s_resizeCursorObj = text.gameObject;
|
resizeCursorObj = text.gameObject;
|
||||||
|
|
||||||
RectTransform rect = s_resizeCursorObj.GetComponent<RectTransform>();
|
RectTransform rect = resizeCursorObj.GetComponent<RectTransform>();
|
||||||
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 64);
|
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 64);
|
||||||
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 64);
|
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 64);
|
||||||
|
|
||||||
s_resizeCursorObj.SetActive(false);
|
resizeCursorObj.SetActive(false);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -5,12 +5,13 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib.UI.Models;
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
@ -23,8 +24,8 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public static event Action OnPanelsReordered;
|
public static event Action OnPanelsReordered;
|
||||||
public static event Action OnClickedOutsidePanels;
|
public static event Action OnClickedOutsidePanels;
|
||||||
|
|
||||||
internal static readonly List<UIPanel> instances = new List<UIPanel>();
|
internal static readonly List<UIPanel> instances = new();
|
||||||
internal static readonly Dictionary<int, UIPanel> transformToPanelDict = new Dictionary<int, UIPanel>();
|
internal static readonly Dictionary<int, UIPanel> transformToPanelDict = new();
|
||||||
|
|
||||||
public static void UpdateFocus()
|
public static void UpdateFocus()
|
||||||
{
|
{
|
||||||
@ -32,10 +33,11 @@ namespace UnityExplorer.UI.Panels
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// if the user is clicking
|
// if the user is clicking
|
||||||
if (InputManager.GetMouseButtonDown(0) || InputManager.GetMouseButtonDown(1))
|
if (DisplayManager.MouseInTargetDisplay
|
||||||
|
&& (InputManager.GetMouseButtonDown(0) || InputManager.GetMouseButtonDown(1)))
|
||||||
{
|
{
|
||||||
int count = UIManager.PanelHolder.transform.childCount;
|
int count = UIManager.PanelHolder.transform.childCount;
|
||||||
var mousePos = InputManager.MousePosition;
|
var mousePos = DisplayManager.MousePosition;
|
||||||
bool clickedInAny = false;
|
bool clickedInAny = false;
|
||||||
|
|
||||||
for (int i = count - 1; i >= 0; i--)
|
for (int i = count - 1; i >= 0; i--)
|
||||||
@ -91,20 +93,16 @@ namespace UnityExplorer.UI.Panels
|
|||||||
public override GameObject UIRoot => uiRoot;
|
public override GameObject UIRoot => uiRoot;
|
||||||
protected GameObject uiRoot;
|
protected GameObject uiRoot;
|
||||||
public RectTransform Rect;
|
public RectTransform Rect;
|
||||||
public GameObject content;
|
|
||||||
|
|
||||||
public GameObject titleBar;
|
public GameObject titleBar;
|
||||||
|
|
||||||
public abstract void ConstructPanelContent();
|
|
||||||
|
|
||||||
public virtual void OnFinishResize(RectTransform panel)
|
public virtual void OnFinishResize(RectTransform panel)
|
||||||
{
|
{
|
||||||
SaveToConfigManager();
|
SaveInternalData();
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void OnFinishDrag(RectTransform panel)
|
public virtual void OnFinishDrag(RectTransform panel)
|
||||||
{
|
{
|
||||||
SaveToConfigManager();
|
SaveInternalData();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SetActive(bool active)
|
public override void SetActive(bool active)
|
||||||
@ -115,12 +113,12 @@ namespace UnityExplorer.UI.Panels
|
|||||||
base.SetActive(active);
|
base.SetActive(active);
|
||||||
|
|
||||||
if (!ApplyingSaveData)
|
if (!ApplyingSaveData)
|
||||||
SaveToConfigManager();
|
SaveInternalData();
|
||||||
|
|
||||||
if (NavButtonWanted)
|
if (NavButtonWanted)
|
||||||
{
|
{
|
||||||
var color = active ? UniversalUI.enabledButtonColor : UniversalUI.disabledButtonColor;
|
var color = active ? UniversalUI.EnabledButtonColor : UniversalUI.DisabledButtonColor;
|
||||||
RuntimeProvider.Instance.SetColorBlock(NavButton.Component, color, color * 1.2f);
|
RuntimeHelper.SetColorBlock(NavButton.Component, color, color * 1.2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!active)
|
if (!active)
|
||||||
@ -148,13 +146,15 @@ namespace UnityExplorer.UI.Panels
|
|||||||
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void EnsureValidPosition() => EnsureValidPosition(this.Rect);
|
||||||
|
|
||||||
public static void EnsureValidPosition(RectTransform panel)
|
public static void EnsureValidPosition(RectTransform panel)
|
||||||
{
|
{
|
||||||
var pos = panel.localPosition;
|
var pos = panel.localPosition;
|
||||||
|
|
||||||
// Prevent panel going oustide screen bounds
|
// Prevent panel going oustide screen bounds
|
||||||
var halfW = Screen.width * 0.5f;
|
var halfW = DisplayManager.Width * 0.5f;
|
||||||
var halfH = Screen.height * 0.5f;
|
var halfH = DisplayManager.Height * 0.5f;
|
||||||
|
|
||||||
pos.x = Math.Max(-halfW - panel.rect.width + 50, Math.Min(pos.x, halfW - 50));
|
pos.x = Math.Max(-halfW - panel.rect.width + 50, Math.Min(pos.x, halfW - 50));
|
||||||
pos.y = Math.Max(-halfH + 50, Math.Min(pos.y, halfH));
|
pos.y = Math.Max(-halfH + 50, Math.Min(pos.y, halfH));
|
||||||
@ -162,29 +162,30 @@ namespace UnityExplorer.UI.Panels
|
|||||||
panel.localPosition = pos;
|
panel.localPosition = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Save Data
|
// Save Data
|
||||||
|
|
||||||
public abstract void DoSaveToConfigElement();
|
public bool ApplyingSaveData { get; set; }
|
||||||
|
|
||||||
public void SaveToConfigManager()
|
public void SaveInternalData()
|
||||||
{
|
{
|
||||||
if (UIManager.Initializing)
|
if (UIManager.Initializing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DoSaveToConfigElement();
|
SetSaveDataToConfigValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract string GetSaveDataFromConfigManager();
|
private void SetSaveDataToConfigValue() => ConfigManager.GetPanelSaveData(this.PanelType).Value = this.ToSaveData();
|
||||||
|
|
||||||
public bool ApplyingSaveData { get; set; }
|
|
||||||
|
|
||||||
public virtual string ToSaveData()
|
public virtual string ToSaveData()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return $"{ShouldSaveActiveState && Enabled}" +
|
return string.Join("|", new string[]
|
||||||
$"|{Rect.RectAnchorsToString()}" +
|
{
|
||||||
$"|{Rect.RectPositionToString()}";
|
$"{ShouldSaveActiveState && Enabled}",
|
||||||
|
Rect.RectAnchorsToString(),
|
||||||
|
Rect.RectPositionToString()
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -193,7 +194,13 @@ namespace UnityExplorer.UI.Panels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void ApplySaveData(string data)
|
public virtual void ApplySaveData()
|
||||||
|
{
|
||||||
|
string data = ConfigManager.GetPanelSaveData(this.PanelType).Value;
|
||||||
|
ApplySaveData(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void ApplySaveData(string data)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(data))
|
if (string.IsNullOrEmpty(data))
|
||||||
return;
|
return;
|
||||||
@ -210,17 +217,14 @@ namespace UnityExplorer.UI.Panels
|
|||||||
{
|
{
|
||||||
ExplorerCore.LogWarning("Invalid or corrupt panel save data! Restoring to default.");
|
ExplorerCore.LogWarning("Invalid or corrupt panel save data! Restoring to default.");
|
||||||
SetTransformDefaults();
|
SetTransformDefaults();
|
||||||
UIManager.Initializing = false;
|
SetSaveDataToConfigValue();
|
||||||
DoSaveToConfigElement();
|
|
||||||
ConfigManager.InternalHandler.SaveConfig();
|
|
||||||
UIManager.Initializing = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
// UI Construction
|
// UI Construction
|
||||||
|
|
||||||
|
public abstract void ConstructPanelContent();
|
||||||
|
|
||||||
public void ConstructUI()
|
public void ConstructUI()
|
||||||
{
|
{
|
||||||
//this.Enabled = true;
|
//this.Enabled = true;
|
||||||
@ -235,7 +239,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(navBtn, false, true, true, true, 0, 0, 0, 5, 5, TextAnchor.MiddleCenter);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(navBtn, false, true, true, true, 0, 0, 0, 5, 5, TextAnchor.MiddleCenter);
|
||||||
UIFactory.SetLayoutElement(navBtn, minWidth: 80);
|
UIFactory.SetLayoutElement(navBtn, minWidth: 80);
|
||||||
|
|
||||||
RuntimeProvider.Instance.SetColorBlock(NavButton.Component, UniversalUI.disabledButtonColor, UniversalUI.disabledButtonColor * 1.2f);
|
RuntimeHelper.SetColorBlock(NavButton.Component, UniversalUI.DisabledButtonColor, UniversalUI.DisabledButtonColor * 1.2f);
|
||||||
NavButton.OnClick += () => { UIManager.TogglePanel(PanelType); };
|
NavButton.OnClick += () => { UIManager.TogglePanel(PanelType); };
|
||||||
|
|
||||||
var txtObj = navBtn.transform.Find("Text").gameObject;
|
var txtObj = navBtn.transform.Find("Text").gameObject;
|
||||||
@ -243,18 +247,18 @@ namespace UnityExplorer.UI.Panels
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create core canvas
|
// create core canvas
|
||||||
uiRoot = UIFactory.CreatePanel(Name, UIManager.PanelHolder, out GameObject panelContent);
|
uiRoot = UIFactory.CreatePanel(Name, UIManager.PanelHolder);
|
||||||
Rect = this.uiRoot.GetComponent<RectTransform>();
|
Rect = this.uiRoot.GetComponent<RectTransform>();
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.uiRoot, false, false, true, true, 0, 2, 2, 2, 2, TextAnchor.UpperLeft);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.uiRoot, false, false, true, true, 2, 2, 2, 2, 2, TextAnchor.UpperLeft);
|
||||||
|
|
||||||
int id = this.uiRoot.transform.GetInstanceID();
|
int id = this.uiRoot.transform.GetInstanceID();
|
||||||
transformToPanelDict.Add(id, this);
|
transformToPanelDict.Add(id, this);
|
||||||
|
|
||||||
content = panelContent;
|
//content = panelContent;
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.content, false, false, true, true, 2, 2, 2, 2, 2, TextAnchor.UpperLeft);
|
//UIFactory.SetLayoutGroup<VerticalLayoutGroup>(this.content, false, false, true, true, 2, 2, 2, 2, 2, TextAnchor.UpperLeft);
|
||||||
|
|
||||||
// Title bar
|
// Title bar
|
||||||
titleBar = UIFactory.CreateHorizontalGroup(content, "TitleBar", false, true, true, true, 2,
|
titleBar = UIFactory.CreateHorizontalGroup(uiRoot, "TitleBar", false, true, true, true, 2,
|
||||||
new Vector4(2, 2, 2, 2), new Color(0.06f, 0.06f, 0.06f));
|
new Vector4(2, 2, 2, 2), new Color(0.06f, 0.06f, 0.06f));
|
||||||
UIFactory.SetLayoutElement(titleBar, minHeight: 25, flexibleHeight: 0);
|
UIFactory.SetLayoutElement(titleBar, minHeight: 25, flexibleHeight: 0);
|
||||||
|
|
||||||
@ -270,12 +274,12 @@ namespace UnityExplorer.UI.Panels
|
|||||||
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(closeHolder, false, false, true, true, 3, childAlignment: TextAnchor.MiddleRight);
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(closeHolder, false, false, true, true, 3, childAlignment: TextAnchor.MiddleRight);
|
||||||
var closeBtn = UIFactory.CreateButton(closeHolder, "CloseButton", "—");
|
var closeBtn = UIFactory.CreateButton(closeHolder, "CloseButton", "—");
|
||||||
UIFactory.SetLayoutElement(closeBtn.Component.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(closeBtn.Component.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0);
|
||||||
RuntimeProvider.Instance.SetColorBlock(closeBtn.Component, new Color(0.33f, 0.32f, 0.31f));
|
RuntimeHelper.SetColorBlock(closeBtn.Component, new Color(0.33f, 0.32f, 0.31f));
|
||||||
|
|
||||||
closeBtn.OnClick += () =>
|
closeBtn.OnClick += () =>
|
||||||
{
|
{
|
||||||
UIManager.SetPanelActive(this.PanelType, false);
|
UIManager.SetPanelActive(this.PanelType, false);
|
||||||
SaveToConfigManager();
|
SaveInternalData();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!CanDragAndResize)
|
if (!CanDragAndResize)
|
||||||
@ -300,7 +304,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
// apply panel save data or revert to default
|
// apply panel save data or revert to default
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ApplySaveData(GetSaveDataFromConfigManager());
|
ApplySaveData();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -308,7 +312,20 @@ namespace UnityExplorer.UI.Panels
|
|||||||
SetTransformDefaults();
|
SetTransformDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
LayoutRebuilder.ForceRebuildLayoutImmediate(this.Rect);
|
RuntimeHelper.StartCoroutine(LateSetupCoroutine());
|
||||||
|
|
||||||
|
// simple listener for saving enabled state
|
||||||
|
this.OnToggleEnabled += (bool val) =>
|
||||||
|
{
|
||||||
|
SaveInternalData();
|
||||||
|
};
|
||||||
|
|
||||||
|
ApplyingSaveData = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator LateSetupCoroutine()
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
|
||||||
// ensure initialized position is valid
|
// ensure initialized position is valid
|
||||||
EnsureValidSize();
|
EnsureValidSize();
|
||||||
@ -316,14 +333,6 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
// update dragger and save data
|
// update dragger and save data
|
||||||
Dragger.OnEndResize();
|
Dragger.OnEndResize();
|
||||||
|
|
||||||
// simple listener for saving enabled state
|
|
||||||
this.OnToggleEnabled += (bool val) =>
|
|
||||||
{
|
|
||||||
SaveToConfigManager();
|
|
||||||
};
|
|
||||||
|
|
||||||
ApplyingSaveData = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void ConstructUI(GameObject parent) => ConstructUI();
|
public override void ConstructUI(GameObject parent) => ConstructUI();
|
||||||
@ -380,7 +389,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
return string.Format(CultureInfo.InvariantCulture, "{0},{1}", new object[]
|
return string.Format(CultureInfo.InvariantCulture, "{0},{1}", new object[]
|
||||||
{
|
{
|
||||||
rect.localPosition.x, rect.localPosition.y
|
rect.anchoredPosition.x, rect.anchoredPosition.y
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,10 +407,10 @@ namespace UnityExplorer.UI.Panels
|
|||||||
if (split.Length != 2)
|
if (split.Length != 2)
|
||||||
throw new Exception($"stringPosition split is unexpected length: {split.Length}");
|
throw new Exception($"stringPosition split is unexpected length: {split.Length}");
|
||||||
|
|
||||||
Vector3 vector = rect.localPosition;
|
Vector3 vector = rect.anchoredPosition;
|
||||||
vector.x = float.Parse(split[0], CultureInfo.InvariantCulture);
|
vector.x = float.Parse(split[0], CultureInfo.InvariantCulture);
|
||||||
vector.y = float.Parse(split[1], CultureInfo.InvariantCulture);
|
vector.y = float.Parse(split[1], CultureInfo.InvariantCulture);
|
||||||
rect.localPosition = vector;
|
rect.anchoredPosition = vector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@ using UnityExplorer.UI.Widgets;
|
|||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ButtonList;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Panels
|
namespace UnityExplorer.UI.Panels
|
||||||
{
|
{
|
||||||
@ -27,17 +30,6 @@ namespace UnityExplorer.UI.Panels
|
|||||||
private ButtonListHandler<GameObject, ButtonCell> dataHandler;
|
private ButtonListHandler<GameObject, ButtonCell> dataHandler;
|
||||||
private ScrollPool<ButtonCell> buttonScrollPool;
|
private ScrollPool<ButtonCell> buttonScrollPool;
|
||||||
|
|
||||||
public override void ConstructPanelContent()
|
|
||||||
{
|
|
||||||
dataHandler = new ButtonListHandler<GameObject, ButtonCell>(buttonScrollPool, GetEntries, SetCell, ShouldDisplayCell, OnCellClicked);
|
|
||||||
|
|
||||||
buttonScrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.content, "ResultsList", out GameObject scrollObj,
|
|
||||||
out GameObject scrollContent);
|
|
||||||
|
|
||||||
buttonScrollPool.Initialize(dataHandler);
|
|
||||||
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ShowResults()
|
public void ShowResults()
|
||||||
{
|
{
|
||||||
dataHandler.RefreshData();
|
dataHandler.RefreshData();
|
||||||
@ -65,6 +57,17 @@ namespace UnityExplorer.UI.Panels
|
|||||||
cell.Button.ButtonText.text = $"<color=cyan>{obj.name}</color> ({obj.transform.GetTransformPath(true)})";
|
cell.Button.ButtonText.text = $"<color=cyan>{obj.name}</color> ({obj.transform.GetTransformPath(true)})";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void ConstructPanelContent()
|
||||||
|
{
|
||||||
|
dataHandler = new ButtonListHandler<GameObject, ButtonCell>(buttonScrollPool, GetEntries, SetCell, ShouldDisplayCell, OnCellClicked);
|
||||||
|
|
||||||
|
buttonScrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.uiRoot, "ResultsList", out GameObject scrollObj,
|
||||||
|
out GameObject scrollContent);
|
||||||
|
|
||||||
|
buttonScrollPool.Initialize(dataHandler);
|
||||||
|
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
||||||
|
}
|
||||||
|
|
||||||
protected internal override void DoSetDefaultPosAndAnchors()
|
protected internal override void DoSetDefaultPosAndAnchors()
|
||||||
{
|
{
|
||||||
this.Rect.anchorMin = new Vector2(0.5f, 0.5f);
|
this.Rect.anchorMin = new Vector2(0.5f, 0.5f);
|
||||||
@ -72,8 +75,5 @@ namespace UnityExplorer.UI.Panels
|
|||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 500f);
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 500f);
|
||||||
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 500f);
|
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 500f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DoSaveToConfigElement() { }
|
|
||||||
public override string GetSaveDataFromConfigManager() => null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,19 @@
|
|||||||
using HarmonyLib;
|
using System.Collections.Generic;
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.EventSystems;
|
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UnityExplorer.Core.Config;
|
using UnityExplorer.Config;
|
||||||
using UnityExplorer.CSConsole;
|
using UnityExplorer.CSConsole;
|
||||||
using UnityExplorer.Inspectors;
|
using UnityExplorer.Inspectors;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UnityExplorer.UI.Widgets;
|
|
||||||
using UnityExplorer.UI.Widgets.AutoComplete;
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI
|
namespace UnityExplorer.UI
|
||||||
{
|
{
|
||||||
@ -35,6 +30,7 @@ namespace UnityExplorer.UI
|
|||||||
MouseInspector,
|
MouseInspector,
|
||||||
UIInspectorResults,
|
UIInspectorResults,
|
||||||
HookManager,
|
HookManager,
|
||||||
|
Clipboard
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum VerticalAnchor
|
public enum VerticalAnchor
|
||||||
@ -47,15 +43,17 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
public static bool Initializing { get; internal set; } = true;
|
public static bool Initializing { get; internal set; } = true;
|
||||||
|
|
||||||
private static UIBase uiBase;
|
internal static UIBase UiBase { get; private set; }
|
||||||
public static GameObject UIRoot => uiBase?.RootObject;
|
public static GameObject UIRoot => UiBase?.RootObject;
|
||||||
|
public static RectTransform UIRootRect { get; private set; }
|
||||||
|
public static Canvas UICanvas { get; private set; }
|
||||||
|
|
||||||
internal static GameObject PanelHolder { get; private set; }
|
internal static GameObject PanelHolder { get; private set; }
|
||||||
private static readonly Dictionary<Panels, UIPanel> UIPanels = new Dictionary<Panels, UIPanel>();
|
internal static readonly Dictionary<Panels, UIPanel> UIPanels = new();
|
||||||
|
|
||||||
public static RectTransform NavBarRect;
|
public static RectTransform NavBarRect;
|
||||||
public static GameObject NavbarTabButtonHolder;
|
public static GameObject NavbarTabButtonHolder;
|
||||||
public static Dropdown MouseInspectDropdown;
|
private static readonly Vector2 NAVBAR_DIMENSIONS = new(1020f, 35f);
|
||||||
|
|
||||||
private static ButtonRef closeBtn;
|
private static ButtonRef closeBtn;
|
||||||
private static ButtonRef pauseBtn;
|
private static ButtonRef pauseBtn;
|
||||||
@ -63,15 +61,19 @@ namespace UnityExplorer.UI
|
|||||||
private static bool pauseButtonPausing;
|
private static bool pauseButtonPausing;
|
||||||
private static float lastTimeScale;
|
private static float lastTimeScale;
|
||||||
|
|
||||||
|
private static int lastScreenWidth;
|
||||||
|
private static int lastScreenHeight;
|
||||||
|
|
||||||
public static bool ShowMenu
|
public static bool ShowMenu
|
||||||
{
|
{
|
||||||
get => uiBase != null && uiBase.Enabled;
|
get => UiBase != null && UiBase.Enabled;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (uiBase == null || !UIRoot || uiBase.Enabled == value)
|
if (UiBase == null || !UIRoot || UiBase.Enabled == value)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
UniversalUI.SetUIActive(ExplorerCore.GUID, value);
|
UniversalUI.SetUIActive(ExplorerCore.GUID, value);
|
||||||
|
UniversalUI.SetUIActive(InspectUnderMouse.UIBaseGUID, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,17 +81,28 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
internal static void InitUI()
|
internal static void InitUI()
|
||||||
{
|
{
|
||||||
uiBase = UniversalUI.RegisterUI(ExplorerCore.GUID, Update);
|
UiBase = UniversalUI.RegisterUI(ExplorerCore.GUID, Update);
|
||||||
|
|
||||||
|
UIRootRect = UIRoot.GetComponent<RectTransform>();
|
||||||
|
UICanvas = UIRoot.GetComponent<Canvas>();
|
||||||
|
|
||||||
|
DisplayManager.Init();
|
||||||
|
|
||||||
|
var display = DisplayManager.ActiveDisplay;
|
||||||
|
lastScreenWidth = display.renderingWidth;
|
||||||
|
lastScreenHeight = display.renderingHeight;
|
||||||
|
|
||||||
|
// Create UI.
|
||||||
CreatePanelHolder();
|
CreatePanelHolder();
|
||||||
|
|
||||||
CreateTopNavBar();
|
CreateTopNavBar();
|
||||||
|
// This could be automated with Assembly.GetTypes(),
|
||||||
|
// but the order is important and I'd have to write something to handle the order.
|
||||||
UIPanels.Add(Panels.AutoCompleter, new AutoCompleteModal());
|
UIPanels.Add(Panels.AutoCompleter, new AutoCompleteModal());
|
||||||
UIPanels.Add(Panels.ObjectExplorer, new ObjectExplorerPanel());
|
UIPanels.Add(Panels.ObjectExplorer, new ObjectExplorerPanel());
|
||||||
UIPanels.Add(Panels.Inspector, new InspectorPanel());
|
UIPanels.Add(Panels.Inspector, new InspectorPanel());
|
||||||
UIPanels.Add(Panels.CSConsole, new CSConsolePanel());
|
UIPanels.Add(Panels.CSConsole, new CSConsolePanel());
|
||||||
UIPanels.Add(Panels.HookManager, new HookManagerPanel());
|
UIPanels.Add(Panels.HookManager, new HookManagerPanel());
|
||||||
|
UIPanels.Add(Panels.Clipboard, new ClipboardPanel());
|
||||||
UIPanels.Add(Panels.ConsoleLog, new LogPanel());
|
UIPanels.Add(Panels.ConsoleLog, new LogPanel());
|
||||||
UIPanels.Add(Panels.Options, new OptionsPanel());
|
UIPanels.Add(Panels.Options, new OptionsPanel());
|
||||||
UIPanels.Add(Panels.UIInspectorResults, new UiInspectorResultsPanel());
|
UIPanels.Add(Panels.UIInspectorResults, new UiInspectorResultsPanel());
|
||||||
@ -98,29 +111,25 @@ namespace UnityExplorer.UI
|
|||||||
foreach (var panel in UIPanels.Values)
|
foreach (var panel in UIPanels.Values)
|
||||||
panel.ConstructUI();
|
panel.ConstructUI();
|
||||||
|
|
||||||
|
// Call some initialize methods
|
||||||
|
Notification.Init();
|
||||||
ConsoleController.Init();
|
ConsoleController.Init();
|
||||||
|
|
||||||
|
// Add this listener to prevent ScrollPool doing anything while we are resizing panels
|
||||||
|
ScrollPool<ICell>.writingLockedListeners.Add(() => !PanelDragger.Resizing);
|
||||||
|
|
||||||
|
// Set default menu visibility
|
||||||
ShowMenu = !ConfigManager.Hide_On_Startup.Value;
|
ShowMenu = !ConfigManager.Hide_On_Startup.Value;
|
||||||
|
|
||||||
lastScreenWidth = Screen.width;
|
// Failsafe fix, in some games all dropdowns displayed values are blank on startup for some reason.
|
||||||
lastScreenHeight = Screen.height;
|
|
||||||
|
|
||||||
// Failsafe fix
|
|
||||||
foreach (var dropdown in UIRoot.GetComponentsInChildren<Dropdown>(true))
|
foreach (var dropdown in UIRoot.GetComponentsInChildren<Dropdown>(true))
|
||||||
dropdown.RefreshShownValue();
|
dropdown.RefreshShownValue();
|
||||||
timeInput.Text = string.Empty;
|
|
||||||
timeInput.Text = Time.timeScale.ToString();
|
|
||||||
|
|
||||||
ScrollPool<ICell>.writingLockedListeners.Add(() => !PanelDragger.Resizing);
|
|
||||||
|
|
||||||
Initializing = false;
|
Initializing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main UI Update loop
|
// Main UI Update loop
|
||||||
|
|
||||||
private static int lastScreenWidth;
|
|
||||||
private static int lastScreenHeight;
|
|
||||||
|
|
||||||
public static void Update()
|
public static void Update()
|
||||||
{
|
{
|
||||||
if (!UIRoot)
|
if (!UIRoot)
|
||||||
@ -133,6 +142,9 @@ namespace UnityExplorer.UI
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update Notification modal
|
||||||
|
Notification.Update();
|
||||||
|
|
||||||
// Check forceUnlockMouse toggle
|
// Check forceUnlockMouse toggle
|
||||||
if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value))
|
if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value))
|
||||||
UniverseLib.Config.ConfigManager.Force_Unlock_Mouse = !UniverseLib.Config.ConfigManager.Force_Unlock_Mouse;
|
UniverseLib.Config.ConfigManager.Force_Unlock_Mouse = !UniverseLib.Config.ConfigManager.Force_Unlock_Mouse;
|
||||||
@ -158,7 +170,8 @@ namespace UnityExplorer.UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check screen dimension change
|
// check screen dimension change
|
||||||
if (Screen.width != lastScreenWidth || Screen.height != lastScreenHeight)
|
var display = DisplayManager.ActiveDisplay;
|
||||||
|
if (display.renderingWidth != lastScreenWidth || display.renderingHeight != lastScreenHeight)
|
||||||
OnScreenDimensionsChanged();
|
OnScreenDimensionsChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,14 +219,14 @@ namespace UnityExplorer.UI
|
|||||||
NavBarRect.anchorMin = new Vector2(0.5f, 1f);
|
NavBarRect.anchorMin = new Vector2(0.5f, 1f);
|
||||||
NavBarRect.anchorMax = new Vector2(0.5f, 1f);
|
NavBarRect.anchorMax = new Vector2(0.5f, 1f);
|
||||||
NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 0);
|
NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 0);
|
||||||
NavBarRect.sizeDelta = new Vector2(1080f, 35f);
|
NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VerticalAnchor.Bottom:
|
case VerticalAnchor.Bottom:
|
||||||
NavBarRect.anchorMin = new Vector2(0.5f, 0f);
|
NavBarRect.anchorMin = new Vector2(0.5f, 0f);
|
||||||
NavBarRect.anchorMax = new Vector2(0.5f, 0f);
|
NavBarRect.anchorMax = new Vector2(0.5f, 0f);
|
||||||
NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 35);
|
NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 35);
|
||||||
NavBarRect.sizeDelta = new Vector2(1080f, 35f);
|
NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,8 +235,9 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
private static void OnScreenDimensionsChanged()
|
private static void OnScreenDimensionsChanged()
|
||||||
{
|
{
|
||||||
lastScreenWidth = Screen.width;
|
var display = DisplayManager.ActiveDisplay;
|
||||||
lastScreenHeight = Screen.height;
|
lastScreenWidth = display.renderingWidth;
|
||||||
|
lastScreenHeight = display.renderingHeight;
|
||||||
|
|
||||||
foreach (var panel in UIPanels)
|
foreach (var panel in UIPanels)
|
||||||
{
|
{
|
||||||
@ -243,6 +257,8 @@ namespace UnityExplorer.UI
|
|||||||
closeBtn.ButtonText.text = val.ToString();
|
closeBtn.ButtonText.text = val.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Time controls
|
||||||
|
|
||||||
private static void OnTimeInputEndEdit(string val)
|
private static void OnTimeInputEndEdit(string val)
|
||||||
{
|
{
|
||||||
if (pauseButtonPausing)
|
if (pauseButtonPausing)
|
||||||
@ -273,7 +289,7 @@ namespace UnityExplorer.UI
|
|||||||
timeInput.Component.textComponent.color = pauseButtonPausing ? Color.grey : Color.white;
|
timeInput.Component.textComponent.color = pauseButtonPausing ? Color.grey : Color.white;
|
||||||
|
|
||||||
Color color = pauseButtonPausing ? new Color(0.3f, 0.3f, 0.2f) : new Color(0.2f, 0.2f, 0.2f);
|
Color color = pauseButtonPausing ? new Color(0.3f, 0.3f, 0.2f) : new Color(0.2f, 0.2f, 0.2f);
|
||||||
RuntimeProvider.Instance.SetColorBlock(pauseBtn.Component, color, color * 1.2f, color * 0.7f);
|
RuntimeHelper.SetColorBlock(pauseBtn.Component, color, color * 1.2f, color * 0.7f);
|
||||||
pauseBtn.ButtonText.text = pauseButtonPausing ? "►" : "||";
|
pauseBtn.ButtonText.text = pauseButtonPausing ? "►" : "||";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,27 +344,20 @@ namespace UnityExplorer.UI
|
|||||||
|
|
||||||
timeInput = UIFactory.CreateInputField(navbarPanel, "TimeInput", "timeScale");
|
timeInput = UIFactory.CreateInputField(navbarPanel, "TimeInput", "timeScale");
|
||||||
UIFactory.SetLayoutElement(timeInput.Component.gameObject, minHeight: 25, minWidth: 40);
|
UIFactory.SetLayoutElement(timeInput.Component.gameObject, minHeight: 25, minWidth: 40);
|
||||||
timeInput.Text = Time.timeScale.ToString("F2");
|
|
||||||
timeInput.Component.GetOnEndEdit().AddListener(OnTimeInputEndEdit);
|
timeInput.Component.GetOnEndEdit().AddListener(OnTimeInputEndEdit);
|
||||||
|
|
||||||
|
timeInput.Text = string.Empty;
|
||||||
|
timeInput.Text = Time.timeScale.ToString();
|
||||||
|
|
||||||
pauseBtn = UIFactory.CreateButton(navbarPanel, "PauseButton", "||", new Color(0.2f, 0.2f, 0.2f));
|
pauseBtn = UIFactory.CreateButton(navbarPanel, "PauseButton", "||", new Color(0.2f, 0.2f, 0.2f));
|
||||||
UIFactory.SetLayoutElement(pauseBtn.Component.gameObject, minHeight: 25, minWidth: 25);
|
UIFactory.SetLayoutElement(pauseBtn.Component.gameObject, minHeight: 25, minWidth: 25);
|
||||||
pauseBtn.OnClick += OnPauseButtonClicked;
|
pauseBtn.OnClick += OnPauseButtonClicked;
|
||||||
|
|
||||||
// Inspect under mouse dropdown
|
|
||||||
|
|
||||||
var mouseDropdown = UIFactory.CreateDropdown(navbarPanel, out MouseInspectDropdown, "Mouse Inspect", 14,
|
|
||||||
InspectUnderMouse.OnDropdownSelect);
|
|
||||||
UIFactory.SetLayoutElement(mouseDropdown, minHeight: 25, minWidth: 140);
|
|
||||||
MouseInspectDropdown.options.Add(new Dropdown.OptionData("Mouse Inspect"));
|
|
||||||
MouseInspectDropdown.options.Add(new Dropdown.OptionData("World"));
|
|
||||||
MouseInspectDropdown.options.Add(new Dropdown.OptionData("UI"));
|
|
||||||
|
|
||||||
// Hide menu button
|
// Hide menu button
|
||||||
|
|
||||||
closeBtn = UIFactory.CreateButton(navbarPanel, "CloseButton", ConfigManager.Master_Toggle.Value.ToString());
|
closeBtn = UIFactory.CreateButton(navbarPanel, "CloseButton", ConfigManager.Master_Toggle.Value.ToString());
|
||||||
UIFactory.SetLayoutElement(closeBtn.Component.gameObject, minHeight: 25, minWidth: 80, flexibleWidth: 0);
|
UIFactory.SetLayoutElement(closeBtn.Component.gameObject, minHeight: 25, minWidth: 80, flexibleWidth: 0);
|
||||||
RuntimeProvider.Instance.SetColorBlock(closeBtn.Component, new Color(0.63f, 0.32f, 0.31f),
|
RuntimeHelper.SetColorBlock(closeBtn.Component, new Color(0.63f, 0.32f, 0.31f),
|
||||||
new Color(0.81f, 0.25f, 0.2f), new Color(0.6f, 0.18f, 0.16f));
|
new Color(0.81f, 0.25f, 0.2f), new Color(0.6f, 0.18f, 0.16f));
|
||||||
|
|
||||||
ConfigManager.Master_Toggle.OnValueChanged += Master_Toggle_OnValueChanged;
|
ConfigManager.Master_Toggle.OnValueChanged += Master_Toggle_OnValueChanged;
|
||||||
|
@ -5,12 +5,15 @@ using UnityEngine;
|
|||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UniverseLib.Input;
|
using UniverseLib.Input;
|
||||||
using UnityExplorer.Core.Runtime;
|
using UnityExplorer.Runtime;
|
||||||
using UnityExplorer.UI;
|
using UnityExplorer.UI;
|
||||||
using UnityExplorer.UI.Panels;
|
using UnityExplorer.UI.Panels;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Widgets.ButtonList;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Widgets.AutoComplete
|
namespace UnityExplorer.UI.Widgets.AutoComplete
|
||||||
{
|
{
|
||||||
@ -37,7 +40,7 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
public static ScrollPool<ButtonCell> scrollPool;
|
public static ScrollPool<ButtonCell> scrollPool;
|
||||||
private static GameObject navigationTipRow;
|
private static GameObject navigationTipRow;
|
||||||
|
|
||||||
private static List<Suggestion> Suggestions = new List<Suggestion>();
|
private static List<Suggestion> Suggestions = new();
|
||||||
private static int SelectedIndex = 0;
|
private static int SelectedIndex = 0;
|
||||||
|
|
||||||
public static Suggestion SelectedSuggestion => Suggestions[SelectedIndex];
|
public static Suggestion SelectedSuggestion => Suggestions[SelectedIndex];
|
||||||
@ -164,11 +167,9 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
if (!CurrentHandler.InputField.UIRoot.activeInHierarchy)
|
if (!CurrentHandler.InputField.UIRoot.activeInHierarchy)
|
||||||
ReleaseOwnership(CurrentHandler);
|
ReleaseOwnership(CurrentHandler);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
UpdatePosition();
|
UpdatePosition();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Setting autocomplete cell buttons
|
// Setting autocomplete cell buttons
|
||||||
|
|
||||||
@ -215,10 +216,10 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
scrollPool.Content.anchoredPosition = pos;
|
scrollPool.Content.anchoredPosition = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
RuntimeProvider.Instance.SetColorBlock(cell.Button.Component, selectedSuggestionColor);
|
RuntimeHelper.SetColorBlock(cell.Button.Component, selectedSuggestionColor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
RuntimeProvider.Instance.SetColorBlock(cell.Button.Component, inactiveSuggestionColor);
|
RuntimeHelper.SetColorBlock(cell.Button.Component, inactiveSuggestionColor);
|
||||||
|
|
||||||
setFirstCell = true;
|
setFirstCell = true;
|
||||||
}
|
}
|
||||||
@ -228,9 +229,9 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
private int lastCaretPosition;
|
private int lastCaretPosition;
|
||||||
private Vector3 lastInputPosition;
|
private Vector3 lastInputPosition;
|
||||||
|
|
||||||
private void UpdatePosition()
|
internal void UpdatePosition()
|
||||||
{
|
{
|
||||||
if (CurrentHandler == null || !CurrentHandler.InputField.Component.isFocused)
|
if (CurrentHandler == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var input = CurrentHandler.InputField;
|
var input = CurrentHandler.InputField;
|
||||||
@ -249,15 +250,16 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
Vector3 caretPos = textGen.characters[caretIdx].cursorPos;
|
Vector3 caretPos = textGen.characters[caretIdx].cursorPos;
|
||||||
// transform to world point
|
// transform to world point
|
||||||
caretPos = input.UIRoot.transform.TransformPoint(caretPos);
|
caretPos = input.UIRoot.transform.TransformPoint(caretPos);
|
||||||
caretPos += new Vector3(input.Rect.rect.width * 0.5f, -(input.Rect.rect.height * 0.5f), 0);
|
caretPos += new Vector3(input.Transform.rect.width * 0.5f, -(input.Transform.rect.height * 0.5f), 0);
|
||||||
|
|
||||||
uiRoot.transform.position = new Vector3(caretPos.x + 10, caretPos.y - 30, 0);
|
uiRoot.transform.position = new Vector3(caretPos.x + 10, caretPos.y - 30, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var textGen = input.Component.textComponent.cachedTextGenerator;
|
uiRoot.transform.position = input.Transform.position + new Vector3(-(input.Transform.rect.width / 2) + 10, -20, 0);
|
||||||
var pos = input.UIRoot.transform.TransformPoint(textGen.characters[0].cursorPos);
|
//var textGen = input.Component.textComponent.cachedTextGenerator;
|
||||||
uiRoot.transform.position = new Vector3(pos.x + 10, pos.y - 20, 0);
|
//var pos = input.UIRoot.transform.TransformPoint(textGen.characters[0].cursorPos);
|
||||||
|
//uiRoot.transform.position = new Vector3(pos.x + 10, pos.y - 20, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Dragger.OnEndResize();
|
this.Dragger.OnEndResize();
|
||||||
@ -303,25 +305,18 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
{
|
{
|
||||||
dataHandler = new ButtonListHandler<Suggestion, ButtonCell>(scrollPool, GetEntries, SetCell, ShouldDisplay, OnCellClicked);
|
dataHandler = new ButtonListHandler<Suggestion, ButtonCell>(scrollPool, GetEntries, SetCell, ShouldDisplay, OnCellClicked);
|
||||||
|
|
||||||
scrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.content, "AutoCompleter", out GameObject scrollObj,
|
scrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.uiRoot, "AutoCompleter", out GameObject scrollObj,
|
||||||
out GameObject scrollContent);
|
out GameObject scrollContent);
|
||||||
scrollPool.Initialize(dataHandler);
|
scrollPool.Initialize(dataHandler);
|
||||||
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
|
||||||
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(scrollContent, true, false, true, false);
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(scrollContent, true, false, true, false);
|
||||||
|
|
||||||
navigationTipRow = UIFactory.CreateHorizontalGroup(this.content, "BottomRow", true, true, true, true, 0, new Vector4(2, 2, 2, 2));
|
navigationTipRow = UIFactory.CreateHorizontalGroup(this.uiRoot, "BottomRow", true, true, true, true, 0, new Vector4(2, 2, 2, 2));
|
||||||
UIFactory.SetLayoutElement(navigationTipRow, minHeight: 20, flexibleWidth: 9999);
|
UIFactory.SetLayoutElement(navigationTipRow, minHeight: 20, flexibleWidth: 9999);
|
||||||
UIFactory.CreateLabel(navigationTipRow, "HelpText", "Up/Down to select, Enter to use, Esc to close",
|
UIFactory.CreateLabel(navigationTipRow, "HelpText", "Up/Down to select, Enter to use, Esc to close",
|
||||||
TextAnchor.MiddleLeft, Color.grey, false, 13);
|
TextAnchor.MiddleLeft, Color.grey, false, 13);
|
||||||
|
|
||||||
UIRoot.SetActive(false);
|
UIRoot.SetActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DoSaveToConfigElement()
|
|
||||||
{
|
|
||||||
// not savable
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string GetSaveDataFromConfigManager() => null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
162
src/UI/Widgets/AutoComplete/EnumCompleter.cs
Normal file
162
src/UI/Widgets/AutoComplete/EnumCompleter.cs
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using UnityExplorer.CacheObject.IValues;
|
||||||
|
using UniverseLib;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Widgets.AutoComplete
|
||||||
|
{
|
||||||
|
public class EnumCompleter : ISuggestionProvider
|
||||||
|
{
|
||||||
|
public bool Enabled
|
||||||
|
{
|
||||||
|
get => _enabled;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_enabled = value;
|
||||||
|
if (!_enabled)
|
||||||
|
AutoCompleteModal.Instance.ReleaseOwnership(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private bool _enabled = true;
|
||||||
|
|
||||||
|
public event Action<Suggestion> SuggestionClicked;
|
||||||
|
|
||||||
|
public Type EnumType { get; set; }
|
||||||
|
|
||||||
|
public InputFieldRef InputField { get; }
|
||||||
|
public bool AnchorToCaretPosition => false;
|
||||||
|
|
||||||
|
private readonly List<Suggestion> suggestions = new List<Suggestion>();
|
||||||
|
private readonly HashSet<string> suggestedValues = new HashSet<string>();
|
||||||
|
|
||||||
|
private OrderedDictionary enumValues;
|
||||||
|
|
||||||
|
internal string chosenSuggestion;
|
||||||
|
|
||||||
|
bool ISuggestionProvider.AllowNavigation => false;
|
||||||
|
|
||||||
|
public EnumCompleter(Type enumType, InputFieldRef inputField)
|
||||||
|
{
|
||||||
|
EnumType = enumType;
|
||||||
|
InputField = inputField;
|
||||||
|
|
||||||
|
inputField.OnValueChanged += OnInputFieldChanged;
|
||||||
|
|
||||||
|
if (EnumType != null)
|
||||||
|
CacheEnumValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CacheEnumValues()
|
||||||
|
{
|
||||||
|
enumValues = InteractiveEnum.GetEnumValues(EnumType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetLastSplitInput(string fullInput)
|
||||||
|
{
|
||||||
|
string ret = fullInput;
|
||||||
|
|
||||||
|
int lastSplit = fullInput.LastIndexOf(',');
|
||||||
|
if (lastSplit >= 0)
|
||||||
|
{
|
||||||
|
lastSplit++;
|
||||||
|
if (lastSplit == fullInput.Length)
|
||||||
|
ret = "";
|
||||||
|
else
|
||||||
|
ret = fullInput.Substring(lastSplit);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnSuggestionClicked(Suggestion suggestion)
|
||||||
|
{
|
||||||
|
chosenSuggestion = suggestion.UnderlyingValue;
|
||||||
|
|
||||||
|
string lastInput = GetLastSplitInput(InputField.Text);
|
||||||
|
|
||||||
|
if (lastInput != suggestion.UnderlyingValue)
|
||||||
|
{
|
||||||
|
string valueToSet = InputField.Text;
|
||||||
|
|
||||||
|
if (valueToSet.Length > 0)
|
||||||
|
valueToSet = valueToSet.Substring(0, InputField.Text.Length - lastInput.Length);
|
||||||
|
|
||||||
|
valueToSet += suggestion.UnderlyingValue;
|
||||||
|
|
||||||
|
InputField.Text = valueToSet;
|
||||||
|
|
||||||
|
//InputField.Text += suggestion.UnderlyingValue.Substring(lastInput.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
SuggestionClicked?.Invoke(suggestion);
|
||||||
|
|
||||||
|
suggestions.Clear();
|
||||||
|
AutoCompleteModal.Instance.SetSuggestions(suggestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void HelperButtonClicked()
|
||||||
|
{
|
||||||
|
GetSuggestions("");
|
||||||
|
AutoCompleteModal.Instance.TakeOwnership(this);
|
||||||
|
AutoCompleteModal.Instance.SetSuggestions(suggestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInputFieldChanged(string value)
|
||||||
|
{
|
||||||
|
if (!Enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(value) || GetLastSplitInput(value) == chosenSuggestion)
|
||||||
|
{
|
||||||
|
chosenSuggestion = null;
|
||||||
|
AutoCompleteModal.Instance.ReleaseOwnership(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetSuggestions(value);
|
||||||
|
|
||||||
|
AutoCompleteModal.Instance.TakeOwnership(this);
|
||||||
|
AutoCompleteModal.Instance.SetSuggestions(suggestions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GetSuggestions(string value)
|
||||||
|
{
|
||||||
|
suggestions.Clear();
|
||||||
|
suggestedValues.Clear();
|
||||||
|
|
||||||
|
if (EnumType == null)
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning("Autocompleter Base enum type is null!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = GetLastSplitInput(value);
|
||||||
|
|
||||||
|
for (int i = 0; i < this.enumValues.Count; i++)
|
||||||
|
{
|
||||||
|
var enumValue = (CachedEnumValue)enumValues[i];
|
||||||
|
if (enumValue.Name.ContainsIgnoreCase(value))
|
||||||
|
AddSuggestion(enumValue.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static readonly Dictionary<string, string> sharedValueToLabel = new Dictionary<string, string>(4096);
|
||||||
|
|
||||||
|
void AddSuggestion(string value)
|
||||||
|
{
|
||||||
|
if (suggestedValues.Contains(value))
|
||||||
|
return;
|
||||||
|
suggestedValues.Add(value);
|
||||||
|
|
||||||
|
if (!sharedValueToLabel.ContainsKey(value))
|
||||||
|
sharedValueToLabel.Add(value, $"<color={SignatureHighlighter.CONST}>{value}</color>");
|
||||||
|
|
||||||
|
suggestions.Add(new Suggestion(sharedValueToLabel[value], value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ using System.Text;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Widgets.AutoComplete
|
namespace UnityExplorer.UI.Widgets.AutoComplete
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,6 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityExplorer.Core;
|
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Widgets.AutoComplete
|
namespace UnityExplorer.UI.Widgets.AutoComplete
|
||||||
{
|
{
|
||||||
@ -12,8 +11,6 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
public readonly string DisplayText;
|
public readonly string DisplayText;
|
||||||
public readonly string UnderlyingValue;
|
public readonly string UnderlyingValue;
|
||||||
|
|
||||||
public string Combined => DisplayText + UnderlyingValue;
|
|
||||||
|
|
||||||
public Suggestion(string displayText, string underlyingValue)
|
public Suggestion(string displayText, string underlyingValue)
|
||||||
{
|
{
|
||||||
DisplayText = displayText;
|
DisplayText = displayText;
|
||||||
|
@ -2,25 +2,37 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Widgets.AutoComplete
|
namespace UnityExplorer.UI.Widgets.AutoComplete
|
||||||
{
|
{
|
||||||
public class TypeCompleter : ISuggestionProvider
|
public class TypeCompleter : ISuggestionProvider
|
||||||
{
|
{
|
||||||
internal static readonly Dictionary<string, string> sharedTypeToLabel = new Dictionary<string, string>(4096);
|
public bool Enabled
|
||||||
|
{
|
||||||
|
get => _enabled;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_enabled = value;
|
||||||
|
if (!_enabled)
|
||||||
|
AutoCompleteModal.Instance.ReleaseOwnership(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private bool _enabled = true;
|
||||||
|
|
||||||
public event Action<Suggestion> SuggestionClicked;
|
public event Action<Suggestion> SuggestionClicked;
|
||||||
|
|
||||||
public Type BaseType { get; set; }
|
public Type BaseType { get; set; }
|
||||||
public Type[] GenericConstraints { get; set; }
|
public Type[] GenericConstraints { get; set; }
|
||||||
private bool allowAbstract;
|
private readonly bool allowAbstract;
|
||||||
private bool allowEnum;
|
private readonly bool allowEnum;
|
||||||
|
|
||||||
public InputFieldRef InputField { get; }
|
public InputFieldRef InputField { get; }
|
||||||
public bool AnchorToCaretPosition => false;
|
public bool AnchorToCaretPosition => false;
|
||||||
|
|
||||||
private readonly List<Suggestion> suggestions = new List<Suggestion>();
|
private readonly List<Suggestion> suggestions = new();
|
||||||
private readonly HashSet<string> suggestedNames = new HashSet<string>();
|
private readonly HashSet<string> suggestedNames = new();
|
||||||
|
|
||||||
private HashSet<Type> allowedTypes;
|
private HashSet<Type> allowedTypes;
|
||||||
|
|
||||||
@ -61,6 +73,9 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
|
|
||||||
private void OnInputFieldChanged(string value)
|
private void OnInputFieldChanged(string value)
|
||||||
{
|
{
|
||||||
|
if (!Enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(value) || value == chosenSuggestion)
|
if (string.IsNullOrEmpty(value) || value == chosenSuggestion)
|
||||||
{
|
{
|
||||||
chosenSuggestion = null;
|
chosenSuggestion = null;
|
||||||
@ -97,6 +112,8 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static readonly Dictionary<string, string> sharedTypeToLabel = new();
|
||||||
|
|
||||||
void AddSuggestion(Type type)
|
void AddSuggestion(Type type)
|
||||||
{
|
{
|
||||||
if (suggestedNames.Contains(type.FullName))
|
if (suggestedNames.Contains(type.FullName))
|
||||||
|
52
src/UI/Widgets/EvaluateWidget/BaseArgumentHandler.cs
Normal file
52
src/UI/Widgets/EvaluateWidget/BaseArgumentHandler.cs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Widgets
|
||||||
|
{
|
||||||
|
public abstract class BaseArgumentHandler : IPooledObject
|
||||||
|
{
|
||||||
|
protected EvaluateWidget evaluator;
|
||||||
|
|
||||||
|
internal Text argNameLabel;
|
||||||
|
internal InputFieldRef inputField;
|
||||||
|
internal TypeCompleter typeCompleter;
|
||||||
|
|
||||||
|
// IPooledObject
|
||||||
|
public float DefaultHeight => 25f;
|
||||||
|
public GameObject UIRoot { get; set; }
|
||||||
|
|
||||||
|
public abstract void CreateSpecialContent();
|
||||||
|
|
||||||
|
public GameObject CreateContent(GameObject parent)
|
||||||
|
{
|
||||||
|
UIRoot = UIFactory.CreateUIObject("ArgRow", parent);
|
||||||
|
UIFactory.SetLayoutElement(UIRoot, minHeight: 25, flexibleHeight: 50, minWidth: 50, flexibleWidth: 9999);
|
||||||
|
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(UIRoot, false, false, true, true, 5);
|
||||||
|
UIRoot.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
argNameLabel = UIFactory.CreateLabel(UIRoot, "ArgLabel", "not set", TextAnchor.MiddleLeft);
|
||||||
|
UIFactory.SetLayoutElement(argNameLabel.gameObject, minWidth: 40, flexibleWidth: 90, minHeight: 25, flexibleHeight: 50);
|
||||||
|
argNameLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
|
||||||
|
|
||||||
|
inputField = UIFactory.CreateInputField(UIRoot, "InputField", "...");
|
||||||
|
UIFactory.SetLayoutElement(inputField.UIRoot, minHeight: 25, flexibleHeight: 50, minWidth: 100, flexibleWidth: 1000);
|
||||||
|
inputField.Component.lineType = InputField.LineType.MultiLineNewline;
|
||||||
|
inputField.UIRoot.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
typeCompleter = new TypeCompleter(typeof(object), this.inputField);
|
||||||
|
typeCompleter.Enabled = false;
|
||||||
|
|
||||||
|
CreateSpecialContent();
|
||||||
|
|
||||||
|
return UIRoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
167
src/UI/Widgets/EvaluateWidget/EvaluateWidget.cs
Normal file
167
src/UI/Widgets/EvaluateWidget/EvaluateWidget.cs
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib;
|
||||||
|
using UnityExplorer.CacheObject;
|
||||||
|
using UniverseLib.UI.ObjectPool;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Widgets
|
||||||
|
{
|
||||||
|
public class EvaluateWidget : IPooledObject
|
||||||
|
{
|
||||||
|
public CacheMember Owner { get; set; }
|
||||||
|
|
||||||
|
public GameObject UIRoot { get; set; }
|
||||||
|
public float DefaultHeight => -1f;
|
||||||
|
|
||||||
|
private ParameterInfo[] parameters;
|
||||||
|
internal GameObject parametersHolder;
|
||||||
|
private ParameterHandler[] paramHandlers;
|
||||||
|
|
||||||
|
private Type[] genericArguments;
|
||||||
|
internal GameObject genericArgumentsHolder;
|
||||||
|
private GenericArgumentHandler[] genericHandlers;
|
||||||
|
|
||||||
|
public void OnBorrowedFromPool(CacheMember owner)
|
||||||
|
{
|
||||||
|
this.Owner = owner;
|
||||||
|
|
||||||
|
parameters = owner.Arguments;
|
||||||
|
paramHandlers = new ParameterHandler[parameters.Length];
|
||||||
|
|
||||||
|
genericArguments = owner.GenericArguments;
|
||||||
|
genericHandlers = new GenericArgumentHandler[genericArguments.Length];
|
||||||
|
|
||||||
|
SetArgRows();
|
||||||
|
|
||||||
|
this.UIRoot.SetActive(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnReturnToPool()
|
||||||
|
{
|
||||||
|
foreach (var widget in paramHandlers)
|
||||||
|
{
|
||||||
|
widget.OnReturned();
|
||||||
|
Pool<ParameterHandler>.Return(widget);
|
||||||
|
}
|
||||||
|
paramHandlers = null;
|
||||||
|
|
||||||
|
foreach (var widget in genericHandlers)
|
||||||
|
{
|
||||||
|
widget.OnReturned();
|
||||||
|
Pool<GenericArgumentHandler>.Return(widget);
|
||||||
|
}
|
||||||
|
genericHandlers = null;
|
||||||
|
|
||||||
|
this.Owner = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type[] TryParseGenericArguments()
|
||||||
|
{
|
||||||
|
Type[] outArgs = new Type[genericArguments.Length];
|
||||||
|
|
||||||
|
for (int i = 0; i < genericArguments.Length; i++)
|
||||||
|
outArgs[i] = genericHandlers[i].Evaluate();
|
||||||
|
|
||||||
|
return outArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object[] TryParseArguments()
|
||||||
|
{
|
||||||
|
object[] outArgs = new object[parameters.Length];
|
||||||
|
|
||||||
|
for (int i = 0; i < parameters.Length; i++)
|
||||||
|
outArgs[i] = paramHandlers[i].Evaluate();
|
||||||
|
|
||||||
|
return outArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetArgRows()
|
||||||
|
{
|
||||||
|
if (genericArguments.Any())
|
||||||
|
{
|
||||||
|
genericArgumentsHolder.SetActive(true);
|
||||||
|
SetGenericRows();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
genericArgumentsHolder.SetActive(false);
|
||||||
|
|
||||||
|
if (parameters.Any())
|
||||||
|
{
|
||||||
|
parametersHolder.SetActive(true);
|
||||||
|
SetNormalArgRows();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
parametersHolder.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetGenericRows()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < genericArguments.Length; i++)
|
||||||
|
{
|
||||||
|
var type = genericArguments[i];
|
||||||
|
|
||||||
|
var holder = genericHandlers[i] = Pool<GenericArgumentHandler>.Borrow();
|
||||||
|
holder.UIRoot.transform.SetParent(this.genericArgumentsHolder.transform, false);
|
||||||
|
holder.OnBorrowed(this, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetNormalArgRows()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < parameters.Length; i++)
|
||||||
|
{
|
||||||
|
var param = parameters[i];
|
||||||
|
|
||||||
|
var holder = paramHandlers[i] = Pool<ParameterHandler>.Borrow();
|
||||||
|
holder.UIRoot.transform.SetParent(this.parametersHolder.transform, false);
|
||||||
|
holder.OnBorrowed(this, param);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public GameObject CreateContent(GameObject parent)
|
||||||
|
{
|
||||||
|
UIRoot = UIFactory.CreateVerticalGroup(parent, "EvaluateWidget", false, false, true, true, 3, new Vector4(2, 2, 2, 2),
|
||||||
|
new Color(0.15f, 0.15f, 0.15f));
|
||||||
|
UIFactory.SetLayoutElement(UIRoot, minWidth: 50, flexibleWidth: 9999, minHeight: 50, flexibleHeight: 800);
|
||||||
|
//UIRoot.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
// generic args
|
||||||
|
this.genericArgumentsHolder = UIFactory.CreateUIObject("GenericHolder", UIRoot);
|
||||||
|
UIFactory.SetLayoutElement(genericArgumentsHolder, flexibleWidth: 1000);
|
||||||
|
var genericsTitle = UIFactory.CreateLabel(genericArgumentsHolder, "GenericsTitle", "Generic Arguments", TextAnchor.MiddleLeft);
|
||||||
|
UIFactory.SetLayoutElement(genericsTitle.gameObject, minHeight: 25, flexibleWidth: 1000);
|
||||||
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(genericArgumentsHolder, false, false, true, true, 3);
|
||||||
|
UIFactory.SetLayoutElement(genericArgumentsHolder, minHeight: 25, flexibleHeight: 750, minWidth: 50, flexibleWidth: 9999);
|
||||||
|
//genericArgHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
// args
|
||||||
|
this.parametersHolder = UIFactory.CreateUIObject("ArgHolder", UIRoot);
|
||||||
|
UIFactory.SetLayoutElement(parametersHolder, flexibleWidth: 1000);
|
||||||
|
var argsTitle = UIFactory.CreateLabel(parametersHolder, "ArgsTitle", "Arguments", TextAnchor.MiddleLeft);
|
||||||
|
UIFactory.SetLayoutElement(argsTitle.gameObject, minHeight: 25, flexibleWidth: 1000);
|
||||||
|
UIFactory.SetLayoutGroup<VerticalLayoutGroup>(parametersHolder, false, false, true, true, 3);
|
||||||
|
UIFactory.SetLayoutElement(parametersHolder, minHeight: 25, flexibleHeight: 750, minWidth: 50, flexibleWidth: 9999);
|
||||||
|
//argHolder.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
// evaluate button
|
||||||
|
var evalButton = UIFactory.CreateButton(UIRoot, "EvaluateButton", "Evaluate", new Color(0.2f, 0.2f, 0.2f));
|
||||||
|
UIFactory.SetLayoutElement(evalButton.Component.gameObject, minHeight: 25, minWidth: 150, flexibleWidth: 0);
|
||||||
|
evalButton.OnClick += () =>
|
||||||
|
{
|
||||||
|
Owner.EvaluateAndSetCell();
|
||||||
|
};
|
||||||
|
|
||||||
|
return UIRoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
62
src/UI/Widgets/EvaluateWidget/GenericArgumentHandler.cs
Normal file
62
src/UI/Widgets/EvaluateWidget/GenericArgumentHandler.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using UniverseLib;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Widgets
|
||||||
|
{
|
||||||
|
public class GenericArgumentHandler : BaseArgumentHandler
|
||||||
|
{
|
||||||
|
private Type genericType;
|
||||||
|
|
||||||
|
public void OnBorrowed(EvaluateWidget evaluator, Type genericConstraint)
|
||||||
|
{
|
||||||
|
this.evaluator = evaluator;
|
||||||
|
this.genericType = genericConstraint;
|
||||||
|
|
||||||
|
typeCompleter.Enabled = true;
|
||||||
|
typeCompleter.BaseType = genericType;
|
||||||
|
typeCompleter.CacheTypes();
|
||||||
|
|
||||||
|
var constraints = genericType.GetGenericParameterConstraints();
|
||||||
|
typeCompleter.GenericConstraints = constraints;
|
||||||
|
|
||||||
|
var sb = new StringBuilder($"<color={SignatureHighlighter.CONST}>{genericType.Name}</color>");
|
||||||
|
|
||||||
|
for (int j = 0; j < constraints.Length; j++)
|
||||||
|
{
|
||||||
|
if (j == 0) sb.Append(' ').Append('(');
|
||||||
|
else sb.Append(',').Append(' ');
|
||||||
|
|
||||||
|
sb.Append(SignatureHighlighter.Parse(constraints[j], false));
|
||||||
|
|
||||||
|
if (j + 1 == constraints.Length)
|
||||||
|
sb.Append(')');
|
||||||
|
}
|
||||||
|
|
||||||
|
argNameLabel.text = sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnReturned()
|
||||||
|
{
|
||||||
|
this.evaluator = null;
|
||||||
|
this.genericType = null;
|
||||||
|
|
||||||
|
this.typeCompleter.Enabled = false;
|
||||||
|
|
||||||
|
this.inputField.Text = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type Evaluate()
|
||||||
|
{
|
||||||
|
return ReflectionUtility.GetTypeByName(this.inputField.Text)
|
||||||
|
?? throw new Exception($"Could not find any type by name '{this.inputField.Text}'!");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CreateSpecialContent()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
179
src/UI/Widgets/EvaluateWidget/ParameterHandler.cs
Normal file
179
src/UI/Widgets/EvaluateWidget/ParameterHandler.cs
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
using HarmonyLib;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using System.Reflection;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
using UnityExplorer.CacheObject.IValues;
|
||||||
|
using UnityExplorer.UI.Panels;
|
||||||
|
using UnityExplorer.UI.Widgets.AutoComplete;
|
||||||
|
using UniverseLib;
|
||||||
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.Widgets
|
||||||
|
{
|
||||||
|
public class ParameterHandler : BaseArgumentHandler
|
||||||
|
{
|
||||||
|
private ParameterInfo paramInfo;
|
||||||
|
private Type paramType;
|
||||||
|
|
||||||
|
internal EnumCompleter enumCompleter;
|
||||||
|
private ButtonRef enumHelperButton;
|
||||||
|
|
||||||
|
private bool usingBasicLabel;
|
||||||
|
private object basicValue;
|
||||||
|
private GameObject basicLabelHolder;
|
||||||
|
private Text basicLabel;
|
||||||
|
private ButtonRef pasteButton;
|
||||||
|
|
||||||
|
public void OnBorrowed(EvaluateWidget evaluator, ParameterInfo paramInfo)
|
||||||
|
{
|
||||||
|
this.evaluator = evaluator;
|
||||||
|
this.paramInfo = paramInfo;
|
||||||
|
|
||||||
|
this.paramType = paramInfo.ParameterType;
|
||||||
|
if (paramType.IsByRef)
|
||||||
|
paramType = paramType.GetElementType();
|
||||||
|
|
||||||
|
this.argNameLabel.text =
|
||||||
|
$"{SignatureHighlighter.Parse(paramType, false)} <color={SignatureHighlighter.LOCAL_ARG}>{paramInfo.Name}</color>";
|
||||||
|
|
||||||
|
if (ParseUtility.CanParse(paramType) || typeof(Type).IsAssignableFrom(paramType))
|
||||||
|
{
|
||||||
|
usingBasicLabel = false;
|
||||||
|
|
||||||
|
this.inputField.Component.gameObject.SetActive(true);
|
||||||
|
this.basicLabelHolder.SetActive(false);
|
||||||
|
this.typeCompleter.Enabled = typeof(Type).IsAssignableFrom(paramType);
|
||||||
|
this.enumCompleter.Enabled = paramType.IsEnum;
|
||||||
|
this.enumHelperButton.Component.gameObject.SetActive(paramType.IsEnum);
|
||||||
|
|
||||||
|
if (!typeCompleter.Enabled)
|
||||||
|
{
|
||||||
|
if (paramType == typeof(string))
|
||||||
|
inputField.PlaceholderText.text = "...";
|
||||||
|
else
|
||||||
|
inputField.PlaceholderText.text = $"eg. {ParseUtility.GetExampleInput(paramType)}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inputField.PlaceholderText.text = "Enter a Type name...";
|
||||||
|
this.typeCompleter.BaseType = typeof(object);
|
||||||
|
this.typeCompleter.CacheTypes();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enumCompleter.Enabled)
|
||||||
|
{
|
||||||
|
enumCompleter.EnumType = paramType;
|
||||||
|
enumCompleter.CacheEnumValues();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// non-parsable, and not a Type
|
||||||
|
usingBasicLabel = true;
|
||||||
|
|
||||||
|
this.inputField.Component.gameObject.SetActive(false);
|
||||||
|
this.basicLabelHolder.SetActive(true);
|
||||||
|
this.typeCompleter.Enabled = false;
|
||||||
|
this.enumCompleter.Enabled = false;
|
||||||
|
this.enumHelperButton.Component.gameObject.SetActive(false);
|
||||||
|
|
||||||
|
SetDisplayedValueFromPaste();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnReturned()
|
||||||
|
{
|
||||||
|
this.evaluator = null;
|
||||||
|
this.paramInfo = null;
|
||||||
|
|
||||||
|
this.enumCompleter.Enabled = false;
|
||||||
|
this.typeCompleter.Enabled = false;
|
||||||
|
|
||||||
|
this.inputField.Text = "";
|
||||||
|
|
||||||
|
this.usingBasicLabel = false;
|
||||||
|
this.basicValue = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object Evaluate()
|
||||||
|
{
|
||||||
|
if (usingBasicLabel)
|
||||||
|
return basicValue;
|
||||||
|
|
||||||
|
var input = this.inputField.Text;
|
||||||
|
|
||||||
|
if (typeof(Type).IsAssignableFrom(paramType))
|
||||||
|
return ReflectionUtility.GetTypeByName(input);
|
||||||
|
|
||||||
|
if (paramType == typeof(string))
|
||||||
|
return input;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(input))
|
||||||
|
{
|
||||||
|
if (paramInfo.IsOptional)
|
||||||
|
return paramInfo.DefaultValue;
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ParseUtility.TryParse(input, paramType, out object parsed, out Exception ex))
|
||||||
|
{
|
||||||
|
ExplorerCore.LogWarning($"Cannot parse argument '{paramInfo.Name}' ({paramInfo.ParameterType.Name})" +
|
||||||
|
$"{(ex == null ? "" : $", {ex.GetType().Name}: {ex.Message}")}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPasteClicked()
|
||||||
|
{
|
||||||
|
if (ClipboardPanel.TryPaste(this.paramType, out object paste))
|
||||||
|
{
|
||||||
|
basicValue = paste;
|
||||||
|
SetDisplayedValueFromPaste();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetDisplayedValueFromPaste()
|
||||||
|
{
|
||||||
|
if (usingBasicLabel)
|
||||||
|
basicLabel.text = ToStringUtility.ToStringWithType(basicValue, paramType, false);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (typeof(Type).IsAssignableFrom(paramType))
|
||||||
|
inputField.Text = (basicValue as Type).FullDescription();
|
||||||
|
else
|
||||||
|
inputField.Text = ParseUtility.ToStringForInput(basicValue, paramType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CreateSpecialContent()
|
||||||
|
{
|
||||||
|
enumCompleter = new(paramType, this.inputField)
|
||||||
|
{
|
||||||
|
Enabled = false
|
||||||
|
};
|
||||||
|
|
||||||
|
enumHelperButton = UIFactory.CreateButton(UIRoot, "EnumHelper", "▼");
|
||||||
|
UIFactory.SetLayoutElement(enumHelperButton.Component.gameObject, minWidth: 25, minHeight: 25, flexibleWidth: 0, flexibleHeight: 0);
|
||||||
|
enumHelperButton.OnClick += enumCompleter.HelperButtonClicked;
|
||||||
|
|
||||||
|
basicLabelHolder = UIFactory.CreateHorizontalGroup(UIRoot, "BasicLabelHolder", true, true, true, true, bgColor: new(0.1f, 0.1f, 0.1f));
|
||||||
|
UIFactory.SetLayoutElement(basicLabelHolder, minHeight: 25, flexibleHeight: 50, minWidth: 100, flexibleWidth: 1000);
|
||||||
|
basicLabel = UIFactory.CreateLabel(basicLabelHolder, "BasicLabel", "null", TextAnchor.MiddleLeft);
|
||||||
|
basicLabel.gameObject.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
|
||||||
|
pasteButton = UIFactory.CreateButton(UIRoot, "PasteButton", "Paste", new Color(0.13f, 0.13f, 0.13f, 1f));
|
||||||
|
UIFactory.SetLayoutElement(pasteButton.Component.gameObject, minHeight: 25, minWidth: 28, flexibleWidth: 0);
|
||||||
|
pasteButton.ButtonText.color = Color.green;
|
||||||
|
pasteButton.ButtonText.fontSize = 10;
|
||||||
|
pasteButton.OnClick += OnPasteClicked;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,8 @@
|
|||||||
using System;
|
using HarmonyLib;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
@ -8,7 +10,9 @@ using UnityExplorer.Inspectors;
|
|||||||
using UnityExplorer.UI.Widgets;
|
using UnityExplorer.UI.Widgets;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI;
|
using UniverseLib.UI;
|
||||||
|
using UniverseLib.UI.Models;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Widgets
|
namespace UnityExplorer.UI.Widgets
|
||||||
{
|
{
|
||||||
@ -16,15 +20,15 @@ namespace UnityExplorer.UI.Widgets
|
|||||||
{
|
{
|
||||||
public float DefaultHeight => 25f;
|
public float DefaultHeight => 25f;
|
||||||
|
|
||||||
public bool Enabled => m_enabled;
|
public bool Enabled => enabled;
|
||||||
private bool m_enabled;
|
private bool enabled;
|
||||||
|
|
||||||
public Action<CachedTransform> OnExpandToggled;
|
public Action<CachedTransform> OnExpandToggled;
|
||||||
public Action<CachedTransform> OnEnableToggled;
|
public Action<CachedTransform> OnEnableToggled;
|
||||||
public Action<GameObject> OnGameObjectClicked;
|
public Action<GameObject> OnGameObjectClicked;
|
||||||
|
|
||||||
public CachedTransform cachedTransform;
|
public CachedTransform cachedTransform;
|
||||||
public int _cellIndex;
|
public int cellIndex;
|
||||||
|
|
||||||
public GameObject UIRoot { get; set; }
|
public GameObject UIRoot { get; set; }
|
||||||
public RectTransform Rect { get; set; }
|
public RectTransform Rect { get; set; }
|
||||||
@ -37,13 +41,13 @@ namespace UnityExplorer.UI.Widgets
|
|||||||
|
|
||||||
public void Enable()
|
public void Enable()
|
||||||
{
|
{
|
||||||
m_enabled = true;
|
enabled = true;
|
||||||
UIRoot.SetActive(true);
|
UIRoot.SetActive(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Disable()
|
public void Disable()
|
||||||
{
|
{
|
||||||
m_enabled = false;
|
enabled = false;
|
||||||
UIRoot.SetActive(false);
|
UIRoot.SetActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,14 +62,17 @@ namespace UnityExplorer.UI.Widgets
|
|||||||
if (!Enabled)
|
if (!Enabled)
|
||||||
Enable();
|
Enable();
|
||||||
|
|
||||||
_cellIndex = cellIndex;
|
this.cellIndex = cellIndex;
|
||||||
cachedTransform = cached;
|
cachedTransform = cached;
|
||||||
|
|
||||||
spacer.minWidth = cached.Depth * 15;
|
spacer.minWidth = cached.Depth * 15;
|
||||||
|
|
||||||
if (cached.Value)
|
if (cached.Value)
|
||||||
{
|
{
|
||||||
NameButton.ButtonText.text = cached.Value.name;
|
string name = cached.Value.name?.Trim();
|
||||||
|
if (string.IsNullOrEmpty(name))
|
||||||
|
name = "<i><color=grey>untitled</color></i>";
|
||||||
|
NameButton.ButtonText.text = name;
|
||||||
NameButton.ButtonText.color = cached.Value.gameObject.activeSelf ? Color.white : Color.grey;
|
NameButton.ButtonText.color = cached.Value.gameObject.activeSelf ? Color.white : Color.grey;
|
||||||
|
|
||||||
EnabledToggle.Set(cached.Value.gameObject.activeSelf, false);
|
EnabledToggle.Set(cached.Value.gameObject.activeSelf, false);
|
||||||
@ -149,8 +156,8 @@ namespace UnityExplorer.UI.Widgets
|
|||||||
Color highlight = new Color(0.25f, 0.25f, 0.25f);
|
Color highlight = new Color(0.25f, 0.25f, 0.25f);
|
||||||
Color pressed = new Color(0.05f, 0.05f, 0.05f);
|
Color pressed = new Color(0.05f, 0.05f, 0.05f);
|
||||||
Color disabled = new Color(1, 1, 1, 0);
|
Color disabled = new Color(1, 1, 1, 0);
|
||||||
RuntimeProvider.Instance.SetColorBlock(ExpandButton.Component, normal, highlight, pressed, disabled);
|
RuntimeHelper.SetColorBlock(ExpandButton.Component, normal, highlight, pressed, disabled);
|
||||||
RuntimeProvider.Instance.SetColorBlock(NameButton.Component, normal, highlight, pressed, disabled);
|
RuntimeHelper.SetColorBlock(NameButton.Component, normal, highlight, pressed, disabled);
|
||||||
|
|
||||||
NameButton.OnClick += OnMainButtonClicked;
|
NameButton.OnClick += OnMainButtonClicked;
|
||||||
ExpandButton.OnClick += OnExpandClicked;
|
ExpandButton.OnClick += OnExpandClicked;
|
||||||
|
@ -8,6 +8,8 @@ using UnityEngine;
|
|||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using UniverseLib;
|
using UniverseLib;
|
||||||
using UniverseLib.UI.Widgets;
|
using UniverseLib.UI.Widgets;
|
||||||
|
using UniverseLib.UI.Widgets.ScrollView;
|
||||||
|
using UniverseLib.Utility;
|
||||||
|
|
||||||
namespace UnityExplorer.UI.Widgets
|
namespace UnityExplorer.UI.Widgets
|
||||||
{
|
{
|
||||||
@ -145,7 +147,7 @@ namespace UnityExplorer.UI.Widgets
|
|||||||
|
|
||||||
private void OnCellJumpedTo(TransformCell cell)
|
private void OnCellJumpedTo(TransformCell cell)
|
||||||
{
|
{
|
||||||
RuntimeProvider.Instance.StartCoroutine(HighlightCellCoroutine(cell));
|
RuntimeHelper.StartCoroutine(HighlightCellCoroutine(cell));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator HighlightCellCoroutine(TransformCell cell)
|
private IEnumerator HighlightCellCoroutine(TransformCell cell)
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProjectGuid>{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}</ProjectGuid>
|
<ProjectGuid>{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}</ProjectGuid>
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
|
<LangVersion>9.0</LangVersion>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<Deterministic>true</Deterministic>
|
<Deterministic>true</Deterministic>
|
||||||
@ -105,8 +106,11 @@
|
|||||||
<HintPath>..\lib\mcs-unity\mcs\bin\Release\mcs.dll</HintPath>
|
<HintPath>..\lib\mcs-unity\mcs\bin\Release\mcs.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="INIFileParser, Version=2.5.2.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c, processorArchitecture=MSIL">
|
</ItemGroup>
|
||||||
<HintPath>packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll</HintPath>
|
<!-- Non-MelonLoader (it includes Tomlet) -->
|
||||||
|
<ItemGroup Condition="'$(IsMelonLoader)'=='false'">
|
||||||
|
<Reference Include="Tomlet, Version=3.1.3.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>packages\Samboy063.Tomlet.3.1.3\lib\net35\Tomlet.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -162,9 +166,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- Mono refs -->
|
<!-- Mono refs -->
|
||||||
<ItemGroup Condition="'$(IsCpp)'=='false'">
|
<ItemGroup Condition="'$(IsCpp)'=='false'">
|
||||||
<Reference Include="UniverseLib.Mono">
|
|
||||||
<HintPath>packages\UniverseLib.1.0.1\lib\net35\UniverseLib.Mono.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="UnityEngine">
|
<Reference Include="UnityEngine">
|
||||||
<HintPath>..\lib\mono\UnityEngine.dll</HintPath>
|
<HintPath>..\lib\mono\UnityEngine.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
@ -173,14 +174,17 @@
|
|||||||
<HintPath>..\lib\mono\UnityEngine.UI.dll</HintPath>
|
<HintPath>..\lib\mono\UnityEngine.UI.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="UniverseLib.Mono">
|
||||||
|
<HintPath>packages\UniverseLib.1.2.2\lib\net35\UniverseLib.Mono.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- Il2Cpp refs -->
|
<!-- Il2Cpp refs -->
|
||||||
<ItemGroup Condition="'$(IsCpp)'=='true'">
|
<ItemGroup Condition="'$(IsCpp)'=='true'">
|
||||||
<Reference Include="UniverseLib.IL2CPP">
|
<Reference Include="UniverseLib.IL2CPP">
|
||||||
<HintPath>packages\UniverseLib.1.0.1\lib\net472\UniverseLib.IL2CPP.dll</HintPath>
|
<HintPath>packages\UniverseLib.1.2.2\lib\net472\UniverseLib.IL2CPP.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="UnhollowerBaseLib">
|
<Reference Include="UnhollowerBaseLib, Version=0.4.22.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\lib\Il2CppAssemblyUnhollower\UnhollowerBaseLib\bin\Release\net4.7.2\UnhollowerBaseLib.dll</HintPath>
|
<HintPath>packages\Il2CppAssemblyUnhollower.BaseLib.0.4.22\lib\net472\UnhollowerBaseLib.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Il2Cppmscorlib">
|
<Reference Include="Il2Cppmscorlib">
|
||||||
@ -224,7 +228,7 @@
|
|||||||
<Compile Include="Hooks\HookCell.cs" />
|
<Compile Include="Hooks\HookCell.cs" />
|
||||||
<Compile Include="Hooks\HookInstance.cs" />
|
<Compile Include="Hooks\HookInstance.cs" />
|
||||||
<Compile Include="Hooks\HookManager.cs" />
|
<Compile Include="Hooks\HookManager.cs" />
|
||||||
<Compile Include="Core\Config\InternalConfigHandler.cs" />
|
<Compile Include="Config\InternalConfigHandler.cs" />
|
||||||
<Compile Include="CacheObject\CacheConfigEntry.cs" />
|
<Compile Include="CacheObject\CacheConfigEntry.cs" />
|
||||||
<Compile Include="CacheObject\Views\CacheConfigCell.cs" />
|
<Compile Include="CacheObject\Views\CacheConfigCell.cs" />
|
||||||
<Compile Include="CSConsole\CSAutoCompleter.cs" />
|
<Compile Include="CSConsole\CSAutoCompleter.cs" />
|
||||||
@ -237,7 +241,7 @@
|
|||||||
<Compile Include="CSConsole\Lexers\SymbolLexer.cs" />
|
<Compile Include="CSConsole\Lexers\SymbolLexer.cs" />
|
||||||
<Compile Include="CSConsole\ScriptEvaluator.cs" />
|
<Compile Include="CSConsole\ScriptEvaluator.cs" />
|
||||||
<Compile Include="CSConsole\ScriptInteraction.cs" />
|
<Compile Include="CSConsole\ScriptInteraction.cs" />
|
||||||
<Compile Include="Core\ExplorerBehaviour.cs" />
|
<Compile Include="ExplorerBehaviour.cs" />
|
||||||
<Compile Include="Hooks\AddHookCell.cs" />
|
<Compile Include="Hooks\AddHookCell.cs" />
|
||||||
<Compile Include="Inspectors\GameObjectWidgets\ComponentCell.cs" />
|
<Compile Include="Inspectors\GameObjectWidgets\ComponentCell.cs" />
|
||||||
<Compile Include="Inspectors\GameObjectWidgets\ComponentList.cs" />
|
<Compile Include="Inspectors\GameObjectWidgets\ComponentList.cs" />
|
||||||
@ -255,7 +259,11 @@
|
|||||||
<Compile Include="CacheObject\Views\CacheListEntryCell.cs" />
|
<Compile Include="CacheObject\Views\CacheListEntryCell.cs" />
|
||||||
<Compile Include="CacheObject\Views\CacheMemberCell.cs" />
|
<Compile Include="CacheObject\Views\CacheMemberCell.cs" />
|
||||||
<Compile Include="CacheObject\Views\CacheObjectCell.cs" />
|
<Compile Include="CacheObject\Views\CacheObjectCell.cs" />
|
||||||
<Compile Include="CacheObject\Views\EvaluateWidget.cs" />
|
<Compile Include="UI\DisplayManager.cs" />
|
||||||
|
<Compile Include="UI\Notification.cs" />
|
||||||
|
<Compile Include="UI\Panels\ClipboardPanel.cs" />
|
||||||
|
<Compile Include="UI\Widgets\AutoComplete\EnumCompleter.cs" />
|
||||||
|
<Compile Include="UI\Widgets\EvaluateWidget\EvaluateWidget.cs" />
|
||||||
<Compile Include="Inspectors\GameObjectInspector.cs" />
|
<Compile Include="Inspectors\GameObjectInspector.cs" />
|
||||||
<Compile Include="CacheObject\ICacheObjectController.cs" />
|
<Compile Include="CacheObject\ICacheObjectController.cs" />
|
||||||
<Compile Include="Inspectors\InspectorManager.cs" />
|
<Compile Include="Inspectors\InspectorManager.cs" />
|
||||||
@ -273,22 +281,22 @@
|
|||||||
<Compile Include="Inspectors\ReflectionInspector.cs" />
|
<Compile Include="Inspectors\ReflectionInspector.cs" />
|
||||||
<Compile Include="CacheObject\IValues\InteractiveValueStruct.cs" />
|
<Compile Include="CacheObject\IValues\InteractiveValueStruct.cs" />
|
||||||
<Compile Include="UI\Panels\HookManagerPanel.cs" />
|
<Compile Include="UI\Panels\HookManagerPanel.cs" />
|
||||||
<Compile Include="UI\Panels\UiInspectorResultsPanel.cs" />
|
<Compile Include="UI\Panels\UIInspectorResultsPanel.cs" />
|
||||||
<Compile Include="UI\Panels\LogPanel.cs" />
|
<Compile Include="UI\Panels\LogPanel.cs" />
|
||||||
<Compile Include="UI\Panels\CSConsolePanel.cs" />
|
<Compile Include="UI\Panels\CSConsolePanel.cs" />
|
||||||
<Compile Include="UI\Panels\OptionsPanel.cs" />
|
<Compile Include="UI\Panels\OptionsPanel.cs" />
|
||||||
<Compile Include="UI\Widgets\AutoComplete\ISuggestionProvider.cs" />
|
<Compile Include="UI\Widgets\AutoComplete\ISuggestionProvider.cs" />
|
||||||
<Compile Include="UI\Widgets\AutoComplete\Suggestion.cs" />
|
<Compile Include="UI\Widgets\AutoComplete\Suggestion.cs" />
|
||||||
<Compile Include="Core\Config\ConfigElement.cs" />
|
<Compile Include="Config\ConfigElement.cs" />
|
||||||
<Compile Include="Core\Config\ConfigHandler.cs" />
|
<Compile Include="Config\ConfigHandler.cs" />
|
||||||
<Compile Include="Core\Config\ConfigManager.cs" />
|
<Compile Include="Config\ConfigManager.cs" />
|
||||||
<Compile Include="Core\Config\IConfigElement.cs" />
|
<Compile Include="Config\IConfigElement.cs" />
|
||||||
<Compile Include="Core\Runtime\Il2CppProvider.cs" />
|
<Compile Include="Runtime\Il2CppHelper.cs" />
|
||||||
<Compile Include="Core\Runtime\MonoProvider.cs" />
|
<Compile Include="Runtime\MonoHelper.cs" />
|
||||||
<Compile Include="Core\Runtime\RuntimeHelper.cs" />
|
<Compile Include="Runtime\UERuntimeHelper.cs" />
|
||||||
<Compile Include="ObjectExplorer\SceneHandler.cs" />
|
<Compile Include="ObjectExplorer\SceneHandler.cs" />
|
||||||
<Compile Include="ObjectExplorer\SearchProvider.cs" />
|
<Compile Include="ObjectExplorer\SearchProvider.cs" />
|
||||||
<Compile Include="Core\Tests\TestClass.cs" />
|
<Compile Include="Tests\TestClass.cs" />
|
||||||
<Compile Include="ExplorerCore.cs" />
|
<Compile Include="ExplorerCore.cs" />
|
||||||
<Compile Include="Loader\BepInEx\BepInExConfigHandler.cs" />
|
<Compile Include="Loader\BepInEx\BepInExConfigHandler.cs" />
|
||||||
<Compile Include="Loader\BepInEx\ExplorerBepInPlugin.cs" />
|
<Compile Include="Loader\BepInEx\ExplorerBepInPlugin.cs" />
|
||||||
@ -307,6 +315,9 @@
|
|||||||
<Compile Include="UI\Widgets\AutoComplete\TypeCompleter.cs" />
|
<Compile Include="UI\Widgets\AutoComplete\TypeCompleter.cs" />
|
||||||
<Compile Include="ObjectExplorer\ObjectSearch.cs" />
|
<Compile Include="ObjectExplorer\ObjectSearch.cs" />
|
||||||
<Compile Include="ObjectExplorer\SceneExplorer.cs" />
|
<Compile Include="ObjectExplorer\SceneExplorer.cs" />
|
||||||
|
<Compile Include="UI\Widgets\EvaluateWidget\BaseArgumentHandler.cs" />
|
||||||
|
<Compile Include="UI\Widgets\EvaluateWidget\GenericArgumentHandler.cs" />
|
||||||
|
<Compile Include="UI\Widgets\EvaluateWidget\ParameterHandler.cs" />
|
||||||
<Compile Include="UI\Widgets\TransformTree\CachedTransform.cs" />
|
<Compile Include="UI\Widgets\TransformTree\CachedTransform.cs" />
|
||||||
<Compile Include="UI\Widgets\TransformTree\TransformCell.cs" />
|
<Compile Include="UI\Widgets\TransformTree\TransformCell.cs" />
|
||||||
<Compile Include="UI\Widgets\TransformTree\TransformTree.cs" />
|
<Compile Include="UI\Widgets\TransformTree\TransformTree.cs" />
|
||||||
@ -315,7 +326,9 @@
|
|||||||
<None Include="ILRepack.targets" />
|
<None Include="ILRepack.targets" />
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup>
|
||||||
|
<Analyzer Include="packages\UniverseLib.Analyzers.1.0.3\analyzers\dotnet\cs\UniverseLib.Analyzers.dll" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Import Project="packages\ILRepack.Lib.MSBuild.Task.2.0.18.2\build\ILRepack.Lib.MSBuild.Task.targets" Condition="Exists('packages\ILRepack.Lib.MSBuild.Task.2.0.18.2\build\ILRepack.Lib.MSBuild.Task.targets')" />
|
<Import Project="packages\ILRepack.Lib.MSBuild.Task.2.0.18.2\build\ILRepack.Lib.MSBuild.Task.targets" Condition="Exists('packages\ILRepack.Lib.MSBuild.Task.2.0.18.2\build\ILRepack.Lib.MSBuild.Task.targets')" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.30128.74
|
VisualStudioVersion = 16.0.30128.74
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnhollowerBaseLib", "..\lib\Il2CppAssemblyUnhollower\UnhollowerBaseLib\UnhollowerBaseLib.csproj", "{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mcs", "..\lib\mcs-unity\mcs\mcs.csproj", "{E4989E4C-0875-4528-9031-08E2C0E70103}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mcs", "..\lib\mcs-unity\mcs\mcs.csproj", "{E4989E4C-0875-4528-9031-08E2C0E70103}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityExplorer", "UnityExplorer.csproj", "{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnityExplorer", "UnityExplorer.csproj", "{B21DBDE3-5D6F-4726-93AB-CC3CC68BAE7D}"
|
||||||
@ -20,20 +18,6 @@ Global
|
|||||||
Release_STANDALONE_Mono|Any CPU = Release_STANDALONE_Mono|Any CPU
|
Release_STANDALONE_Mono|Any CPU = Release_STANDALONE_Mono|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_BIE_Cpp|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_BIE_Cpp|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_BIE5_Mono|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_BIE5_Mono|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_BIE6_Mono|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_BIE6_Mono|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_ML_Cpp|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_ML_Cpp|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_ML_Mono|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_ML_Mono|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_STANDALONE_Cpp|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_STANDALONE_Cpp|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_STANDALONE_Mono|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7B7E5024-385D-4A46-9196-A6AF8F7FBDD5}.Release_STANDALONE_Mono|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{E4989E4C-0875-4528-9031-08E2C0E70103}.Release_BIE_Cpp|Any CPU.ActiveCfg = Release|Any CPU
|
{E4989E4C-0875-4528-9031-08E2C0E70103}.Release_BIE_Cpp|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{E4989E4C-0875-4528-9031-08E2C0E70103}.Release_BIE_Cpp|Any CPU.Build.0 = Release|Any CPU
|
{E4989E4C-0875-4528-9031-08E2C0E70103}.Release_BIE_Cpp|Any CPU.Build.0 = Release|Any CPU
|
||||||
{E4989E4C-0875-4528-9031-08E2C0E70103}.Release_BIE5_Mono|Any CPU.ActiveCfg = Release|Any CPU
|
{E4989E4C-0875-4528-9031-08E2C0E70103}.Release_BIE5_Mono|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="HarmonyX" version="2.5.2" targetFramework="net35" />
|
<package id="HarmonyX" version="2.5.2" targetFramework="net35" />
|
||||||
|
<package id="Iced" version="1.15.0" targetFramework="net472" />
|
||||||
|
<package id="Il2CppAssemblyUnhollower.BaseLib" version="0.4.22" targetFramework="net472" />
|
||||||
<package id="ILRepack.Lib.MSBuild.Task" version="2.0.18.2" targetFramework="net35" />
|
<package id="ILRepack.Lib.MSBuild.Task" version="2.0.18.2" targetFramework="net35" />
|
||||||
<package id="ini-parser" version="2.5.2" targetFramework="net35" />
|
|
||||||
<package id="Mono.Cecil" version="0.10.4" targetFramework="net35" />
|
<package id="Mono.Cecil" version="0.10.4" targetFramework="net35" />
|
||||||
<package id="UniverseLib" version="1.0.1" targetFramework="net472" />
|
<package id="Samboy063.Tomlet" version="3.1.3" targetFramework="net472" />
|
||||||
|
<package id="UniverseLib" version="1.2.2" targetFramework="net35" />
|
||||||
|
<package id="UniverseLib.Analyzers" version="1.0.3" targetFramework="net35" developmentDependency="true" />
|
||||||
</packages>
|
</packages>
|
Reference in New Issue
Block a user