Finished scene explorer, lots of cleanups. Inspector and Search left now.

This commit is contained in:
sinaioutlander 2020-10-28 06:39:26 +11:00
parent 7328610252
commit ff684d4d4b
64 changed files with 2376 additions and 1624 deletions

View File

@ -3,9 +3,9 @@
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using Explorer.UI;
//using ExplorerBeta.UI;
//namespace Explorer.CacheObject
//namespace ExplorerBeta.CacheObject
//{
// public class CacheEnumerated : CacheObjectBase
// {

View File

@ -1,8 +1,8 @@
//using System;
//using System.Reflection;
//using Explorer.CacheObject;
//using ExplorerBeta.CacheObject;
//using UnityEngine;
//using Explorer.Helpers;
//using ExplorerBeta.Helpers;
//namespace Explorer
//{

View File

@ -3,10 +3,10 @@
//using System.Linq;
//using System.Text;
//using System.Reflection;
//using Explorer.UI;
//using Explorer.Helpers;
//using ExplorerBeta.UI;
//using ExplorerBeta.Helpers;
//namespace Explorer.CacheObject
//namespace ExplorerBeta.CacheObject
//{
// public class CacheField : CacheMember
// {

View File

@ -3,10 +3,10 @@
//using System.Linq;
//using System.Reflection;
//using UnityEngine;
//using Explorer.UI;
//using Explorer.UI.Shared;
//using ExplorerBeta.UI;
//using ExplorerBeta.UI.Shared;
//namespace Explorer.CacheObject
//namespace ExplorerBeta.CacheObject
//{
// public class CacheMember : CacheObjectBase
// {

View File

@ -3,10 +3,10 @@
//using System.Linq;
//using System.Reflection;
//using UnityEngine;
//using Explorer.UI.Shared;
//using Explorer.Helpers;
//using ExplorerBeta.UI.Shared;
//using ExplorerBeta.Helpers;
//namespace Explorer.CacheObject
//namespace ExplorerBeta.CacheObject
//{
// public class CacheMethod : CacheMember
// {

View File

@ -3,11 +3,11 @@
//using System.Linq;
//using System.Reflection;
//using UnityEngine;
//using Explorer.UI;
//using Explorer.UI.Shared;
//using Explorer.Helpers;
//using ExplorerBeta.UI;
//using ExplorerBeta.UI.Shared;
//using ExplorerBeta.Helpers;
//namespace Explorer.CacheObject
//namespace ExplorerBeta.CacheObject
//{
// public class CacheObjectBase
// {

View File

@ -3,10 +3,10 @@
//using System.Linq;
//using System.Text;
//using System.Reflection;
//using Explorer.UI;
//using Explorer.Helpers;
//using ExplorerBeta.UI;
//using ExplorerBeta.Helpers;
//namespace Explorer.CacheObject
//namespace ExplorerBeta.CacheObject
//{
// public class CacheProperty : CacheMember
// {

View File

@ -14,21 +14,20 @@ namespace ExplorerBeta.Config
[XmlIgnore] public static ModConfig Instance;
// Actual configs
public KeyCode Main_Menu_Toggle = KeyCode.F7;
public KeyCode Main_Menu_Toggle = KeyCode.F7;
public Vector2 Default_Window_Size = new Vector2(550, 700);
public int Default_Page_Limit = 20;
public bool Bitwise_Support = false;
public bool Tab_View = true;
public string Default_Output_Path = @"Mods\Explorer";
public int Default_Page_Limit = 20;
public bool Bitwise_Support = false;
public bool Tab_View = true;
public string Default_Output_Path = @"Mods\Explorer";
public static void OnLoad()
{
if (!Directory.Exists(EXPLORER_FOLDER))
{
Directory.CreateDirectory(EXPLORER_FOLDER);
}
if (LoadSettings()) return;
if (LoadSettings())
return;
Instance = new ModConfig();
SaveSettings();
@ -38,7 +37,9 @@ namespace ExplorerBeta.Config
public static bool LoadSettings()
{
if (!File.Exists(SETTINGS_PATH))
{
return false;
}
try
{
@ -58,7 +59,9 @@ namespace ExplorerBeta.Config
public static void SaveSettings()
{
if (File.Exists(SETTINGS_PATH))
{
File.Delete(SETTINGS_PATH);
}
using (var file = File.Create(SETTINGS_PATH))
{

View File

@ -12,9 +12,10 @@
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
<OutputPath>..\Release\Explorer.MelonLoader.Il2Cpp\</OutputPath>
<DefineConstants></DefineConstants>
<IsCpp>true</IsCpp>
<IsMelonLoader>true</IsMelonLoader>
<DefineConstants>
</DefineConstants>
<IsCpp>false</IsCpp>
<IsMelonLoader>false</IsMelonLoader>
<DebugSymbols>false</DebugSymbols>
<DebugType>none</DebugType>
<Optimize>false</Optimize>
@ -22,7 +23,7 @@
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
<RootNamespace>Explorer</RootNamespace>
<RootNamespace>ExplorerBeta</RootNamespace>
<AssemblyName>ExplorerBeta</AssemblyName>
<!-- Set this to the MelonLoader Il2Cpp Game folder, without the ending '\' character. -->
<MLCppGameFolder>D:\Steam\steamapps\common\VRChat</MLCppGameFolder>
@ -85,8 +86,8 @@
<Private>False</Private>
</Reference>
</ItemGroup>
<!-- Universal Mono UnityEngine.dll ref (v5.3) --><!--
<!-- Universal Mono UnityEngine.dll ref (v5.3) -->
<!--
<ItemGroup Condition="'$(IsCpp)'=='false'">
<Reference Include="UnityEngine">
<HintPath>..\lib\UnityEngine.dll</HintPath>
@ -101,7 +102,6 @@
<Private>False</Private>
</Reference>
</ItemGroup>-->
<!-- MelonLoader Mono refs -->
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='true|false'">
<Reference Include="MelonLoader.ModHandler">
@ -149,7 +149,6 @@
<Private>False</Private>
</Reference>
</ItemGroup>
<!-- BepInEx Mono refs -->
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='false|false'">
<Reference Include="BepInEx">
@ -201,7 +200,6 @@
<Private>False</Private>
</Reference>
</ItemGroup>
<!-- MelonLoader Il2Cpp refs -->
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='true|true'">
<Reference Include="MelonLoader.ModHandler">
@ -257,7 +255,6 @@
<Private>False</Private>
</Reference>
</ItemGroup>
<!-- BepInEx Il2Cpp refs -->
<ItemGroup Condition="'$(IsMelonLoader)|$(IsCpp)'=='false|true'">
<Reference Include="BepInEx">
@ -346,26 +343,31 @@
<Compile Include="Input\LegacyInput.cs" />
<Compile Include="Input\NoInput.cs" />
<Compile Include="UI\Main\DebugConsole.cs" />
<Compile Include="UI\Main\InspectorManager.cs" />
<Compile Include="UI\Main\MainMenu.cs" />
<Compile Include="UI\Main\Pages\BaseMenuPage.cs" />
<Compile Include="UI\Main\Pages\ConsolePage.cs" />
<Compile Include="UI\Main\Pages\Console\AutoCompleter.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\CodeEditor.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\CSharpLexer.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\CommentMatch.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\ILexer.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\InputLexer.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\KeywordMatch.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\StringMatch.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\MatchLexer.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\NumberMatch.cs" />
<Compile Include="UI\Main\Pages\Console\Editor\Lexer\SymbolMatch.cs" />
<Compile Include="UI\Main\Pages\Console\ScriptEvaluator\AutoComplete.cs" />
<Compile Include="UI\Main\Pages\Console\ScriptEvaluator\ScriptEvaluator.cs" />
<Compile Include="UI\Main\Pages\Console\ScriptEvaluator\ScriptInteraction.cs" />
<Compile Include="UI\Main\Pages\HomePage.cs" />
<Compile Include="UI\Main\Pages\OptionsPage.cs" />
<Compile Include="UI\Main\Pages\SearchPage.cs" />
<Compile Include="UI\Main\ConsolePage.cs" />
<Compile Include="UI\Main\Console\AutoCompleter.cs" />
<Compile Include="UI\Main\Console\CodeEditor.cs" />
<Compile Include="UI\Main\Console\CSharpLexer.cs" />
<Compile Include="UI\Main\Console\Lexer\CommentMatch.cs" />
<Compile Include="UI\Main\Console\Lexer\ILexer.cs" />
<Compile Include="UI\Main\Console\Lexer\InputLexer.cs" />
<Compile Include="UI\Main\Console\Lexer\KeywordMatch.cs" />
<Compile Include="UI\Main\Console\Lexer\StringMatch.cs" />
<Compile Include="UI\Main\Console\Lexer\MatchLexer.cs" />
<Compile Include="UI\Main\Console\Lexer\NumberMatch.cs" />
<Compile Include="UI\Main\Console\Lexer\SymbolMatch.cs" />
<Compile Include="UI\Main\Console\Suggestion.cs" />
<Compile Include="UI\Main\Console\ScriptEvaluator.cs" />
<Compile Include="UI\Main\Console\ScriptInteraction.cs" />
<Compile Include="UI\Main\HomePage.cs" />
<Compile Include="UI\Main\Inspectors\GameObjectInspector.cs" />
<Compile Include="UI\Main\Inspectors\InspectorBase.cs" />
<Compile Include="UI\Main\Inspectors\InstanceInspector.cs" />
<Compile Include="UI\Main\Inspectors\StaticInspector.cs" />
<Compile Include="UI\Main\OptionsPage.cs" />
<Compile Include="UI\Main\SceneExplorer.cs" />
<Compile Include="UI\Main\SearchPage.cs" />
<Compile Include="UI\Main\PanelDragger.cs" />
<Compile Include="UI\InteractiveValue\InteractiveValue.cs" />
<Compile Include="UI\Shared\PageHandler.cs" />
@ -384,7 +386,9 @@
<None Include="ILRepack.targets" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<Folder Include="UI\MouseInspector\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets" Condition="Exists('packages\ILRepack.Lib.MSBuild.Task.2.0.18.1\build\ILRepack.Lib.MSBuild.Task.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

View File

@ -1,21 +1,18 @@
using System;
using System.Collections;
using System.Linq;
using ExplorerBeta.Config;
using ExplorerBeta.Input;
using ExplorerBeta.UI;
using ExplorerBeta.UI.Main;
using System.Reflection;
using UnityEngine;
namespace ExplorerBeta
{
public class ExplorerCore
{
public const string NAME = "Explorer " + VERSION + " (" + PLATFORM + ", " + MODLOADER + ")";
public const string NAME = "Explorer " + VERSION + " (" + PLATFORM + ", " + MODLOADER + ")";
public const string VERSION = "3.0.0b";
public const string AUTHOR = "Sinai";
public const string GUID = "com.sinai.explorer";
public const string AUTHOR = "Sinai";
public const string GUID = "com.sinai.explorer";
public const string PLATFORM =
#if CPP
@ -71,19 +68,15 @@ namespace ExplorerBeta
private static void SetShowMenu(bool show)
{
m_showMenu = show;
if (UIManager.CanvasRoot)
{
UIManager.CanvasRoot.SetActive(show);
if (show)
{
ForceUnlockCursor.SetEventSystem();
}
else
{
ForceUnlockCursor.ReleaseEventSystem();
}
}
ForceUnlockCursor.UpdateCursorControl();
@ -91,24 +84,11 @@ namespace ExplorerBeta
public static void Update()
{
// Temporary delay before UIManager.Init
if (!m_doneUIInit)
{
m_timeSinceStartup += Time.deltaTime;
if (m_timeSinceStartup > 0.1f)
{
UIManager.Init();
Log("Initialized Explorer UI.");
m_doneUIInit = true;
}
}
CheckUIInit();
if (InputManager.GetKeyDown(ModConfig.Instance.Main_Menu_Toggle))
{
ShowMenu = !ShowMenu;
}
if (ShowMenu)
{
@ -117,6 +97,25 @@ namespace ExplorerBeta
}
}
private static void CheckUIInit()
{
m_timeSinceStartup += Time.deltaTime;
if (m_timeSinceStartup > 0.1f)
{
m_doneUIInit = true;
try
{
UIManager.Init();
Log("Initialized Explorer UI.");
}
catch (Exception e)
{
LogWarning($"Exception setting up UI: {e}");
}
}
}
public static void OnSceneChange()
{
UIManager.OnSceneChange();

View File

@ -1,8 +1,4 @@
#if ML
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MelonLoader;
namespace ExplorerBeta

View File

@ -4,20 +4,16 @@ namespace ExplorerBeta
{
public static class UnityExtensions
{
public static string GetGameObjectPath(this Transform _transform)
public static string GetTransformPath(this Transform _transform)
{
return GetGameObjectPath(_transform, true);
}
string path = _transform.name;
public static string GetGameObjectPath(this Transform _transform, bool _includeThisName)
{
string path = _includeThisName ? ("/" + _transform.name) : "";
GameObject gameObject = _transform.gameObject;
while (gameObject.transform.parent != null)
while (_transform.parent != null)
{
gameObject = gameObject.transform.parent.gameObject;
path = "/" + gameObject.name + path;
_transform = _transform.parent;
path = _transform.name + "/" + path;
}
return path;
}
}

View File

@ -1,11 +1,8 @@
#if CPP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Reflection;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
namespace ExplorerBeta.Helpers
{
@ -17,18 +14,16 @@ namespace ExplorerBeta.Helpers
public static T GetICall<T>(string iCallName) where T : Delegate
{
if (iCallCache.ContainsKey(iCallName))
{
return (T)iCallCache[iCallName];
}
var ptr = il2cpp_resolve_icall(iCallName);
IntPtr ptr = il2cpp_resolve_icall(iCallName);
if (ptr == IntPtr.Zero)
{
throw new MissingMethodException($"Could not resolve internal call by name '{iCallName}'!");
}
var iCall = Marshal.GetDelegateForFunctionPointer(ptr, typeof(T));
Delegate iCall = Marshal.GetDelegateForFunctionPointer(ptr, typeof(T));
iCallCache.Add(iCallName, iCall);
return (T)iCall;

View File

@ -22,10 +22,10 @@ namespace ExplorerBeta.Helpers
#if CPP
public static ILType GameObjectType => Il2CppType.Of<GameObject>();
public static ILType TransformType => Il2CppType.Of<Transform>();
public static ILType ObjectType => Il2CppType.Of<UnityEngine.Object>();
public static ILType ComponentType => Il2CppType.Of<Component>();
public static ILType BehaviourType => Il2CppType.Of<Behaviour>();
public static ILType TransformType => Il2CppType.Of<Transform>();
public static ILType ObjectType => Il2CppType.Of<UnityEngine.Object>();
public static ILType ComponentType => Il2CppType.Of<Component>();
public static ILType BehaviourType => Il2CppType.Of<Behaviour>();
#else
public static Type GameObjectType => typeof(GameObject);
public static Type TransformType => typeof(Transform);
@ -40,10 +40,14 @@ namespace ExplorerBeta.Helpers
public static object Il2CppCast(object obj, Type castTo)
{
if (!(obj is Il2CppSystem.Object ilObj))
{
return obj;
}
if (!typeof(Il2CppSystem.Object).IsAssignableFrom(castTo))
{
return obj;
}
IntPtr castToPtr;
if (!ClassPointers.ContainsKey(castTo))
@ -61,9 +65,11 @@ namespace ExplorerBeta.Helpers
}
if (castToPtr == IntPtr.Zero)
{
return obj;
}
var classPtr = il2cpp_object_get_class(ilObj.Pointer);
IntPtr classPtr = il2cpp_object_get_class(ilObj.Pointer);
if (!il2cpp_class_is_assignable_from(castToPtr, classPtr))
return obj;
@ -100,7 +106,8 @@ namespace ExplorerBeta.Helpers
public static Type GetActualType(object obj)
{
if (obj == null) return null;
if (obj == null)
return null;
#if CPP
// Need to use GetIl2CppType for Il2CppSystem Objects
@ -124,7 +131,7 @@ namespace ExplorerBeta.Helpers
public static Type[] GetAllBaseTypes(Type type)
{
var list = new List<Type>();
List<Type> list = new List<Type>();
while (type != null)
{
@ -139,11 +146,14 @@ namespace ExplorerBeta.Helpers
{
#if CPP
#if ML
var path = $@"MelonLoader\Managed\{module}.dll";
string path = $@"MelonLoader\Managed\{module}.dll";
#else
var path = $@"BepInEx\unhollowed\{module}.dll";
#endif
if (!File.Exists(path)) return false;
if (!File.Exists(path))
{
return false;
}
try
{

View File

@ -1,10 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.IO;
using System.Reflection;
#if CPP
using ExplorerBeta.Unstrip.ImageConversion;
#endif
@ -61,9 +57,7 @@ namespace ExplorerBeta.Helpers
Color[] pixels;
if (!orig.IsReadable())
{
orig = ForceReadTexture(orig);
}
pixels = orig.GetPixels((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height);
@ -77,7 +71,7 @@ namespace ExplorerBeta.Helpers
{
try
{
var origFilter = tex.filterMode;
FilterMode origFilter = tex.filterMode;
tex.filterMode = FilterMode.Point;
var rt = RenderTexture.GetTemporary(tex.width, tex.height, 0, RenderTextureFormat.ARGB32);
@ -105,12 +99,10 @@ namespace ExplorerBeta.Helpers
public static void SaveTextureAsPNG(Texture2D tex, string dir, string name, bool isDTXnmNormal = false)
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
byte[] data;
var savepath = dir + @"\" + name + ".png";
string savepath = dir + @"\" + name + ".png";
// Make sure we can EncodeToPNG it.
if (tex.format != TextureFormat.ARGB32 || !tex.IsReadable())
@ -154,12 +146,12 @@ namespace ExplorerBeta.Helpers
for (int i = 0; i < colors.Length; i++)
{
Color c = colors[i];
var c = colors[i];
c.r = c.a * 2 - 1; // red <- alpha
c.g = c.g * 2 - 1; // green is always the same
Vector2 rg = new Vector2(c.r, c.g); //this is the red-green vector
var rg = new Vector2(c.r, c.g); //this is the red-green vector
c.b = Mathf.Sqrt(1 - Mathf.Clamp01(Vector2.Dot(rg, rg))); //recalculate the blue channel
colors[i] = new Color(

View File

@ -1,12 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine;
namespace ExplorerBeta.Input
{
public interface IAbstractInput
public interface IHandleInput
{
void Init();

View File

@ -1,7 +1,5 @@
using System;
using System.Reflection;
using UnityEngine;
using ExplorerBeta.Input;
using ExplorerBeta.Helpers;
using System.Diagnostics.CodeAnalysis;
#if CPP
@ -13,7 +11,7 @@ namespace ExplorerBeta.Input
[SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Unity style")]
public static class InputManager
{
private static IAbstractInput m_inputModule;
private static IHandleInput m_inputModule;
public static void Init()
{

View File

@ -1,14 +1,11 @@
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using ExplorerBeta.Helpers;
using UnityEngine;
namespace ExplorerBeta.Input
{
public class InputSystem : IAbstractInput
public class InputSystem : IHandleInput
{
public static Type TKeyboard => m_tKeyboard ?? (m_tKeyboard = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Keyboard"));
private static Type m_tKeyboard;

View File

@ -1,14 +1,11 @@
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using ExplorerBeta.Helpers;
using UnityEngine;
namespace ExplorerBeta.Input
{
public class LegacyInput : IAbstractInput
public class LegacyInput : IHandleInput
{
public static Type TInput => m_tInput ?? (m_tInput = ReflectionHelpers.GetTypeByName("UnityEngine.Input"));
private static Type m_tInput;

View File

@ -1,14 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine;
namespace ExplorerBeta.Input
{
// Just a stub for games where no Input module was able to load at all.
public class NoInput : IAbstractInput
public class NoInput : IHandleInput
{
public Vector2 MousePosition => Vector2.zero;

View File

@ -1,5 +1,4 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using ExplorerBeta;

View File

@ -1,15 +1,8 @@
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using System.Reflection;
using System.Runtime.InteropServices;
using ExplorerBeta.UI.Shared;
using ExplorerBeta.UI;
using UnityEngine;
#if CPP
using UnhollowerBaseLib;
using UnityEngine.SceneManagement;
using ExplorerBeta.Unstrip.ImageConversion;
#endif
namespace ExplorerBeta.Tests
@ -57,10 +50,10 @@ namespace ExplorerBeta.Tests
#if CPP
TestTexture.name = "TestTexture";
var r = new Rect(0, 0, TestTexture.width, TestTexture.height);
var v2 = Vector2.zero;
var v4 = Vector4.zero;
TestSprite = Sprite.CreateSprite_Injected(TestTexture, ref r, ref v2, 100f, 0u, SpriteMeshType.Tight, ref v4, false);
//var r = new Rect(0, 0, TestTexture.width, TestTexture.height);
//var v2 = Vector2.zero;
//var v4 = Vector4.zero;
//TestSprite = Sprite.CreateSprite_Injected(TestTexture, ref r, ref v2, 100f, 0u, SpriteMeshType.Tight, ref v4, false);
GameObject.DontDestroyOnLoad(TestTexture);
GameObject.DontDestroyOnLoad(TestSprite);

View File

@ -2,7 +2,6 @@
using UnityEngine;
using ExplorerBeta.Helpers;
using UnityEngine.EventSystems;
using ExplorerBeta.UI;
using ExplorerBeta.Input;
using BF = System.Reflection.BindingFlags;
#if ML
@ -83,7 +82,7 @@ namespace ExplorerBeta.UI
{
try
{
var harmony =
HarmonyInstance harmony =
#if ML
ExplorerMelonMod.Instance.harmonyInstance;
#else
@ -91,7 +90,7 @@ namespace ExplorerBeta.UI
#endif
;
var prop = type.GetProperty(property);
System.Reflection.PropertyInfo prop = type.GetProperty(property);
if (setter)
{

View File

@ -3,11 +3,11 @@
//using System.Linq;
//using System.Reflection;
//using UnityEngine;
//using Explorer.CacheObject;
//using Explorer.Helpers;
//using Explorer.UI.Shared;
//using ExplorerBeta.CacheObject;
//using ExplorerBeta.Helpers;
//using ExplorerBeta.UI.Shared;
//namespace Explorer.UI
//namespace ExplorerBeta.UI
//{
// public class InteractiveValue
// {
@ -35,7 +35,7 @@
// GetButtonLabel();
// }
// private MethodInfo GetToStringMethod()
// {

View File

@ -1,20 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ExplorerBeta;
using ExplorerBeta.Input;
using ExplorerBeta.UI;
using ExplorerBeta.UI.Main;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
#if CPP
using UnhollowerRuntimeLib;
#endif
namespace Explorer.UI.Main.Pages.Console
namespace ExplorerBeta.UI.Main.Console
{
public class AutoCompleter
{
@ -31,7 +24,7 @@ namespace Explorer.UI.Main.Pages.Console
private static readonly List<Text> m_hiddenSuggestionTexts = new List<Text>();
private static bool m_suggestionsDirty;
private static AutoComplete[] m_suggestions = new AutoComplete[0];
private static Suggestion[] m_suggestions = new Suggestion[0];
private static int m_lastBatchIndex;
private static string m_prevInput = "NULL";
@ -47,12 +40,16 @@ namespace Explorer.UI.Main.Pages.Console
public static void Update()
{
if (!m_mainObj)
{
return;
}
if (!ConsolePage.EnableSuggestions)
{
if (m_mainObj.activeSelf)
{
m_mainObj.SetActive(false);
}
return;
}
@ -62,7 +59,7 @@ namespace Explorer.UI.Main.Pages.Console
UpdatePosition();
}
public static void SetSuggestions(AutoComplete[] suggestions)
public static void SetSuggestions(Suggestion[] suggestions)
{
m_suggestions = suggestions;
@ -73,12 +70,16 @@ namespace Explorer.UI.Main.Pages.Console
private static void RefreshButtons()
{
if (!m_suggestionsDirty)
{
return;
}
if (m_suggestions.Length < 1)
{
if (m_mainObj.activeSelf)
{
m_mainObj?.SetActive(false);
}
return;
}
@ -99,12 +100,16 @@ namespace Explorer.UI.Main.Pages.Console
if (i >= m_suggestions.Length)
{
if (m_suggestionButtons[i].activeSelf)
{
m_suggestionButtons[i].SetActive(false);
}
}
else
{
if (!m_suggestionButtons[i].activeSelf)
{
m_suggestionButtons[i].SetActive(true);
}
var suggestion = m_suggestions[i];
var label = m_suggestionTexts[i];
@ -113,14 +118,7 @@ namespace Explorer.UI.Main.Pages.Console
label.text = suggestion.Full;
hiddenLabel.text = suggestion.Addition;
if (suggestion.Context == AutoComplete.Contexts.Namespace)
{
label.color = new Color(0.75f, 0.75f, 0.75f, 1.0f);
}
else
{
label.color = Color.white;
}
label.color = suggestion.TextColor;
}
m_lastBatchIndex = i;
@ -134,14 +132,20 @@ namespace Explorer.UI.Main.Pages.Console
var editor = ConsolePage.Instance.m_codeEditor;
if (editor.InputField.text.Length < 1)
{
return;
}
var caretPos = editor.InputField.caretPosition;
int caretPos = editor.InputField.caretPosition;
while (caretPos >= editor.inputText.textInfo.characterInfo.Length)
{
caretPos--;
}
if (caretPos == m_lastCaretPos)
{
return;
}
m_lastCaretPos = caretPos;
@ -149,9 +153,9 @@ namespace Explorer.UI.Main.Pages.Console
{
var pos = editor.inputText.textInfo.characterInfo[caretPos].bottomLeft;
pos = MainMenu.Instance.MainPanel.transform.TransformPoint(pos);
pos = editor.InputField.transform.TransformPoint(pos);
m_mainObj.transform.position = new Vector3(pos.x + m_thisRect.rect.width / 2, pos.y - 12, 0);
m_mainObj.transform.position = new Vector3(pos.x, pos.y - 3, 0);
}
}
@ -160,14 +164,14 @@ namespace Explorer.UI.Main.Pages.Console
public static void CheckAutocomplete()
{
var m_codeEditor = ConsolePage.Instance.m_codeEditor;
var input = m_codeEditor.InputField.text;
var caretIndex = m_codeEditor.InputField.caretPosition;
string input = m_codeEditor.InputField.text;
int caretIndex = m_codeEditor.InputField.caretPosition;
if (!string.IsNullOrEmpty(input))
{
try
{
var start = caretIndex <= 0 ? 0 : input.LastIndexOfAny(splitChars, caretIndex - 1) + 1;
int start = caretIndex <= 0 ? 0 : input.LastIndexOfAny(splitChars, caretIndex - 1) + 1;
input = input.Substring(start, caretIndex - start).Trim();
}
catch (ArgumentException) { }
@ -199,39 +203,52 @@ namespace Explorer.UI.Main.Pages.Console
{
// Credit ManylMarco
ConsolePage.AutoCompletes.Clear();
var completions = ConsolePage.Instance.m_evaluator.GetCompletions(input, out string prefix);
string[] completions = ConsolePage.Instance.m_evaluator.GetCompletions(input, out string prefix);
if (completions != null)
{
if (prefix == null)
{
prefix = input;
}
ConsolePage.AutoCompletes.AddRange(completions
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => new AutoComplete(x, prefix, AutoComplete.Contexts.Other))
.Select(x => new Suggestion(x, prefix, Suggestion.Contexts.Other))
);
}
var trimmed = input.Trim();
string trimmed = input.Trim();
if (trimmed.StartsWith("using"))
{
trimmed = trimmed.Remove(0, 5).Trim();
}
var namespaces = AutoCompleteHelpers.Namespaces
IEnumerable<Suggestion> namespaces = Suggestion.Namespaces
.Where(x => x.StartsWith(trimmed) && x.Length > trimmed.Length)
.Select(x => new AutoComplete(
.Select(x => new Suggestion(
x.Substring(trimmed.Length),
x.Substring(0, trimmed.Length),
AutoComplete.Contexts.Namespace));
Suggestion.Contexts.Namespace));
ConsolePage.AutoCompletes.AddRange(namespaces);
IEnumerable<Suggestion> keywords = Suggestion.Keywords
.Where(x => x.StartsWith(trimmed) && x.Length > trimmed.Length)
.Select(x => new Suggestion(
x.Substring(trimmed.Length),
x.Substring(0, trimmed.Length),
Suggestion.Contexts.Keyword));
ConsolePage.AutoCompletes.AddRange(keywords);
}
catch (Exception ex)
{
ExplorerCore.Log("C# Console error:\r\n" + ex);
ExplorerCore.Log("Autocomplete error:\r\n" + ex.ToString());
ClearAutocompletes();
}
}
#region UI Construction
#region UI Construction
private static void ConstructUI()
{
@ -243,7 +260,7 @@ namespace Explorer.UI.Main.Pages.Console
var mainRect = obj.GetComponent<RectTransform>();
m_thisRect = mainRect;
mainRect.pivot = new Vector2(0.5f, 0.5f);
mainRect.pivot = new Vector2(0f, 1f);
mainRect.anchorMin = new Vector2(0.45f, 0.45f);
mainRect.anchorMax = new Vector2(0.65f, 0.6f);
mainRect.offsetMin = Vector2.zero;
@ -258,10 +275,10 @@ namespace Explorer.UI.Main.Pages.Console
for (int i = 0; i < MAX_LABELS; i++)
{
var buttonObj = UIFactory.CreateButton(content);
var btn = buttonObj.GetComponent<Button>();
var btnColors = btn.colors;
Button btn = buttonObj.GetComponent<Button>();
ColorBlock btnColors = btn.colors;
btnColors.normalColor = new Color(0f, 0f, 0f, 0f);
btnColors.highlightedColor = new Color(0.5f, 0.5f, 0.5f, 1.0f);
btnColors.highlightedColor = new Color(0.2f, 0.2f, 0.2f, 1.0f);
btn.colors = btnColors;
var nav = btn.navigation;
@ -289,7 +306,7 @@ namespace Explorer.UI.Main.Pages.Console
void UseAutocompleteButton()
{
ConsolePage.Instance.UseAutocomplete(hiddenText.text);
EventSystem.current.SetSelectedGameObject(ConsolePage.Instance.m_codeEditor.InputField.gameObject,
EventSystem.current.SetSelectedGameObject(ConsolePage.Instance.m_codeEditor.InputField.gameObject,
null);
}
@ -298,6 +315,6 @@ namespace Explorer.UI.Main.Pages.Console
}
}
#endregion
#endregion
}
}

View File

@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Text;
using ExplorerBeta.UI.Main.Console.Lexer;
using UnityEngine;
using Explorer.UI.Main.Pages.Console.Lexer;
using System.Runtime.InteropServices;
namespace Explorer.UI.Main.Pages.Console
namespace ExplorerBeta.UI.Main.Console
{
public static class CSharpLexer
{
@ -29,7 +27,7 @@ namespace Explorer.UI.Main.Pages.Console
else equals false finally float for foreach from global goto group
if in int into is join let lock long new null object on orderby out
ref remove return sbyte select short sizeof stackalloc string
struct switch throw true try typeof uint ulong ushort
switch throw true try typeof uint ulong ushort
value var where while yield"
};
@ -38,7 +36,7 @@ namespace Explorer.UI.Main.Pages.Console
highlightColor = new Color(0.95f, 0.10f, 0.10f, 1.0f),
keywords = @"abstract async base class delegate enum explicit extern fixed get
implicit interface internal namespace operator override params private protected public
using partial readonly sealed set static this unchecked unsafe virtual volatile void"
using partial readonly sealed set static struct this unchecked unsafe virtual volatile void"
};
private static char[] delimiterSymbolCache = null;
@ -53,8 +51,12 @@ namespace Explorer.UI.Main.Pages.Console
int count = 0;
for (int i = 0; i < symbols.Length; i++)
{
if (symbols[i].Length == 1)
{
count++;
}
}
delimiterSymbolCache = new char[count];
@ -113,7 +115,9 @@ namespace Explorer.UI.Main.Pages.Console
{
indentBuilder.Append('\n');
for (int j = 0; j < indent; j++)
{
indentBuilder.Append("\t");
}
}
else if (input[i] == '\t')
{
@ -142,7 +146,9 @@ namespace Explorer.UI.Main.Pages.Console
for (int i = formattedSection.Length - 1; i >= 0; i--)
{
if (formattedSection[i] == '\n')
{
continue;
}
caretPosition = i;
break;
@ -158,11 +164,15 @@ namespace Explorer.UI.Main.Pages.Console
for (int i = startIndex; i < endIndex; i++)
{
if (inputString[i] == '\t')
{
indent++;
}
// Check for end line or other characters
if (inputString[i] == '\n' || inputString[i] != ' ')
{
break;
}
}
return indent;

View File

@ -1,19 +1,17 @@
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System;
using System.Text;
using System.Reflection;
using ExplorerBeta.Input;
using Explorer.UI.Main.Pages.Console.Lexer;
using ExplorerBeta;
using System;
using System.Linq;
using System.Text;
using ExplorerBeta.Input;
using ExplorerBeta.UI.Main.Console.Lexer;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Explorer.UI.Main.Pages.Console
namespace ExplorerBeta.UI.Main.Console
{
public class CodeEditor
{
{
private readonly InputLexer inputLexer = new InputLexer();
public TMP_InputField InputField { get; }
@ -69,7 +67,7 @@ namespace Explorer.UI.Main.Pages.Console
public CodeEditor(TMP_InputField inputField, TextMeshProUGUI inputText, TextMeshProUGUI inputHighlightText, TextMeshProUGUI lineText,
Image background, Image lineHighlight, Image lineNumberBackground, Image scrollbar)
{
this.InputField = inputField;
InputField = inputField;
this.inputText = inputText;
this.inputHighlightText = inputHighlightText;
this.lineText = lineText;
@ -83,15 +81,15 @@ namespace Explorer.UI.Main.Pages.Console
throw new Exception("References are missing!");
}
this.inputTextTransform = inputText.GetComponent<RectTransform>();
this.lineHighlightTransform = lineHighlight.GetComponent<RectTransform>();
inputTextTransform = inputText.GetComponent<RectTransform>();
lineHighlightTransform = lineHighlight.GetComponent<RectTransform>();
ApplyTheme();
inputLexer.UseMatchers(CSharpLexer.DelimiterSymbols, CSharpLexer.Matchers);
// subscribe to text input changing
#if CPP
this.InputField.onValueChanged.AddListener(new Action<string>((string s) => { OnInputChanged(); }));
InputField.onValueChanged.AddListener(new Action<string>((string s) => { OnInputChanged(); }));
#else
this.InputField.onValueChanged.AddListener((string s) => { OnInputChanged(); });
#endif
@ -130,7 +128,7 @@ namespace Explorer.UI.Main.Pages.Console
public void OnInputChanged(bool forceUpdate = false)
{
var newText = InputField.text;
string newText = InputField.text;
UpdateIndent();
@ -152,11 +150,13 @@ namespace Explorer.UI.Main.Pages.Console
public void SetLineHighlight(int lineNumber, bool lockLineHighlight)
{
if (lineNumber < 1 || lineNumber > LineCount)
{
return;
}
lineHighlightTransform.anchoredPosition = new Vector2(5,
(inputText.textInfo.lineInfo[inputText.textInfo.characterInfo[0].lineNumber].lineHeight *
-(lineNumber - 1)) - 4f +
-(lineNumber - 1)) - 4f +
inputTextTransform.anchoredPosition.y);
lineHighlightLocked = lockLineHighlight;
@ -218,11 +218,13 @@ namespace Explorer.UI.Main.Pages.Console
private void UpdateIndent()
{
int caret = InputField.caretPosition;
if (caret < 0 || caret >= inputText.textInfo.characterInfo.Length)
{
while (caret >= 0 && caret >= inputText.textInfo.characterInfo.Length)
{
caret--;
}
if (caret < 0 || caret >= inputText.textInfo.characterInfo.Length)
{
@ -234,7 +236,9 @@ namespace Explorer.UI.Main.Pages.Console
int charCount = 0;
for (int i = 0; i < CurrentLine; i++)
{
charCount += inputText.textInfo.lineInfo[i].characterCount;
}
CurrentColumn = caret - charCount;
CurrentIndent = 0;
@ -244,28 +248,36 @@ namespace Explorer.UI.Main.Pages.Console
char character = InputField.text[i];
if (character == CSharpLexer.indentIncreaseCharacter)
{
CurrentIndent++;
}
if (character == CSharpLexer.indentDecreaseCharacter)
{
CurrentIndent--;
}
}
if (CurrentIndent < 0)
{
CurrentIndent = 0;
}
}
private void UpdateHighlight()
{
if (lineHighlightLocked)
{
return;
}
try
{
int caret = InputField.caretPosition - 1;
var lineHeight = inputText.textInfo.lineInfo[inputText.textInfo.characterInfo[0].lineNumber].lineHeight;
var lineNumber = inputText.textInfo.characterInfo[caret].lineNumber;
var offset = lineNumber + inputTextTransform.anchoredPosition.y;
float lineHeight = inputText.textInfo.lineInfo[inputText.textInfo.characterInfo[0].lineNumber].lineHeight;
int lineNumber = inputText.textInfo.characterInfo[caret].lineNumber;
float offset = lineNumber + inputTextTransform.anchoredPosition.y;
lineHighlightTransform.anchoredPosition = new Vector2(5, -(offset * lineHeight));
}
@ -283,15 +295,19 @@ namespace Explorer.UI.Main.Pages.Console
highlightedBuilder.Length = 0;
foreach (var match in inputLexer.LexInputString(inputText))
foreach (LexerMatchInfo match in inputLexer.LexInputString(inputText))
{
for (int i = offset; i < match.startIndex; i++)
{
highlightedBuilder.Append(inputText[i]);
}
highlightedBuilder.Append(match.htmlColor);
for (int i = match.startIndex; i < match.endIndex; i++)
{
highlightedBuilder.Append(inputText[i]);
}
highlightedBuilder.Append(CLOSE_COLOR_TAG);
@ -299,7 +315,9 @@ namespace Explorer.UI.Main.Pages.Console
}
for (int i = offset; i < inputText.Length; i++)
{
highlightedBuilder.Append(inputText[i]);
}
inputText = highlightedBuilder.ToString();
@ -310,23 +328,23 @@ namespace Explorer.UI.Main.Pages.Console
{
if (CurrentIndent > 0)
{
var indent = GetAutoIndentTab(CurrentIndent);
string indent = GetAutoIndentTab(CurrentIndent);
if (indent.Length > 0)
{
var caretPos = InputField.caretPosition;
int caretPos = InputField.caretPosition;
var indentMinusOne = indent.Substring(0, indent.Length - 1);
string indentMinusOne = indent.Substring(0, indent.Length - 1);
// get last index of {
// chuck it on the next line if its not already
var text = InputField.text;
var sub = InputField.text.Substring(0, InputField.caretPosition);
var lastIndex = sub.LastIndexOf("{");
var offset = lastIndex - 1;
string text = InputField.text;
string sub = InputField.text.Substring(0, InputField.caretPosition);
int lastIndex = sub.LastIndexOf("{");
int offset = lastIndex - 1;
if (offset >= 0 && text[offset] != '\n' && text[offset] != '\t')
{
var open = "\n" + indentMinusOne;
string open = "\n" + indentMinusOne;
InputField.text = text.Insert(offset + 1, open);
@ -368,7 +386,9 @@ namespace Explorer.UI.Main.Pages.Console
string tab = string.Empty;
for (int i = 0; i < amount; i++)
{
tab += "\t";
}
return tab;
}

View File

@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using Explorer.Unstrip.ColorUtility;
using System.Collections.Generic;
using UnityEngine;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
public sealed class CommentMatch : MatchLexer
{
@ -35,7 +33,11 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
if (match)
{
// Read until end
while (!IsEndLineOrEndFile(lexer, lexer.ReadNext())) ;
while (!IsEndLineOrEndFile(lexer, lexer.ReadNext()))
{
;
}
return true;
}
}

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
public enum SpecialCharacterPosition
{

View File

@ -1,10 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.Collections.Generic;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
internal struct LexerMatchInfo
{
@ -42,10 +38,14 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
foreach (char character in delimiters)
{
if (!specialStartSymbols.Contains(character))
{
specialStartSymbols.Add(character);
}
if (!specialEndSymbols.Contains(character))
{
specialEndSymbols.Add(character);
}
}
}
@ -54,12 +54,20 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
foreach (MatchLexer lexer in matchers)
{
foreach (char special in lexer.StartChars)
{
if (!specialStartSymbols.Contains(special))
{
specialStartSymbols.Add(special);
}
}
foreach (char special in lexer.EndChars)
{
if (!specialEndSymbols.Contains(special))
{
specialEndSymbols.Add(special);
}
}
}
}
}
@ -67,13 +75,15 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
public IEnumerable<LexerMatchInfo> LexInputString(string input)
{
if (input == null || matchers == null || matchers.Length == 0)
{
yield break;
}
this.inputString = input;
this.current = ' ';
this.Previous = ' ';
this.currentIndex = 0;
this.currentLookaheadIndex = 0;
inputString = input;
current = ' ';
Previous = ' ';
currentIndex = 0;
currentLookaheadIndex = 0;
while (!EndOfStream)
{
@ -115,7 +125,9 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
public char ReadNext()
{
if (EndOfStream)
{
return '\0';
}
Previous = current;
@ -134,17 +146,25 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
else
{
if (currentLookaheadIndex > currentIndex)
{
currentLookaheadIndex -= amount;
}
}
int previousIndex = currentLookaheadIndex - 1;
if (previousIndex >= inputString.Length)
{
Previous = inputString[inputString.Length - 1];
}
else if (previousIndex >= 0)
{
Previous = inputString[previousIndex];
}
else
{
Previous = ' ';
}
}
public void Commit()
@ -155,7 +175,9 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
public bool IsSpecialSymbol(char character, SpecialCharacterPosition position = SpecialCharacterPosition.Start)
{
if (position == SpecialCharacterPosition.Start)
{
return specialStartSymbols.Contains(character);
}
return specialEndSymbols.Contains(character);
}

View File

@ -1,19 +1,13 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using Explorer.Unstrip.ColorUtility;
using ExplorerBeta;
using System.Collections.Generic;
using UnityEngine;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
public sealed class KeywordMatch : MatchLexer
{
public string keywords;
public override Color HighlightColor => this.highlightColor;
public override Color HighlightColor => highlightColor;
public Color highlightColor;
private readonly HashSet<string> shortlist = new HashSet<string>();
@ -26,7 +20,9 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
if (!char.IsWhiteSpace(lexer.Previous) &&
!lexer.IsSpecialSymbol(lexer.Previous, SpecialCharacterPosition.End))
{
return false;
}
shortlist.Clear();
@ -34,11 +30,17 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
char currentChar = lexer.ReadNext();
for (int i = 0; i < keywordCache.Length; i++)
{
if (keywordCache[i][0] == currentChar)
{
shortlist.Add(keywordCache[i]);
}
}
if (shortlist.Count == 0)
{
return false;
}
do
{
@ -68,7 +70,9 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
}
while (removeList.Count > 0)
{
shortlist.Remove(removeList.Pop());
}
}
while (shortlist.Count > 0);
@ -78,21 +82,27 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
private void RemoveLongStrings(int length)
{
foreach (string keyword in shortlist)
{
if (keyword.Length > length)
{
removeList.Push(keyword);
}
}
while (removeList.Count > 0)
{
shortlist.Remove(removeList.Pop());
}
}
private void BuildKeywordCache()
{
if (keywordCache == null)
{
var kwSplit = keywords.Split(' ');
string[] kwSplit = keywords.Split(' ');
var list = new List<string>();
foreach (var kw in kwSplit)
List<string> list = new List<string>();
foreach (string kw in kwSplit)
{
if (!string.IsNullOrEmpty(kw) && kw.Length > 0)
{

View File

@ -1,10 +1,8 @@
using System;
using System.Collections.Generic;
using Explorer.Unstrip.ColorUtility;
using ExplorerBeta;
using System.Collections.Generic;
using ExplorerBeta.Unstrip.ColorUtility;
using UnityEngine;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
public abstract class MatchLexer
{

View File

@ -1,11 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using Explorer.Unstrip.ColorUtility;
using UnityEngine;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
public sealed class NumberMatch : MatchLexer
{

View File

@ -1,11 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Explorer.Unstrip.ColorUtility;
using System.Collections.Generic;
using UnityEngine;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
public sealed class StringMatch : MatchLexer
{
@ -18,7 +14,11 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
{
if (lexer.ReadNext() == '"')
{
while (!IsClosingQuoteOrEndFile(lexer, lexer.ReadNext())) ;
while (!IsClosingQuoteOrEndFile(lexer, lexer.ReadNext()))
{
;
}
return true;
}
return false;

View File

@ -1,12 +1,8 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Explorer.Unstrip.ColorUtility;
using ExplorerBeta;
using UnityEngine;
namespace Explorer.UI.Main.Pages.Console.Lexer
namespace ExplorerBeta.UI.Main.Console.Lexer
{
public sealed class SymbolMatch : MatchLexer
{
@ -25,7 +21,9 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
{
BuildSymbolCache();
foreach (string symbol in symbolCache.Where(x => x.Length > 0))
{
yield return symbol[0];
}
}
}
@ -35,14 +33,18 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
{
BuildSymbolCache();
foreach (string symbol in symbolCache.Where(x => x.Length > 0))
{
yield return symbol[0];
}
}
}
public override bool IsImplicitMatch(ILexer lexer)
{
if (lexer == null)
{
return false;
}
BuildSymbolCache();
@ -50,7 +52,9 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
!char.IsLetter(lexer.Previous) &&
!char.IsDigit(lexer.Previous) &&
!lexer.IsSpecialSymbol(lexer.Previous, SpecialCharacterPosition.End))
{
return false;
}
shortlist.Clear();
@ -60,11 +64,15 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
for (int i = symbolCache.Length - 1; i >= 0; i--)
{
if (symbolCache[i][0] == currentChar)
{
shortlist.Add(symbolCache[i]);
}
}
if (shortlist.Count == 0)
{
return false;
}
do
{
@ -96,7 +104,9 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
}
while (removeList.Count > 0)
{
shortlist.Remove(removeList.Pop());
}
}
while (shortlist.Count > 0);
@ -114,17 +124,21 @@ namespace Explorer.UI.Main.Pages.Console.Lexer
}
while (removeList.Count > 0)
{
shortlist.Remove(removeList.Pop());
}
}
private void BuildSymbolCache()
{
if (symbolCache != null)
{
return;
}
var symSplit = Symbols.Split(' ');
var list = new List<string>();
foreach (var sym in symSplit)
string[] symSplit = Symbols.Split(' ');
List<string> list = new List<string>();
foreach (string sym in symSplit)
{
if (!string.IsNullOrEmpty(sym) && sym.Length > 0)
{

View File

@ -6,7 +6,7 @@ using Mono.CSharp;
// Thanks to ManlyMarco for this
namespace Explorer.UI.Main.Pages.Console
namespace ExplorerBeta.UI.Main.Console
{
public class ScriptEvaluator : Evaluator, IDisposable
{
@ -35,7 +35,10 @@ namespace Explorer.UI.Main.Pages.Console
{
string name = args.LoadedAssembly.GetName().Name;
if (StdLib.Contains(name))
{
return;
}
ReferenceAssembly(args.LoadedAssembly);
}
@ -58,11 +61,14 @@ namespace Explorer.UI.Main.Pages.Console
private static void ImportAppdomainAssemblies(Action<Assembly> import)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
string name = assembly.GetName().Name;
if (StdLib.Contains(name))
{
continue;
}
import(assembly);
}
}

View File

@ -0,0 +1,92 @@
using System;
using Mono.CSharp;
namespace ExplorerBeta.UI.Main.Console
{
public class ScriptInteraction : InteractiveBase
{
public static void Log(object message)
{
ExplorerCore.Log(message);
}
public static void AddUsing(string directive)
{
ConsolePage.Instance.AddUsing(directive);
}
public static void GetUsing()
{
ExplorerCore.Log(ConsolePage.Instance.m_evaluator.GetUsing());
}
public static void Reset()
{
ConsolePage.Instance.ResetConsole();
}
public static object CurrentTarget()
{
throw new NotImplementedException("TODO");
}
public static object[] AllTargets()
{
throw new NotImplementedException("TODO");
}
public static void Inspect(object obj)
{
throw new NotImplementedException("TODO");
}
public static void Inspect(Type type)
{
throw new NotImplementedException("TODO");
}
// public static void Help()
// {
// ExplorerCore.Log(@"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// C# Console Help
//The following helper methods are available:
//void Log(object message)
// prints a message to the console window and debug log
// usage: Log(""hello world"");
//void AddUsing(string directive)
// adds a using directive to the console.
// usage: AddUsing(""UnityEngine.UI"");
//void GetUsing()
// logs the current using directives to the debug console
// usage: GetUsing();
//void Reset()
// resets the C# console, clearing all variables and using directives.
// usage: Reset();
//");
//TODO:
//ExplorerCore.Log("object CurrentTarget()");
//ExplorerCore.Log(" returns the target object of the current tab (in tab view mode only)");
//ExplorerCore.Log(" usage: var target = CurrentTarget();");
//ExplorerCore.Log("");
//ExplorerCore.Log("object[] AllTargets()");
//ExplorerCore.Log(" returns an object[] array containing all currently inspected objects");
//ExplorerCore.Log(" usage: var targets = AllTargets();");
//ExplorerCore.Log("");
//ExplorerCore.Log("void Inspect(object obj)");
//ExplorerCore.Log(" inspects the provided object in a new window.");
//ExplorerCore.Log(" usage: Inspect(Camera.main);");
//ExplorerCore.Log("");
//ExplorerCore.Log("void Inspect(Type type)");
//ExplorerCore.Log(" attempts to inspect the provided type with static-only reflection.");
//ExplorerCore.Log(" usage: Inspect(typeof(Camera));");
//}
}
}

View File

@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
namespace ExplorerBeta.UI.Main.Console
{
public struct Suggestion
{
public string Full => Prefix + Addition;
public readonly string Prefix;
public readonly string Addition;
public readonly Contexts Context;
public Color TextColor
{
get
{
switch (Context)
{
case Contexts.Namespace: return Color.grey;
case Contexts.Keyword: return systemBlue;
default: return Color.white;
}
}
}
private static readonly Color systemBlue = new Color(80f / 255f, 150f / 255f, 215f / 255f);
public Suggestion(string addition, string prefix, Contexts type)
{
Addition = addition;
Prefix = prefix;
Context = type;
}
public enum Contexts
{
Namespace,
Keyword,
Other
}
public static HashSet<string> Namespaces => m_namspaces ?? GetNamespaces();
private static HashSet<string> m_namspaces;
private static HashSet<string> GetNamespaces()
{
HashSet<string> set = new HashSet<string>(
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(GetTypes)
.Where(x => x.IsPublic && !string.IsNullOrEmpty(x.Namespace))
.Select(x => x.Namespace));
return m_namspaces = set;
IEnumerable<Type> GetTypes(Assembly asm) => asm.TryGetTypes();
}
public static HashSet<string> Keywords => m_keywords ?? GetKeywords();
private static HashSet<string> m_keywords;
private static HashSet<string> GetKeywords()
{
if (CSharpLexer.validKeywordMatcher.keywordCache == null)
{
return new HashSet<string>();
}
HashSet<string> set = new HashSet<string>();
foreach (string keyword in CSharpLexer.validKeywordMatcher.keywordCache)
{
set.Add(keyword);
}
return m_keywords = set;
}
}
}

View File

@ -1,13 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using Explorer.UI.Main.Pages.Console;
using ExplorerBeta;
using ExplorerBeta.UI;
using ExplorerBeta.UI.Main;
using ExplorerBeta.UI.Main.Console;
using ExplorerBeta.Unstrip.Resources;
using TMPro;
using UnityEngine;
@ -16,12 +11,9 @@ using UnityEngine.UI;
using UnhollowerRuntimeLib;
#endif
namespace Explorer.UI.Main.Pages
namespace ExplorerBeta.UI.Main
{
// TODO: Maybe add interface for managing the Using directives of the console.
// Otherwise it's pretty much done.
public class ConsolePage : BaseMenuPage
public class ConsolePage : MainMenu.Page
{
public override string Name => "C# Console";
@ -33,7 +25,7 @@ namespace Explorer.UI.Main.Pages
public CodeEditor m_codeEditor;
public ScriptEvaluator m_evaluator;
public static List<AutoComplete> AutoCompletes = new List<AutoComplete>();
public static List<Suggestion> AutoCompletes = new List<Suggestion>();
public static List<string> UsingDirectives;
public static readonly string[] DefaultUsing = new string[]
@ -54,7 +46,7 @@ namespace Explorer.UI.Main.Pages
{
ResetConsole();
foreach (var use in DefaultUsing)
foreach (string use in DefaultUsing)
{
AddUsing(use);
}
@ -66,7 +58,7 @@ namespace Explorer.UI.Main.Pages
catch (Exception e)
{
ExplorerCore.LogWarning($"Error setting up console!\r\nMessage: {e.Message}");
// TODO
// TODO remove page button from menu
}
}
@ -77,32 +69,31 @@ namespace Explorer.UI.Main.Pages
AutoCompleter.Update();
}
internal string AsmToUsing(string asm) => $"using {asm};";
public void AddUsing(string asm)
{
if (!UsingDirectives.Contains(asm))
{
UsingDirectives.Add(asm);
Evaluate(AsmToUsing(asm), true);
Evaluate($"using {asm};", true);
}
}
public object Evaluate(string str, bool suppressWarning = false)
public void Evaluate(string str, bool suppressWarning = false)
{
object ret = VoidType.Value;
m_evaluator.Compile(str, out var compiled);
m_evaluator.Compile(str, out Mono.CSharp.CompiledMethod compiled);
if (compiled == null)
{
if (!suppressWarning)
ExplorerCore.LogWarning("Unable to compile the code!");
{
ExplorerCore.LogWarning("Unable to compile the code!");
}
}
else
{
try
{
object ret = VoidType.Value;
compiled.Invoke(ref ret);
}
catch (Exception e)
@ -110,8 +101,6 @@ namespace Explorer.UI.Main.Pages
ExplorerCore.LogWarning($"Exception executing code: {e.GetType()}, {e.Message}\r\n{e.StackTrace}");
}
}
return ret;
}
public void ResetConsole()
@ -133,11 +122,10 @@ namespace Explorer.UI.Main.Pages
AutoCompleter.SetSuggestions(AutoCompletes.ToArray());
}
public void UseAutocomplete(string suggestion)
{
int cursorIndex = m_codeEditor.InputField.caretPosition;
var input = m_codeEditor.InputField.text;
string input = m_codeEditor.InputField.text;
input = input.Insert(cursorIndex, suggestion);
m_codeEditor.InputField.text = input;
m_codeEditor.InputField.caretPosition += suggestion.Length;
@ -145,15 +133,15 @@ namespace Explorer.UI.Main.Pages
AutoCompleter.ClearAutocompletes();
}
#region UI Construction
#region UI Construction
public void ConstructUI()
{
Content = UIFactory.CreateUIObject("C# Console", MainMenu.Instance.PageViewport);
var mainLayout = Content.AddComponent<LayoutElement>();
mainLayout.preferredHeight = 300;
mainLayout.flexibleHeight = 4;
mainLayout.preferredHeight = 9900;
mainLayout.flexibleHeight = 9000;
var mainGroup = Content.AddComponent<VerticalLayoutGroup>();
mainGroup.childControlHeight = true;
@ -161,12 +149,12 @@ namespace Explorer.UI.Main.Pages
mainGroup.childForceExpandHeight = true;
mainGroup.childForceExpandWidth = true;
#region TOP BAR
#region TOP BAR
// Main group object
var topBarObj = UIFactory.CreateHorizontalGroup(Content);
var topBarLayout = topBarObj.AddComponent<LayoutElement>();
LayoutElement topBarLayout = topBarObj.AddComponent<LayoutElement>();
topBarLayout.minHeight = 50;
topBarLayout.flexibleHeight = 0;
@ -223,7 +211,7 @@ namespace Explorer.UI.Main.Pages
var autoIndentToggleObj = UIFactory.CreateToggle(topBarObj, out Toggle autoIndentToggle, out Text autoIndentToggleText);
#if CPP
autoIndentToggle.onValueChanged.AddListener(new Action<bool>((bool val) =>
autoIndentToggle.onValueChanged.AddListener(new Action<bool>((bool val) =>
{
EnableAutoIndent = val;
}));
@ -247,9 +235,9 @@ namespace Explorer.UI.Main.Pages
suggestPos.y = -14;
autoIndentRect.localPosition = suggestPos;
#endregion
#endregion
#region CONSOLE INPUT
#region CONSOLE INPUT
var consoleBase = UIFactory.CreateUIObject("CodeEditor", Content);
@ -287,7 +275,9 @@ namespace Explorer.UI.Main.Pages
var lineHighlightImage = lineHighlight.GetComponent<Image>();
if (!lineHighlightImage)
{
lineHighlightImage = lineHighlight.AddComponent<Image>();
}
var linesBg = UIFactory.CreateUIObject("LinesBackground", consoleBase);
var linesBgRect = linesBg.GetComponent<RectTransform>();
@ -330,9 +320,21 @@ namespace Explorer.UI.Main.Pages
mainTextInput.fontSize = 18;
var placeHolderText = textAreaObj.transform.Find("Placeholder").GetComponent<TextMeshProUGUI>();
placeHolderText.text = @"Welcome to the Explorer C# Console!
placeHolderText.text = @"Welcome to the Explorer C# Console.
Use the <color=#c74e26>Help();</color> command for a list of available helper methods, or <color=#c74e26>Log(""[message]"");</color> to print something to console.";
The following helper methods are available:
* <color=#c74e26>Log(""message"");</color> logs a message to the debug console
* <color=#c74e26>AddUsing(""SomeNamespace"");</color> adds a using directive to the C# console
* <color=#c74e26>GetUsing();</color> logs the current using directives to the debug console
* <color=#c74e26>Reset();</color> resets all using directives and variables
TODO:
* <color=#c74e26>CurrentTarget();</color> returns the currently inspected target on the Home page
* <color=#c74e26>AllTargets();</color> returns an object[] array containing all inspected instances
* <color=#c74e26>Inspect(someObject)</color> to inspect an instance, eg. Inspect(Camera.main);
* <color=#c74e26>Inspect(typeof(SomeClass))</color> to inspect a Class with static reflection
";
var linesTextObj = UIFactory.CreateUIObject("LinesText", mainTextObj.gameObject);
var linesTextRect = linesTextObj.GetComponent<RectTransform>();
@ -381,9 +383,9 @@ Use the <color=#c74e26>Help();</color> command for a list of available helper me
tmpInput.GetComponentInChildren<RectMask2D>().enabled = false;
inputObj.GetComponent<Image>().enabled = false;
#endregion
#endregion
#region COMPILE BUTTON
#region COMPILE BUTTON
var compileBtnObj = UIFactory.CreateButton(Content);
var compileBtnLayout = compileBtnObj.AddComponent<LayoutElement>();
@ -427,10 +429,10 @@ Use the <color=#c74e26>Help();</color> command for a list of available helper me
TMP_FontAsset fontToUse = null;
#if CPP
var fonts = ResourcesUnstrip.FindObjectsOfTypeAll(Il2CppType.Of<TMP_FontAsset>());
foreach (var font in fonts)
UnityEngine.Object[] fonts = ResourcesUnstrip.FindObjectsOfTypeAll(Il2CppType.Of<TMP_FontAsset>());
foreach (UnityEngine.Object font in fonts)
{
var fontCast = font.Il2CppCast(typeof(TMP_FontAsset)) as TMP_FontAsset;
TMP_FontAsset fontCast = font.Il2CppCast(typeof(TMP_FontAsset)) as TMP_FontAsset;
if (fontCast.name.Contains("LiberationSans"))
{
@ -451,7 +453,7 @@ Use the <color=#c74e26>Help();</color> command for a list of available helper me
#endif
if (fontToUse != null)
{
var faceInfo = fontToUse.faceInfo;
UnityEngine.TextCore.FaceInfo faceInfo = fontToUse.faceInfo;
fontToUse.tabSize = 10;
faceInfo.tabWidth = 10;
#if CPP
@ -467,7 +469,7 @@ Use the <color=#c74e26>Help();</color> command for a list of available helper me
highlightTextInput.font = fontToUse;
}
#endregion
#endregion
try
{
@ -480,7 +482,7 @@ Use the <color=#c74e26>Help();</color> command for a list of available helper me
}
}
#endregion
#endregion
private class VoidType
{

View File

@ -1,16 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Explorer.Unstrip.ColorUtility;
using ExplorerBeta.Input;
using ExplorerBeta.Unstrip.Resources;
using ExplorerBeta.Unstrip.ColorUtility;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
#if CPP
using UnhollowerRuntimeLib;
#endif
namespace ExplorerBeta.UI.Main
@ -21,8 +15,6 @@ namespace ExplorerBeta.UI.Main
public static bool LogUnity { get; set; } = true;
public static GameObject CanvasRoot;
public readonly List<string> AllMessages;
public readonly List<Text> MessageHolders;
@ -44,12 +36,42 @@ namespace ExplorerBeta.UI.Main
ExplorerCore.Log(e);
}
}
public static void Log(string message)
{
Log(message, null);
}
public static void Log(string message, Color color)
{
Log(message, color.ToHex());
}
public static void Log(string message, string hexColor)
{
if (Instance == null)
{
return;
}
Instance.AllMessages.Add(message);
if (Instance.m_textInput)
{
if (hexColor != null)
{
message = $"<color=#{hexColor}>{message}</color>";
}
Instance.m_textInput.text = $"{message}\n{Instance.m_textInput.text}";
}
}
// todo: get scrollbar working with inputfield somehow
public void ConstructUI(GameObject parent)
{
var mainObj = UIFactory.CreateVerticalGroup(parent, new Color(0.1f, 0.1f, 0.1f, 1.0f));
var mainGroup = mainObj.GetComponent<VerticalLayoutGroup>();
mainGroup.childControlHeight = true;
mainGroup.childControlWidth = true;
@ -63,11 +85,10 @@ namespace ExplorerBeta.UI.Main
mask.showMaskGraphic = true;
var mainLayout = mainObj.AddComponent<LayoutElement>();
mainLayout.minHeight = 40;
mainLayout.preferredHeight = 230;
mainLayout.minHeight = 190;
mainLayout.flexibleHeight = 0;
#region LOG AREA
#region LOG AREA
var logAreaObj = UIFactory.CreateHorizontalGroup(mainObj);
var logAreaGroup = logAreaObj.GetComponent<HorizontalLayoutGroup>();
logAreaGroup.childControlHeight = true;
@ -76,8 +97,8 @@ namespace ExplorerBeta.UI.Main
logAreaGroup.childForceExpandWidth = true;
var logAreaLayout = logAreaObj.AddComponent<LayoutElement>();
logAreaLayout.preferredHeight = 300;
logAreaLayout.flexibleHeight = 50;
logAreaLayout.preferredHeight = 190;
logAreaLayout.flexibleHeight = 0;
var inputObj = UIFactory.CreateTMPInput(logAreaObj);
@ -114,12 +135,12 @@ namespace ExplorerBeta.UI.Main
m_textInput = inputObj.GetComponent<TMP_InputField>();
#endregion
#endregion
#region BOTTOM BAR
#region BOTTOM BAR
var bottomBarObj = UIFactory.CreateHorizontalGroup(mainObj);
var topBarLayout = bottomBarObj.AddComponent<LayoutElement>();
LayoutElement topBarLayout = bottomBarObj.AddComponent<LayoutElement>();
topBarLayout.minHeight = 40;
topBarLayout.flexibleHeight = 0;
@ -165,13 +186,13 @@ namespace ExplorerBeta.UI.Main
{
logAreaObj.SetActive(false);
hideBtnText.text = "Show";
mainLayout.preferredHeight = 40;
mainLayout.minHeight = 40;
}
else
{
logAreaObj.SetActive(true);
hideBtnText.text = "Hide";
mainLayout.preferredHeight = 230;
mainLayout.minHeight = 190;
}
}
@ -214,16 +235,10 @@ namespace ExplorerBeta.UI.Main
var unityToggleObj = UIFactory.CreateToggle(bottomBarObj, out Toggle unityToggle, out Text unityToggleText);
#if CPP
unityToggle.onValueChanged.AddListener(new Action<bool>(ToggleCallback));
unityToggle.onValueChanged.AddListener(new Action<bool>((bool val) => { LogUnity = val; }));
#else
unityToggle.onValueChanged.AddListener(ToggleCallback);
unityToggle.onValueChanged.AddListener((bool val) => { LogUnity = val; }));
#endif
void ToggleCallback(bool val)
{
LogUnity = val;
}
unityToggleText.text = "Print Unity Debug?";
unityToggleText.alignment = TextAnchor.MiddleLeft;
@ -236,33 +251,9 @@ namespace ExplorerBeta.UI.Main
pos.y = -8;
unityToggleRect.localPosition = pos;
#endregion
#endregion
}
public static void Log(string message)
{
Log(message, null);
}
public static void Log(string message, Color color)
{
Log(message, color.ToHex());
}
public static void Log(string message, string hexColor)
{
if (Instance == null)
return;
Instance.AllMessages.Add(message);
if (Instance.m_textInput)
{
if (hexColor != null)
message = $"<color=#{hexColor}>{message}</color>";
Instance.m_textInput.text = $"{message}\n{Instance.m_textInput.text}";
}
}
}
}

53
src/UI/Main/HomePage.cs Normal file
View File

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
namespace ExplorerBeta.UI.Main
{
public class HomePage : MainMenu.Page
{
public override string Name => "Home";
public static HomePage Instance { get; internal set; }
public override void Init()
{
Instance = this;
ConstructMenu();
SceneExplorer.Instance.Init();
}
public override void Update()
{
SceneExplorer.Instance.Update();
InspectorManager.Instance.Update();
}
private void ConstructMenu()
{
GameObject parent = MainMenu.Instance.PageViewport;
Content = UIFactory.CreateHorizontalGroup(parent);
var mainGroup = Content.GetComponent<HorizontalLayoutGroup>();
mainGroup.padding.left = 3;
mainGroup.padding.right = 3;
mainGroup.padding.top = 3;
mainGroup.padding.bottom = 3;
mainGroup.spacing = 5;
mainGroup.childForceExpandHeight = true;
mainGroup.childForceExpandWidth = true;
mainGroup.childControlHeight = true;
mainGroup.childControlWidth = true;
new SceneExplorer();
SceneExplorer.Instance.ConstructScenePane();
new InspectorManager();
InspectorManager.Instance.ConstructInspectorPane();
}
}
}

View File

@ -0,0 +1,177 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ExplorerBeta.Helpers;
using ExplorerBeta.UI.Main.Inspectors;
using ExplorerBeta.UI.Shared;
using ExplorerBeta.Unstrip.Scenes;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
namespace ExplorerBeta.UI.Main
{
public class InspectorManager
{
public static InspectorManager Instance { get; private set; }
public InspectorManager() { Instance = this; }
public InspectorBase m_activeInspector;
public readonly List<InspectorBase> m_currentInspectors = new List<InspectorBase>();
public GameObject m_tabBarContent;
public GameObject m_rightPaneContent;
public void Update()
{
foreach (InspectorBase tab in m_currentInspectors)
{
tab.Update();
}
}
public void Inspect(object obj)
{
#if CPP
obj = obj.Il2CppCast(ReflectionHelpers.GetActualType(obj));
#endif
UnityEngine.Object unityObj = obj as UnityEngine.Object;
if (InspectorBase.ObjectNullOrDestroyed(obj, unityObj))
{
return;
}
MainMenu.Instance.SetPage(HomePage.Instance);
// check if currently inspecting this object
foreach (InspectorBase tab in m_currentInspectors)
{
if (ReferenceEquals(obj, tab.Target))
{
SetInspectorTab(tab);
return;
}
#if CPP
else if (unityObj && tab.Target is UnityEngine.Object uTabObj)
{
if (unityObj.m_CachedPtr == uTabObj.m_CachedPtr)
{
SetInspectorTab(tab);
return;
}
}
#endif
}
InspectorBase inspector;
if (obj is GameObject go)
{
inspector = new GameObjectInspector(go);
}
else
{
inspector = new InstanceInspector(obj);
}
m_currentInspectors.Add(inspector);
inspector.inspectorContent?.SetActive(false);
SetInspectorTab(inspector);
}
public void Inspect(Type type)
{
// TODO static type inspection
}
public void SetInspectorTab(InspectorBase inspector)
{
UnsetInspectorTab();
m_activeInspector = inspector;
m_activeInspector.inspectorContent?.SetActive(true);
Color activeColor = new Color(0, 0.25f, 0, 1);
ColorBlock colors = inspector.tabButton.colors;
colors.normalColor = activeColor;
colors.highlightedColor = activeColor;
inspector.tabButton.colors = colors;
}
public void UnsetInspectorTab()
{
if (m_activeInspector == null)
{
return;
}
m_activeInspector.inspectorContent?.SetActive(false);
ColorBlock colors = m_activeInspector.tabButton.colors;
colors.normalColor = new Color(0.2f, 0.2f, 0.2f, 1);
colors.highlightedColor = new Color(0.1f, 0.3f, 0.1f, 1);
m_activeInspector.tabButton.colors = colors;
m_activeInspector = null;
}
#region INSPECTOR PANE
public void ConstructInspectorPane()
{
m_rightPaneContent = UIFactory.CreateVerticalGroup(HomePage.Instance.Content, new Color(72f / 255f, 72f / 255f, 72f / 255f));
LayoutElement rightLayout = m_rightPaneContent.AddComponent<LayoutElement>();
rightLayout.flexibleWidth = 999999;
VerticalLayoutGroup rightGroup = m_rightPaneContent.GetComponent<VerticalLayoutGroup>();
rightGroup.childForceExpandHeight = true;
rightGroup.childForceExpandWidth = true;
rightGroup.childControlHeight = true;
rightGroup.childControlWidth = true;
rightGroup.spacing = 10;
rightGroup.padding.left = 8;
rightGroup.padding.right = 8;
rightGroup.padding.top = 8;
rightGroup.padding.bottom = 8;
GameObject inspectorTitle = UIFactory.CreateLabel(m_rightPaneContent, TextAnchor.UpperLeft);
Text title = inspectorTitle.GetComponent<Text>();
title.text = "Inspector";
title.fontSize = 20;
LayoutElement titleLayout = inspectorTitle.AddComponent<LayoutElement>();
titleLayout.minHeight = 30;
titleLayout.flexibleHeight = 0;
m_tabBarContent = UIFactory.CreateGridGroup(m_rightPaneContent, new Vector2(185, 20), new Vector2(5, 2), new Color(0.1f, 0.1f, 0.1f, 1));
GridLayoutGroup gridGroup = m_tabBarContent.GetComponent<GridLayoutGroup>();
gridGroup.padding.top = 4;
gridGroup.padding.left = 4;
gridGroup.padding.right = 4;
gridGroup.padding.bottom = 4;
// TEMP DUMMY INSPECTOR
GameObject dummyInspectorObj = UIFactory.CreateVerticalGroup(m_rightPaneContent, new Color(0.1f, 0.1f, 0.1f, 1.0f));
VerticalLayoutGroup dummyGroup = dummyInspectorObj.GetComponent<VerticalLayoutGroup>();
dummyGroup.childForceExpandHeight = true;
dummyGroup.childForceExpandWidth = true;
dummyGroup.childControlHeight = true;
dummyGroup.childControlWidth = true;
dummyGroup.spacing = 5;
dummyGroup.padding.top = 5;
dummyGroup.padding.left = 5;
dummyGroup.padding.right = 5;
dummyGroup.padding.bottom = 5;
LayoutElement dummyLayout = dummyInspectorObj.AddComponent<LayoutElement>();
dummyLayout.preferredHeight = 900;
dummyLayout.flexibleHeight = 10000;
}
#endregion
}
}

View File

@ -0,0 +1,42 @@
using UnityEngine;
namespace ExplorerBeta.UI.Main.Inspectors
{
public class GameObjectInspector : InspectorBase
{
public override string TabLabel => $" [G] {TargetGO?.name}";
// just to help with casting in il2cpp
public GameObject TargetGO;
public GameObjectInspector(GameObject target) : base(target)
{
TargetGO = target;
ConstructUI();
}
public override void Update()
{
base.Update();
if (m_pendingDestroy || InspectorManager.Instance.m_activeInspector != this)
{
return;
}
// TODO refresh children and components
}
#region UI CONSTRUCTION
private void ConstructUI()
{
// todo create gameobject inspector pane
}
#endregion
}
}

View File

@ -0,0 +1,143 @@
using System;
using UnityEngine;
using UnityEngine.UI;
namespace ExplorerBeta.UI.Main.Inspectors
{
public abstract class InspectorBase
{
public object Target;
// just to cache a cast
public UnityEngine.Object UnityTarget;
public abstract string TabLabel { get; }
public GameObject inspectorContent;
public Button tabButton;
public Text tabText;
internal bool m_pendingDestroy;
public InspectorBase(object target)
{
Target = target;
UnityTarget = target as UnityEngine.Object;
if (ObjectNullOrDestroyed(Target, UnityTarget))
{
Destroy();
return;
}
AddInspectorTab();
}
public virtual void Update()
{
if (ObjectNullOrDestroyed(Target, UnityTarget))
{
Destroy();
return;
}
tabText.text = TabLabel;
}
public virtual void Destroy()
{
m_pendingDestroy = true;
GameObject tabGroup = tabButton?.transform.parent.gameObject;
if (tabGroup)
{
GameObject.Destroy(tabGroup);
}
if (inspectorContent)
{
GameObject.Destroy(inspectorContent);
}
if (ReferenceEquals(InspectorManager.Instance.m_activeInspector, this))
{
InspectorManager.Instance.UnsetInspectorTab();
}
if (InspectorManager.Instance.m_currentInspectors.Contains(this))
{
InspectorManager.Instance.m_currentInspectors.Remove(this);
}
}
public static bool ObjectNullOrDestroyed(object obj, UnityEngine.Object unityObj, bool suppressWarning = false)
{
if (obj == null)
{
if (!suppressWarning)
{
ExplorerCore.LogWarning("The target instance is null!");
}
return true;
}
else if (obj is UnityEngine.Object)
{
if (!unityObj)
{
if (!suppressWarning)
{
ExplorerCore.LogWarning("The target UnityEngine.Object was destroyed!");
}
return true;
}
}
return false;
}
#region UI CONSTRUCTION
public void AddInspectorTab()
{
var tabContent = InspectorManager.Instance.m_tabBarContent;
var tabGroupObj = UIFactory.CreateHorizontalGroup(tabContent);
var tabGroup = tabGroupObj.GetComponent<HorizontalLayoutGroup>();
tabGroup.childForceExpandWidth = true;
tabGroup.childControlWidth = true;
var tabLayout = tabGroupObj.AddComponent<LayoutElement>();
tabLayout.minWidth = 185;
tabLayout.flexibleWidth = 0;
tabGroupObj.AddComponent<Mask>();
var targetButtonObj = UIFactory.CreateButton(tabGroupObj);
var targetButtonLayout = targetButtonObj.AddComponent<LayoutElement>();
targetButtonLayout.minWidth = 165;
targetButtonLayout.flexibleWidth = 0;
tabText = targetButtonObj.GetComponentInChildren<Text>();
tabText.horizontalOverflow = HorizontalWrapMode.Overflow;
tabText.alignment = TextAnchor.MiddleLeft;
tabButton = targetButtonObj.GetComponent<Button>();
tabButton.onClick.AddListener(new Action(() => { InspectorManager.Instance.SetInspectorTab(this); }));
var closeBtnObj = UIFactory.CreateButton(tabGroupObj);
var closeBtnLayout = closeBtnObj.AddComponent<LayoutElement>();
closeBtnLayout.minWidth = 20;
closeBtnLayout.flexibleWidth = 0;
var closeBtnText = closeBtnObj.GetComponentInChildren<Text>();
closeBtnText.text = "X";
closeBtnText.color = new Color(1, 0, 0, 1);
var closeBtn = closeBtnObj.GetComponent<Button>();
closeBtn.onClick.AddListener(new Action(() => { Destroy(); }));
var closeColors = closeBtn.colors;
closeColors.normalColor = new Color(0.2f, 0.2f, 0.2f, 1);
closeBtn.colors = closeColors;
}
#endregion
}
}

View File

@ -0,0 +1,40 @@
using System;
using ExplorerBeta.Helpers;
namespace ExplorerBeta.UI.Main.Inspectors
{
public class InstanceInspector : InspectorBase
{
// todo
public override string TabLabel => $" [R] {m_targetTypeShortName}";
private readonly string m_targetTypeShortName;
public InstanceInspector(object target) : base(target)
{
// todo
Type type = ReflectionHelpers.GetActualType(target);
if (type == null)
{
// TODO
return;
}
m_targetTypeShortName = type.Name;
}
public override void Update()
{
base.Update();
if (m_pendingDestroy || InspectorManager.Instance.m_activeInspector != this)
{
return;
}
// todo
}
}
}

View File

@ -0,0 +1,26 @@
using System;
namespace ExplorerBeta.UI.Main.Inspectors
{
public class StaticInspector : InspectorBase
{
public override string TabLabel => " [S] TODO";
public StaticInspector(Type type) : base(type)
{
// TODO
}
public override void Update()
{
base.Update();
if (m_pendingDestroy || InspectorManager.Instance.m_activeInspector != this)
{
return;
}
// todo
}
}
}

View File

@ -1,19 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExplorerBeta.UI;
using ExplorerBeta.UI.Main.Console;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using ExplorerBeta.UI.Shared;
using Explorer.UI.Main.Pages;
using Explorer.UI.Main.Pages.Console;
namespace ExplorerBeta.UI.Main
{
public class MainMenu
{
public abstract class Page
{
public abstract string Name { get; }
public GameObject Content;
public Button RefNavbarButton { get; set; }
public bool Enabled
{
get => Content?.activeSelf ?? false;
set => Content?.SetActive(true);
}
public abstract void Init();
public abstract void Update();
}
public static MainMenu Instance { get; set; }
public PanelDragger Dragger { get; private set; }
@ -21,14 +33,14 @@ namespace ExplorerBeta.UI.Main
public GameObject MainPanel { get; private set; }
public GameObject PageViewport { get; private set; }
public readonly List<BaseMenuPage> Pages = new List<BaseMenuPage>();
private BaseMenuPage m_activePage;
public readonly List<Page> Pages = new List<Page>();
private Page m_activePage;
// Navbar buttons
private Button m_lastNavButtonPressed;
private readonly Color m_navButtonNormal = new Color(65f/255f, 66f/255f, 66f/255f);
private readonly Color m_navButtonHighlight = new Color(50f/255f, 195f/255f, 50f/255f);
private readonly Color m_navButtonSelected = new Color(60f/255f, 120f/255f, 60f/255f);
private readonly Color m_navButtonNormal = new Color(65f / 255f, 66f / 255f, 66f / 255f);
private readonly Color m_navButtonHighlight = new Color(50f / 255f, 195f / 255f, 50f / 255f);
private readonly Color m_navButtonSelected = new Color(60f / 255f, 120f / 255f, 60f / 255f);
public MainMenu()
{
@ -48,7 +60,7 @@ namespace ExplorerBeta.UI.Main
ConstructMenu();
foreach (var page in Pages)
foreach (Page page in Pages)
{
page.Init();
page.Content?.SetActive(false);
@ -62,10 +74,12 @@ namespace ExplorerBeta.UI.Main
m_activePage?.Update();
}
private void SetPage(BaseMenuPage page)
public void SetPage(Page page)
{
if (m_activePage == page || page == null)
{
return;
}
m_activePage?.Content?.SetActive(false);
if (m_activePage is ConsolePage)
@ -77,16 +91,16 @@ namespace ExplorerBeta.UI.Main
m_activePage.Content?.SetActive(true);
var button = page.RefNavbarButton;
Button button = page.RefNavbarButton;
var colors = button.colors;
ColorBlock colors = button.colors;
colors.normalColor = m_navButtonSelected;
//try { colors.selectedColor = m_navButtonSelected; } catch { }
button.colors = colors;
if (m_lastNavButtonPressed && m_lastNavButtonPressed != button)
{
var oldColors = m_lastNavButtonPressed.colors;
ColorBlock oldColors = m_lastNavButtonPressed.colors;
oldColors.normalColor = m_navButtonNormal;
//try { oldColors.selectedColor = m_navButtonNormal; } catch { }
m_lastNavButtonPressed.colors = oldColors;
@ -107,7 +121,7 @@ namespace ExplorerBeta.UI.Main
{
MainPanel = UIFactory.CreatePanel(UIManager.CanvasRoot, "MainMenu", out GameObject content);
var panelRect = MainPanel.GetComponent<RectTransform>();
RectTransform panelRect = MainPanel.GetComponent<RectTransform>();
panelRect.anchorMin = new Vector2(0.25f, 0.1f);
panelRect.anchorMax = new Vector2(0.75f, 0.95f);
@ -129,9 +143,9 @@ namespace ExplorerBeta.UI.Main
{
// Core title bar holder
var titleBar = UIFactory.CreateHorizontalGroup(content);
GameObject titleBar = UIFactory.CreateHorizontalGroup(content);
var titleGroup = titleBar.GetComponent<HorizontalLayoutGroup>();
HorizontalLayoutGroup titleGroup = titleBar.GetComponent<HorizontalLayoutGroup>();
titleGroup.childControlHeight = true;
titleGroup.childControlWidth = true;
titleGroup.childForceExpandHeight = true;
@ -141,21 +155,21 @@ namespace ExplorerBeta.UI.Main
titleGroup.padding.top = 3;
titleGroup.padding.bottom = 3;
var titleLayout = titleBar.AddComponent<LayoutElement>();
LayoutElement titleLayout = titleBar.AddComponent<LayoutElement>();
titleLayout.minHeight = 35;
titleLayout.flexibleHeight = 0;
// Explorer label
var textObj = UIFactory.CreateLabel(titleBar, TextAnchor.MiddleLeft);
GameObject textObj = UIFactory.CreateLabel(titleBar, TextAnchor.MiddleLeft);
var text = textObj.GetComponent<Text>();
Text text = textObj.GetComponent<Text>();
text.text = $"<b>Explorer</b> <i>v{ExplorerCore.VERSION}</i>";
text.resizeTextForBestFit = true;
text.resizeTextMinSize = 12;
text.resizeTextMaxSize = 20;
var textLayout = textObj.AddComponent<LayoutElement>();
LayoutElement textLayout = textObj.AddComponent<LayoutElement>();
textLayout.flexibleWidth = 50;
// Add PanelDragger using the label object
@ -164,25 +178,25 @@ namespace ExplorerBeta.UI.Main
// Hide button
var hideBtnObj = UIFactory.CreateButton(titleBar);
GameObject hideBtnObj = UIFactory.CreateButton(titleBar);
var hideBtn = hideBtnObj.GetComponent<Button>();
Button hideBtn = hideBtnObj.GetComponent<Button>();
#if CPP
hideBtn.onClick.AddListener(new Action(() => { ExplorerCore.ShowMenu = false; }));
#else
hideBtn.onClick.AddListener(() => { ExplorerCore.ShowMenu = false; });
#endif
var colorBlock = hideBtn.colors;
colorBlock.normalColor = new Color(65f/255f, 23f/255f, 23f/255f);
colorBlock.pressedColor = new Color(35f/255f, 10f/255f, 10f/255f);
colorBlock.highlightedColor = new Color(156f/255f, 0f, 0f);
ColorBlock colorBlock = hideBtn.colors;
colorBlock.normalColor = new Color(65f / 255f, 23f / 255f, 23f / 255f);
colorBlock.pressedColor = new Color(35f / 255f, 10f / 255f, 10f / 255f);
colorBlock.highlightedColor = new Color(156f / 255f, 0f, 0f);
hideBtn.colors = colorBlock;
var btnLayout = hideBtnObj.AddComponent<LayoutElement>();
LayoutElement btnLayout = hideBtnObj.AddComponent<LayoutElement>();
btnLayout.minWidth = 90;
btnLayout.flexibleWidth = 2;
var hideText = hideBtnObj.GetComponentInChildren<Text>();
Text hideText = hideBtnObj.GetComponentInChildren<Text>();
// Todo use actual keycode from mod config, update on OnSettingsChanged or whatever
hideText.text = "Hide (F7)";
hideText.color = Color.white;
@ -193,9 +207,9 @@ namespace ExplorerBeta.UI.Main
private void ConstructNavbar(GameObject content)
{
var navbarObj = UIFactory.CreateHorizontalGroup(content);
GameObject navbarObj = UIFactory.CreateHorizontalGroup(content);
var navGroup = navbarObj.GetComponent<HorizontalLayoutGroup>();
HorizontalLayoutGroup navGroup = navbarObj.GetComponent<HorizontalLayoutGroup>();
navGroup.padding.left = 3;
navGroup.padding.right = 3;
navGroup.padding.top = 3;
@ -206,14 +220,14 @@ namespace ExplorerBeta.UI.Main
navGroup.childForceExpandHeight = true;
navGroup.childForceExpandWidth = true;
var navLayout = navbarObj.AddComponent<LayoutElement>();
LayoutElement navLayout = navbarObj.AddComponent<LayoutElement>();
navLayout.minHeight = 35;
navLayout.flexibleHeight = 0;
foreach (var page in Pages)
foreach (Page page in Pages)
{
var btnObj = UIFactory.CreateButton(navbarObj);
var btn = btnObj.GetComponent<Button>();
GameObject btnObj = UIFactory.CreateButton(navbarObj);
Button btn = btnObj.GetComponent<Button>();
page.RefNavbarButton = btn;
@ -223,11 +237,11 @@ namespace ExplorerBeta.UI.Main
btn.onClick.AddListener(() => { SetPage(page); });
#endif
var text = btnObj.GetComponentInChildren<Text>();
Text text = btnObj.GetComponentInChildren<Text>();
text.text = page.Name;
// Set button colors
var colorBlock = btn.colors;
ColorBlock colorBlock = btn.colors;
colorBlock.normalColor = m_navButtonNormal;
//try { colorBlock.selectedColor = colorBlock.normalColor; } catch { }
colorBlock.highlightedColor = m_navButtonHighlight;
@ -238,8 +252,8 @@ namespace ExplorerBeta.UI.Main
private void ConstructMainViewport(GameObject content)
{
var mainObj = UIFactory.CreateHorizontalGroup(content);
var mainGroup = mainObj.GetComponent<HorizontalLayoutGroup>();
GameObject mainObj = UIFactory.CreateHorizontalGroup(content);
HorizontalLayoutGroup mainGroup = mainObj.GetComponent<HorizontalLayoutGroup>();
mainGroup.childControlHeight = true;
mainGroup.childControlWidth = true;
mainGroup.childForceExpandHeight = true;
@ -248,6 +262,6 @@ namespace ExplorerBeta.UI.Main
PageViewport = mainObj;
}
#endregion
#endregion
}
}

View File

@ -1,11 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Explorer.UI.Main.Pages
namespace ExplorerBeta.UI.Main
{
public class OptionsPage : BaseMenuPage
public class OptionsPage : MainMenu.Page
{
public override string Name => "Options / Misc";

View File

@ -1,27 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
namespace Explorer.UI.Main.Pages
{
public abstract class BaseMenuPage
{
public abstract string Name { get; }
public GameObject Content;
public Button RefNavbarButton { get; set; }
public bool Enabled
{
get => Content?.activeSelf ?? false;
set => Content?.SetActive(true);
}
public abstract void Init();
public abstract void Update();
}
}

View File

@ -1,57 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using ExplorerBeta;
using UnityEngine;
// Thanks to ManlyMarco for this
namespace Explorer.UI.Main.Pages.Console
{
public struct AutoComplete
{
public string Full => Prefix + Addition;
public readonly string Prefix;
public readonly string Addition;
public readonly Contexts Context;
public Color TextColor => Context == Contexts.Namespace
? Color.gray
: Color.white;
public AutoComplete(string addition, string prefix, Contexts type)
{
Addition = addition;
Prefix = prefix;
Context = type;
}
public enum Contexts
{
Namespace,
Other
}
}
public static class AutoCompleteHelpers
{
public static HashSet<string> Namespaces => _namespaces ?? GetNamespaces();
private static HashSet<string> _namespaces;
private static HashSet<string> GetNamespaces()
{
var set = new HashSet<string>(
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(GetTypes)
.Where(x => x.IsPublic && !string.IsNullOrEmpty(x.Namespace))
.Select(x => x.Namespace));
return _namespaces = set;
IEnumerable<Type> GetTypes(Assembly asm) => asm.TryGetTypes();
}
}
}

View File

@ -1,68 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Mono.CSharp;
using UnityEngine;
using ExplorerBeta;
namespace Explorer.UI.Main
{
public class ScriptInteraction : InteractiveBase
{
public static void Log(object message)
{
ExplorerCore.Log(message);
}
public static object CurrentTarget()
{
throw new NotImplementedException("TODO");
}
public static object[] AllTargets()
{
throw new NotImplementedException("TODO");
}
public static void Inspect(object obj)
{
throw new NotImplementedException("TODO");
}
public static void Inspect(Type type)
{
throw new NotImplementedException("TODO");
}
public static void Help()
{
var msg = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n";
msg += " C# Console Help \r\n";
msg += "\r\n";
msg += "The following helper methods are available:\r\n";
msg += "\r\n";
msg += "void Log(object message)\r\n";
msg += " prints a message to the console window and debug log\r\n";
msg += " usage: Log(\"hello world\");\r\n";
msg += "\r\n";
ExplorerCore.Log(msg);
//ExplorerCore.Log("object CurrentTarget()");
//ExplorerCore.Log(" returns the target object of the current tab (in tab view mode only)");
//ExplorerCore.Log(" usage: var target = CurrentTarget();");
//ExplorerCore.Log("");
//ExplorerCore.Log("object[] AllTargets()");
//ExplorerCore.Log(" returns an object[] array containing all currently inspected objects");
//ExplorerCore.Log(" usage: var targets = AllTargets();");
//ExplorerCore.Log("");
//ExplorerCore.Log("void Inspect(object obj)");
//ExplorerCore.Log(" inspects the provided object in a new window.");
//ExplorerCore.Log(" usage: Inspect(Camera.main);");
//ExplorerCore.Log("");
//ExplorerCore.Log("void Inspect(Type type)");
//ExplorerCore.Log(" attempts to inspect the provided type with static-only reflection.");
//ExplorerCore.Log(" usage: Inspect(typeof(Camera));");
}
}
}

View File

@ -1,311 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExplorerBeta;
using ExplorerBeta.UI;
using ExplorerBeta.UI.Main;
using ExplorerBeta.UI.Shared;
using ExplorerBeta.Unstrip.Resources;
using ExplorerBeta.Unstrip.Scenes;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
namespace Explorer.UI.Main.Pages
{
public class HomePage : BaseMenuPage
{
public override string Name => "Home";
private const float UPDATE_INTERVAL = 1f;
private float m_timeOfLastUpdate;
// ~~ Scene pane ~~
private Dropdown m_sceneDropdown;
private int m_currentSceneHandle;
private readonly Dictionary<string, int> m_sceneHandles = new Dictionary<string, int>();
private List<GameObject> m_currentObjectList = new List<GameObject>();
private int m_lastMaxIndex;
// todo
private GameObject m_selectedSceneObject;
private GameObject m_sceneListContent;
private readonly List<Text> m_sceneListTexts = new List<Text>();
// ~~ Inspector pane ~~ TODO
public override void Init()
{
ConstructMenu();
// Get DontDestroyOnLoad scene handle. I think it's always -12, but best to be safe.
var test = new GameObject();
GameObject.DontDestroyOnLoad(test);
StoreScenehandle(test.scene);
GameObject.Destroy(test);
RefreshActiveScenes();
}
public override void Update()
{
// TODO update inspector tabs
// update scene pane
if (Time.realtimeSinceStartup - m_timeOfLastUpdate < UPDATE_INTERVAL)
return;
m_timeOfLastUpdate = Time.realtimeSinceStartup;
RefreshActiveScenes();
if (!m_selectedSceneObject)
{
SetSceneObjectList(SceneUnstrip.GetRootGameObjects(m_currentSceneHandle));
}
else
{
// TODO refresh objects from inspected transform
}
}
private int StoreScenehandle(Scene scene)
{
if (!m_sceneHandles.ContainsKey(scene.name))
{
m_sceneHandles.Add(scene.name, scene.handle);
}
return scene.handle;
}
private int GetSceneHandle(string sceneName)
{
if (!m_sceneHandles.ContainsKey(sceneName))
return -1;
else
return m_sceneHandles[sceneName];
}
public void SetScene(string name)
{
var handle = GetSceneHandle(name);
if (handle == -1)
{
ExplorerCore.LogWarning($"Error: Could not get handle for scene '{name}'");
return;
}
m_currentSceneHandle = handle;
var rootObjs = SceneUnstrip.GetRootGameObjects(handle);
SetSceneObjectList(rootObjs);
}
private bool m_doneFirstSceneRefresh;
private void RefreshActiveScenes()
{
var activeScene = SceneManager.GetActiveScene().name;
var otherScenes = new List<string>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
var scene = SceneManager.GetSceneAt(i);
StoreScenehandle(scene);
if (m_doneFirstSceneRefresh || scene.name != activeScene)
otherScenes.Add(scene.name);
}
otherScenes.Add("DontDestroyOnLoad");
m_sceneDropdown.options.Clear();
if (!m_doneFirstSceneRefresh)
{
m_sceneDropdown.options.Add(new Dropdown.OptionData
{
text = activeScene
});
}
foreach (var scene in otherScenes)
{
m_sceneDropdown.options.Add(new Dropdown.OptionData
{
text = scene
});
}
if (!m_doneFirstSceneRefresh)
SetScene(activeScene);
m_doneFirstSceneRefresh = true;
}
private void SceneButtonClicked(int index)
{
var obj = m_currentObjectList[index];
ExplorerCore.Log("Clicked " + obj.name);
m_selectedSceneObject = obj;
// TODO ?
}
private void SetSceneObjectList(IEnumerable<GameObject> objects)
{
m_currentObjectList.Clear();
int index = 0;
foreach (var obj in objects)
{
m_currentObjectList.Add(obj);
if (index >= m_sceneListTexts.Count)
{
AddSceneButton();
}
m_sceneListTexts[index].text = obj.name;
var parent = m_sceneListTexts[index].transform.parent.gameObject;
if (!parent.activeSelf)
parent.SetActive(true);
index++;
}
var origIndex = index;
while (index < m_sceneListTexts.Count && index < m_lastMaxIndex)
{
var obj = m_sceneListTexts[index].transform.parent.gameObject;
if (obj.activeSelf)
obj.SetActive(false);
index++;
}
m_lastMaxIndex = origIndex;
}
#region UI Construction
private void ConstructMenu()
{
var parent = MainMenu.Instance.PageViewport;
Content = UIFactory.CreateHorizontalGroup(parent);
var mainGroup = Content.GetComponent<HorizontalLayoutGroup>();
mainGroup.padding.left = 3;
mainGroup.padding.right = 3;
mainGroup.padding.top = 3;
mainGroup.padding.bottom = 3;
mainGroup.spacing = 5;
mainGroup.childForceExpandHeight = true;
mainGroup.childForceExpandWidth = true;
mainGroup.childControlHeight = true;
mainGroup.childControlWidth = true;
var leftPaneObj = UIFactory.CreateVerticalGroup(Content, new Color(72f / 255f, 72f / 255f, 72f / 255f));
var leftLayout = leftPaneObj.AddComponent<LayoutElement>();
leftLayout.minWidth = 350;
leftLayout.flexibleWidth = 0;
var leftGroup = leftPaneObj.GetComponent<VerticalLayoutGroup>();
leftGroup.padding.left = 8;
leftGroup.padding.right = 8;
leftGroup.padding.top = 8;
leftGroup.padding.bottom = 8;
leftGroup.spacing = 5;
leftGroup.childControlWidth = true;
leftGroup.childControlHeight = true;
leftGroup.childForceExpandWidth = false;
leftGroup.childForceExpandHeight = true;
var rightPaneObj = UIFactory.CreateVerticalGroup(Content, new Color(72f / 255f, 72f / 255f, 72f / 255f));
var rightLayout = rightPaneObj.AddComponent<LayoutElement>();
rightLayout.flexibleWidth = 999999;
var rightGroup = rightPaneObj.GetComponent<VerticalLayoutGroup>();
rightGroup.childForceExpandHeight = true;
rightGroup.childForceExpandWidth = true;
rightGroup.childControlHeight = true;
rightGroup.childControlWidth = true;
ConstructScenePane(leftPaneObj);
}
private void ConstructScenePane(GameObject leftPane)
{
var activeSceneLabelObj = UIFactory.CreateLabel(leftPane, TextAnchor.UpperLeft);
var activeSceneLabel = activeSceneLabelObj.GetComponent<Text>();
activeSceneLabel.text = "Scene Explorer";
activeSceneLabel.fontSize = 25;
var activeSceneLayout = activeSceneLabelObj.AddComponent<LayoutElement>();
activeSceneLayout.minHeight = 30;
activeSceneLayout.flexibleHeight = 0;
var sceneDropdownObj = UIFactory.CreateDropdown(leftPane, out m_sceneDropdown);
var dropdownLayout = sceneDropdownObj.AddComponent<LayoutElement>();
dropdownLayout.minHeight = 40;
dropdownLayout.flexibleHeight = 0;
dropdownLayout.minWidth = 320;
dropdownLayout.flexibleWidth = 2;
#if CPP
m_sceneDropdown.onValueChanged.AddListener(new Action<int>((int val) => { SetSceneFromDropdown(val); }));
#else
m_sceneDropdown.onValueChanged.AddListener((int val) => { SetSceneFromDropdown(val); });
#endif
void SetSceneFromDropdown(int val)
{
var scene = m_sceneDropdown.options[val].text;
SetScene(scene);
}
var scrollTest = UIFactory.CreateScrollView(leftPane, out m_sceneListContent, new Color(0.15f, 0.15f, 0.15f, 1));
for (int i = 0; i < 50; i++)
{
AddSceneButton();
}
m_lastMaxIndex = 50;
}
private void AddSceneButton()
{
var obj = UIFactory.CreateButton(m_sceneListContent);
var btn = obj.GetComponent<Button>();
var colors = btn.colors;
colors.normalColor = new Color(0.15f, 0.15f, 0.15f, 1);
btn.colors = colors;
int thisIndex = m_sceneListTexts.Count();
#if CPP
btn.onClick.AddListener(new Action(() => { SceneButtonClicked(thisIndex); }));
#else
btn.onClick.AddListener(() => { SceneButtonClicked(thisIndex); });
#endif
var text = obj.GetComponentInChildren<Text>();
text.text = "button " + thisIndex;
text.alignment = TextAnchor.MiddleLeft;
m_sceneListTexts.Add(text);
}
// todo construct inspector pane
#endregion
}
}

View File

@ -1,18 +1,14 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using ExplorerBeta.Input;
using ExplorerBeta.Helpers;
using System.IO;
using System.Linq;
#if CPP
using ExplorerBeta.Unstrip.ImageConversion;
#endif
namespace ExplorerBeta.UI
namespace ExplorerBeta.UI.Main
{
// Handles dragging and resizing for the main explorer window.
@ -42,11 +38,11 @@ namespace ExplorerBeta.UI
public void Update()
{
var rawMousePos = InputManager.MousePosition;
Vector3 rawMousePos = InputManager.MousePosition;
ResizeTypes type;
var resizePos = Panel.InverseTransformPoint(rawMousePos);
var dragPos = DragableArea.InverseTransformPoint(rawMousePos);
Vector3 resizePos = Panel.InverseTransformPoint(rawMousePos);
Vector3 dragPos = DragableArea.InverseTransformPoint(rawMousePos);
if (WasHoveringResize)
{
@ -65,7 +61,9 @@ namespace ExplorerBeta.UI
{
type = GetResizeType(resizePos);
if (type != ResizeTypes.NONE)
{
OnBeginResize(type);
}
}
}
// If mouse still pressed from last frame
@ -104,7 +102,7 @@ namespace ExplorerBeta.UI
return;
}
#region DRAGGING
#region DRAGGING
public RectTransform DragableArea { get; set; }
public bool WasDragging { get; set; }
@ -118,11 +116,11 @@ namespace ExplorerBeta.UI
public void OnDrag()
{
var diff = InputManager.MousePosition - m_lastDragPosition;
Vector3 diff = InputManager.MousePosition - m_lastDragPosition;
m_lastDragPosition = InputManager.MousePosition;
var pos = Panel.localPosition;
var z = pos.z;
Vector3 pos = Panel.localPosition;
float z = pos.z;
pos += diff;
pos.z = z;
Panel.localPosition = pos;
@ -134,9 +132,9 @@ namespace ExplorerBeta.UI
UpdateResizeCache();
}
#endregion
#endregion
#region RESIZE
#region RESIZE
private const int RESIZE_THICKNESS = 10;
@ -161,14 +159,14 @@ namespace ExplorerBeta.UI
[Flags]
public enum ResizeTypes
{
NONE = 0,
Top = 1,
Left = 2,
Right = 4,
Bottom = 8,
TopLeft = Top | Left,
TopRight = Top | Right,
BottomLeft = Bottom | Left,
NONE = 0,
Top = 1,
Left = 2,
Right = 4,
Bottom = 8,
TopLeft = Top | Left,
TopRight = Top | Right,
BottomLeft = Bottom | Left,
BottomRight = Bottom | Right,
}
@ -182,9 +180,9 @@ namespace ExplorerBeta.UI
// to give a bit of buffer and make it easier to use.
// outer rect is the outer-most bounds of our resize area
var outer = new Rect(Panel.rect.x - halfThick,
Panel.rect.y - halfThick,
Panel.rect.width + dblThick,
Rect outer = new Rect(Panel.rect.x - halfThick,
Panel.rect.y - halfThick,
Panel.rect.width + dblThick,
Panel.rect.height + dblThick);
m_resizeRect = outer;
@ -213,14 +211,22 @@ namespace ExplorerBeta.UI
int mask = 0;
if (m_resizeMask[ResizeTypes.Top].Contains(mousePos))
{
mask |= (int)ResizeTypes.Top;
}
else if (m_resizeMask[ResizeTypes.Bottom].Contains(mousePos))
{
mask |= (int)ResizeTypes.Bottom;
}
if (m_resizeMask[ResizeTypes.Left].Contains(mousePos))
{
mask |= (int)ResizeTypes.Left;
}
else if (m_resizeMask[ResizeTypes.Right].Contains(mousePos))
{
mask |= (int)ResizeTypes.Right;
}
return (ResizeTypes)mask;
}
@ -228,7 +234,9 @@ namespace ExplorerBeta.UI
public void OnHoverResize(ResizeTypes resizeType)
{
if (WasHoveringResize && m_lastResizeHoverType == resizeType)
{
return;
}
// we are entering resize, or the resize type has changed.
@ -252,7 +260,7 @@ namespace ExplorerBeta.UI
iconRotation = 135f; break;
}
var rot = m_resizeCursorImage.transform.rotation;
Quaternion rot = m_resizeCursorImage.transform.rotation;
rot.eulerAngles = new Vector3(0, 0, iconRotation);
m_resizeCursorImage.transform.rotation = rot;
@ -263,9 +271,11 @@ namespace ExplorerBeta.UI
private void UpdateHoverImagePos()
{
if (!m_resizeCursorImage)
{
return;
}
var t = UIManager.CanvasRoot.GetComponent<RectTransform>();
RectTransform t = UIManager.CanvasRoot.GetComponent<RectTransform>();
m_resizeCursorImage.transform.localPosition = t.InverseTransformPoint(InputManager.MousePosition);
}
@ -284,35 +294,35 @@ namespace ExplorerBeta.UI
public void OnResize()
{
var mousePos = InputManager.MousePosition;
var diff = m_lastResizePos - (Vector2)mousePos;
Vector3 mousePos = InputManager.MousePosition;
Vector2 diff = m_lastResizePos - (Vector2)mousePos;
m_lastResizePos = mousePos;
var diffX = (float)((decimal)diff.x / Screen.width);
var diffY = (float)((decimal)diff.y / Screen.height);
float diffX = (float)((decimal)diff.x / Screen.width);
float diffY = (float)((decimal)diff.y / Screen.height);
if (m_currentResizeType.HasFlag(ResizeTypes.Left))
{
var anch = Panel.anchorMin;
Vector2 anch = Panel.anchorMin;
anch.x -= diffX;
Panel.anchorMin = anch;
}
else if (m_currentResizeType.HasFlag(ResizeTypes.Right))
{
var anch = Panel.anchorMax;
Vector2 anch = Panel.anchorMax;
anch.x -= diffX;
Panel.anchorMax = anch;
}
if (m_currentResizeType.HasFlag(ResizeTypes.Top))
{
var anch = Panel.anchorMax;
Vector2 anch = Panel.anchorMax;
anch.y -= diffY;
Panel.anchorMax = anch;
}
else if (m_currentResizeType.HasFlag(ResizeTypes.Bottom))
{
var anch = Panel.anchorMin;
Vector2 anch = Panel.anchorMin;
anch.y -= diffY;
Panel.anchorMin = anch;
}
@ -326,28 +336,28 @@ namespace ExplorerBeta.UI
private void LoadCursorImage()
{
var path = @"Mods\Explorer\cursor.png";
var data = File.ReadAllBytes(path);
string path = @"Mods\Explorer\cursor.png";
byte[] data = File.ReadAllBytes(path);
var tex = new Texture2D(32, 32);
Texture2D tex = new Texture2D(32, 32);
tex.LoadImage(data, false);
UnityEngine.Object.DontDestroyOnLoad(tex);
var sprite = UIManager.CreateSprite(tex);
Sprite sprite = UIManager.CreateSprite(tex);
UnityEngine.Object.DontDestroyOnLoad(sprite);
m_resizeCursorImage = new GameObject("ResizeCursorImage");
m_resizeCursorImage.transform.SetParent(UIManager.CanvasRoot.transform);
var image = m_resizeCursorImage.AddComponent<Image>();
Image image = m_resizeCursorImage.AddComponent<Image>();
image.sprite = sprite;
var rect = image.transform.GetComponent<RectTransform>();
RectTransform rect = image.transform.GetComponent<RectTransform>();
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 32);
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 32);
m_resizeCursorImage.SetActive(false);
}
#endregion
#endregion
}
}

View File

@ -0,0 +1,478 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ExplorerBeta.Helpers;
using ExplorerBeta.UI.Main.Inspectors;
using ExplorerBeta.UI.Shared;
using ExplorerBeta.Unstrip.Scenes;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
namespace ExplorerBeta.UI.Main
{
public class SceneExplorer
{
public static SceneExplorer Instance;
public SceneExplorer() { Instance = this; }
private const float UPDATE_INTERVAL = 1f;
private float m_timeOfLastSceneUpdate;
private bool m_doneFirstSceneRefresh;
private GameObject m_selectedSceneObject;
private int m_currentSceneHandle;
private int m_lastCount;
public PageHandler m_sceneListPageHandler;
private GameObject[] m_allSceneListObjects = new GameObject[0];
private readonly List<GameObject> m_sceneShortList = new List<GameObject>();
private readonly List<Text> m_sceneListTexts = new List<Text>();
private readonly List<bool> m_sceneListActiveStates = new List<bool>();
private GameObject m_sceneListCanvas;
private Dropdown m_sceneDropdown;
private Text m_scenePathText;
private GameObject m_mainInspectBtn;
private GameObject m_backButtonObj;
private readonly Dictionary<string, int> m_sceneHandles = new Dictionary<string, int>();
public void Init()
{
// Get DontDestroyOnLoad scene handle. I think it's always -12, but best to be safe.
GameObject test = new GameObject();
GameObject.DontDestroyOnLoad(test);
StoreScenehandle(test.scene);
GameObject.Destroy(test);
RefreshActiveScenes();
}
public void Update()
{
if (Time.realtimeSinceStartup - m_timeOfLastSceneUpdate < UPDATE_INTERVAL)
{
return;
}
RefreshActiveScenes();
if (!m_selectedSceneObject)
{
if (m_currentSceneHandle != -1)
{
SetSceneObjectList(SceneUnstrip.GetRootGameObjects(m_currentSceneHandle));
}
}
else
{
RefreshSelectedSceneObject();
}
}
private int StoreScenehandle(Scene scene)
{
if (!m_sceneHandles.ContainsKey(scene.name))
{
m_sceneHandles.Add(scene.name, scene.handle);
}
return scene.handle;
}
private int GetSceneHandle(string sceneName)
{
if (!m_sceneHandles.ContainsKey(sceneName))
{
return -1;
}
else
{
return m_sceneHandles[sceneName];
}
}
internal void OnSceneChange()
{
m_doneFirstSceneRefresh = false;
RefreshActiveScenes();
}
private void RefreshActiveScenes()
{
string mainActiveScene = SceneManager.GetActiveScene().name;
List<string> otherScenes = new List<string>();
List<int> validHandles = new List<int>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene scene = SceneManager.GetSceneAt(i);
if (scene == null || string.IsNullOrEmpty(scene.name))
{
continue;
}
StoreScenehandle(scene);
validHandles.Add(scene.handle);
if (m_doneFirstSceneRefresh || scene.name != mainActiveScene)
{
otherScenes.Add(scene.name);
}
}
otherScenes.Add("DontDestroyOnLoad");
validHandles.Add(GetSceneHandle("DontDestroyOnLoad"));
m_sceneDropdown.options.Clear();
if (!m_doneFirstSceneRefresh)
{
m_sceneDropdown.options.Add(new Dropdown.OptionData
{
text = mainActiveScene
});
}
foreach (string scene in otherScenes)
{
m_sceneDropdown.options.Add(new Dropdown.OptionData
{
text = scene
});
}
if (!m_doneFirstSceneRefresh || !validHandles.Contains(m_currentSceneHandle))
{
SetScene(mainActiveScene);
}
m_doneFirstSceneRefresh = true;
}
public void SetScene(string name) => SetScene(GetSceneHandle(name));
public void SetScene(int handle)
{
if (handle == -1)
{
return;
}
m_currentSceneHandle = handle;
GameObject[] rootObjs = SceneUnstrip.GetRootGameObjects(handle);
SetSceneObjectList(rootObjs);
m_selectedSceneObject = null;
if (m_backButtonObj.activeSelf)
{
m_backButtonObj.SetActive(false);
m_mainInspectBtn.SetActive(false);
}
m_scenePathText.text = "Scene root:";
//m_scenePathText.ForceMeshUpdate();
}
public void SetSceneListObject(GameObject obj)
{
m_scenePathText.text = obj.name;
//m_scenePathText.ForceMeshUpdate();
m_selectedSceneObject = obj;
RefreshSelectedSceneObject();
if (!m_backButtonObj.activeSelf)
{
m_backButtonObj.SetActive(true);
m_mainInspectBtn.SetActive(true);
}
}
private void SceneListObjectClicked(int index)
{
if (index >= m_sceneShortList.Count || !m_sceneShortList[index])
{
return;
}
SetSceneListObject(m_sceneShortList[index]);
}
private void OnSceneListPageTurn()
{
SetSceneObjectList(m_allSceneListObjects);
}
private void RefreshSelectedSceneObject()
{
GameObject[] list = new GameObject[m_selectedSceneObject.transform.childCount];
for (int i = 0; i < m_selectedSceneObject.transform.childCount; i++)
{
list[i] = m_selectedSceneObject.transform.GetChild(i).gameObject;
}
SetSceneObjectList(list);
}
private void SetSceneObjectList(GameObject[] objects)
{
m_timeOfLastSceneUpdate = Time.realtimeSinceStartup;
m_allSceneListObjects = objects;
m_sceneListPageHandler.ListCount = objects.Length;
int startIndex = m_sceneListPageHandler.IndexOffset;
int newCount = 0;
for (int i = 0; i < m_sceneListPageHandler.ItemsPerPage; i++)
{
newCount++;
// still updating from gameobject list.
// check first if the reference has changed for this index.
if (i + startIndex >= objects.Length)
{
// execeeded actual list, but not yet reached previous limit.
// disable remaining buttons.
if (i > m_lastCount || i >= m_sceneListTexts.Count)
{
break;
}
GameObject obj = m_sceneListTexts[i].transform.parent.parent.gameObject;
if (obj.activeSelf)
{
obj.SetActive(false);
}
}
else
{
GameObject obj = objects[i + startIndex];
if (i >= m_sceneShortList.Count)
{
m_sceneShortList.Add(obj);
if (i >= m_sceneListTexts.Count)
{
AddSceneButton();
m_sceneListActiveStates.Add(obj.activeSelf);
}
}
else
{
m_sceneShortList[i] = obj;
}
m_sceneListTexts[i].text = obj.name;
m_sceneListTexts[i].color = obj.activeSelf ? Color.green : Color.red;
GameObject parent = m_sceneListTexts[i].transform.parent.parent.gameObject;
if (!parent.activeSelf)
{
parent.SetActive(true);
}
}
}
m_lastCount = newCount;
}
#region SCENE PANE
public void ConstructScenePane()
{
GameObject leftPane = UIFactory.CreateVerticalGroup(HomePage.Instance.Content, new Color(72f / 255f, 72f / 255f, 72f / 255f));
LayoutElement leftLayout = leftPane.AddComponent<LayoutElement>();
leftLayout.minWidth = 350;
leftLayout.flexibleWidth = 0;
VerticalLayoutGroup leftGroup = leftPane.GetComponent<VerticalLayoutGroup>();
leftGroup.padding.left = 8;
leftGroup.padding.right = 8;
leftGroup.padding.top = 8;
leftGroup.padding.bottom = 8;
leftGroup.spacing = 5;
leftGroup.childControlWidth = true;
leftGroup.childControlHeight = true;
leftGroup.childForceExpandWidth = true;
leftGroup.childForceExpandHeight = true;
GameObject titleObj = UIFactory.CreateLabel(leftPane, TextAnchor.UpperLeft);
Text titleLabel = titleObj.GetComponent<Text>();
titleLabel.text = "Scene Explorer";
titleLabel.fontSize = 20;
LayoutElement titleLayout = titleObj.AddComponent<LayoutElement>();
titleLayout.minHeight = 30;
titleLayout.flexibleHeight = 0;
GameObject sceneDropdownObj = UIFactory.CreateDropdown(leftPane, out m_sceneDropdown);
LayoutElement dropdownLayout = sceneDropdownObj.AddComponent<LayoutElement>();
dropdownLayout.minHeight = 40;
dropdownLayout.flexibleHeight = 0;
dropdownLayout.minWidth = 320;
dropdownLayout.flexibleWidth = 2;
#if CPP
m_sceneDropdown.onValueChanged.AddListener(new Action<int>((int val) => { SetSceneFromDropdown(val); }));
#else
m_sceneDropdown.onValueChanged.AddListener((int val) => { SetSceneFromDropdown(val); });
#endif
void SetSceneFromDropdown(int val)
{
string scene = m_sceneDropdown.options[val].text;
SetScene(scene);
}
GameObject scenePathGroupObj = UIFactory.CreateHorizontalGroup(leftPane, new Color(1, 1, 1, 0f));
HorizontalLayoutGroup scenePathGroup = scenePathGroupObj.GetComponent<HorizontalLayoutGroup>();
scenePathGroup.childControlHeight = true;
scenePathGroup.childControlWidth = true;
scenePathGroup.childForceExpandHeight = true;
scenePathGroup.childForceExpandWidth = true;
scenePathGroup.spacing = 5;
LayoutElement scenePathLayout = scenePathGroupObj.AddComponent<LayoutElement>();
scenePathLayout.minHeight = 20;
scenePathLayout.minWidth = 335;
scenePathLayout.flexibleWidth = 0;
m_backButtonObj = UIFactory.CreateButton(scenePathGroupObj);
Text backButtonText = m_backButtonObj.GetComponentInChildren<Text>();
backButtonText.text = "<";
LayoutElement backButtonLayout = m_backButtonObj.AddComponent<LayoutElement>();
backButtonLayout.minWidth = 40;
backButtonLayout.flexibleWidth = 0;
Button backButton = m_backButtonObj.GetComponent<Button>();
#if CPP
backButton.onClick.AddListener(new Action(() => { SetSceneObjectParent(); }));
#else
backButton.onClick.AddListener(() => { SetSceneObjectParent(); });
#endif
void SetSceneObjectParent()
{
if (!m_selectedSceneObject || !m_selectedSceneObject.transform.parent)
{
m_selectedSceneObject = null;
SetScene(m_currentSceneHandle);
}
else
{
SetSceneListObject(m_selectedSceneObject.transform.parent.gameObject);
}
}
GameObject scenePathLabel = UIFactory.CreateHorizontalGroup(scenePathGroupObj);
Image image = scenePathLabel.GetComponent<Image>();
image.color = Color.white;
LayoutElement scenePathLabelLayout = scenePathLabel.AddComponent<LayoutElement>();
scenePathLabelLayout.minWidth = 210;
scenePathLabelLayout.minHeight = 20;
scenePathLabelLayout.flexibleHeight = 0;
scenePathLabelLayout.flexibleWidth = 120;
scenePathLabel.AddComponent<Mask>().showMaskGraphic = false;
GameObject scenePathLabelText = UIFactory.CreateLabel(scenePathLabel, TextAnchor.MiddleLeft);
m_scenePathText = scenePathLabelText.GetComponent<Text>();
m_scenePathText.text = "Scene root:";
m_scenePathText.fontSize = 15;
m_scenePathText.horizontalOverflow = HorizontalWrapMode.Overflow;
LayoutElement textLayout = scenePathLabelText.gameObject.AddComponent<LayoutElement>();
textLayout.minWidth = 210;
textLayout.flexibleWidth = 120;
textLayout.minHeight = 20;
textLayout.flexibleHeight = 0;
m_mainInspectBtn = UIFactory.CreateButton(scenePathGroupObj);
Text inspectButtonText = m_mainInspectBtn.GetComponentInChildren<Text>();
inspectButtonText.text = "Inspect";
LayoutElement inspectButtonLayout = m_mainInspectBtn.AddComponent<LayoutElement>();
inspectButtonLayout.minWidth = 65;
inspectButtonLayout.flexibleWidth = 0;
Button inspectButton = m_mainInspectBtn.GetComponent<Button>();
inspectButton.onClick.AddListener(new Action(() => { InspectorManager.Instance.Inspect(m_selectedSceneObject); }));
GameObject scrollObj = UIFactory.CreateScrollView(leftPane, out m_sceneListCanvas, new Color(0.15f, 0.15f, 0.15f, 1));
Scrollbar scroll = scrollObj.transform.Find("Scrollbar Vertical").GetComponent<Scrollbar>();
ColorBlock colors = scroll.colors;
colors.normalColor = new Color(0.6f, 0.6f, 0.6f, 1.0f);
scroll.colors = colors;
VerticalLayoutGroup sceneGroup = m_sceneListCanvas.GetComponent<VerticalLayoutGroup>();
sceneGroup.childControlHeight = true;
sceneGroup.spacing = 2;
m_sceneListPageHandler = new PageHandler();
m_sceneListPageHandler.ConstructUI(leftPane);
m_sceneListPageHandler.OnPageChanged += OnSceneListPageTurn;
}
private void AddSceneButton()
{
int thisIndex = m_sceneListTexts.Count();
GameObject btnGroupObj = UIFactory.CreateHorizontalGroup(m_sceneListCanvas, new Color(0.15f, 0.15f, 0.15f));
HorizontalLayoutGroup btnGroup = btnGroupObj.GetComponent<HorizontalLayoutGroup>();
btnGroup.childForceExpandWidth = true;
btnGroup.childControlWidth = true;
btnGroup.childForceExpandHeight = false;
btnGroup.childControlHeight = true;
LayoutElement btnLayout = btnGroupObj.AddComponent<LayoutElement>();
btnLayout.flexibleWidth = 320;
btnLayout.minHeight = 25;
btnLayout.flexibleHeight = 0;
btnGroupObj.AddComponent<Mask>();
GameObject mainButtonObj = UIFactory.CreateButton(btnGroupObj);
LayoutElement mainBtnLayout = mainButtonObj.AddComponent<LayoutElement>();
mainBtnLayout.minHeight = 25;
mainBtnLayout.flexibleHeight = 0;
mainBtnLayout.minWidth = 240;
mainBtnLayout.flexibleWidth = 0;
Button mainBtn = mainButtonObj.GetComponent<Button>();
ColorBlock mainColors = mainBtn.colors;
mainColors.normalColor = new Color(0, 0, 0, 0);
mainColors.highlightedColor = new Color(0.3f, 0.3f, 0.3f, 1);
mainBtn.colors = mainColors;
#if CPP
mainBtn.onClick.AddListener(new Action(() => { SceneListObjectClicked(thisIndex); }));
#else
btn.onClick.AddListener(() => { SceneButtonClicked(thisIndex); });
#endif
Text mainText = mainButtonObj.GetComponentInChildren<Text>();
mainText.alignment = TextAnchor.MiddleLeft;
m_sceneListTexts.Add(mainText);
GameObject inspectBtnObj = UIFactory.CreateButton(btnGroupObj);
LayoutElement inspectBtnLayout = inspectBtnObj.AddComponent<LayoutElement>();
inspectBtnLayout.minWidth = 60;
inspectBtnLayout.flexibleWidth = 0;
inspectBtnLayout.minHeight = 25;
inspectBtnLayout.flexibleHeight = 0;
Text inspectText = inspectBtnObj.GetComponentInChildren<Text>();
inspectText.text = "Inspect";
inspectText.color = Color.white;
Button inspectBtn = inspectBtnObj.GetComponent<Button>();
ColorBlock inspectColors = inspectBtn.colors;
inspectColors.normalColor = new Color(1, 1, 1, 0.05f);
inspectBtn.colors = inspectColors;
inspectBtn.onClick.AddListener(new Action(() => { InspectorManager.Instance.Inspect(m_sceneShortList[thisIndex]); }));
}
#endregion
}
}

View File

@ -1,11 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Explorer.UI.Main.Pages
namespace ExplorerBeta.UI.Main
{
public class SearchPage : BaseMenuPage
public class SearchPage : MainMenu.Page
{
public override string Name => "Search";

View File

@ -1,11 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExplorerBeta.Config;
using UnityEngine;
using UnityEngine.UI;
using ExplorerBeta.Config;
namespace ExplorerBeta.UI.Shared
{
@ -17,24 +13,45 @@ namespace ExplorerBeta.UI.Shared
public class PageHandler
{
public PageHandler(int listCount)
public PageHandler()
{
ListCount = listCount;
m_itemsPerPage = ModConfig.Instance?.Default_Page_Limit ?? 20;
}
// callback for when the page is turned
public event Action OnPageChanged;
// set and maintained by owner of list
public int ListCount { get; set; }
// For now this is just set when the PageHandler is created, based on config.
// At some point I might make it possible to change this after creation again.
private readonly int m_itemsPerPage;
public int ItemsPerPage => m_itemsPerPage;
private int m_itemsPerPage;
private int m_currentPage;
private GameObject m_pageUIHolder;
private Text m_currentPageLabel;
// set and maintained by owner of list
private int m_listCount;
public int ListCount
{
get => m_listCount;
set
{
m_listCount = value;
if (LastPage <= 0 && m_pageUIHolder.activeSelf)
{
m_pageUIHolder.SetActive(false);
}
else if (LastPage > 0 && !m_pageUIHolder.activeSelf)
{
m_pageUIHolder.SetActive(true);
}
RefreshUI();
}
}
// the last page index (not using "index" to avoid confusion with next property)
public int LastPage => (int)Math.Ceiling(ListCount / (decimal)m_itemsPerPage) - 1;
@ -79,83 +96,74 @@ namespace ExplorerBeta.UI.Shared
#region UI
private GameObject m_pageUIHolder;
private Text m_currentPageLabel;
public void Show() => m_pageUIHolder?.SetActive(true);
public void Hide() => m_pageUIHolder?.SetActive(false);
public void ConstructUI(GameObject parent)
{
m_pageUIHolder = UIFactory.CreateHorizontalGroup(parent);
var image = m_pageUIHolder.GetComponent<Image>();
image.color = new Color(0f, 0f, 0f, 0f);
var parentGroup = m_pageUIHolder.GetComponent<HorizontalLayoutGroup>();
parentGroup.childForceExpandHeight = true;
parentGroup.childForceExpandWidth = false;
parentGroup.childControlWidth = true;
parentGroup.childControlHeight = true;
var parentLayout = m_pageUIHolder.AddComponent<LayoutElement>();
parentLayout.minHeight = 45;
parentLayout.preferredHeight = 45;
parentLayout.flexibleHeight = 3;
parentLayout.minWidth = 300;
parentLayout.preferredWidth = 300;
parentLayout.flexibleWidth = 0;
var leftBtnObj = UIFactory.CreateButton(m_pageUIHolder);
var leftBtn = leftBtnObj.GetComponent<Button>();
#if CPP
leftBtn.onClick.AddListener(new Action(() => { TurnPage(Turn.Left); }));
#else
leftBtn.onClick.AddListener(() => { TurnPage(Turn.Left); });
#endif
var leftBtnText = leftBtnObj.GetComponentInChildren<Text>();
leftBtnText.text = "<";
var leftBtnLayout = leftBtnObj.AddComponent<LayoutElement>();
leftBtnLayout.flexibleHeight = 0;
leftBtnLayout.flexibleWidth = 0;
leftBtnLayout.minWidth = 30;
leftBtnLayout.preferredWidth = 30;
leftBtnLayout.minHeight = 30;
leftBtnLayout.preferredHeight = 30;
var labelObj = UIFactory.CreateLabel(m_pageUIHolder, TextAnchor.MiddleCenter);
m_currentPageLabel = labelObj.GetComponent<Text>();
m_currentPageLabel.text = "Page 1 / TODO";
var textLayout = labelObj.AddComponent<LayoutElement>();
textLayout.flexibleWidth = 1.5f;
textLayout.preferredWidth = 200;
var rightBtnObj = UIFactory.CreateButton(m_pageUIHolder);
var rightBtn = rightBtnObj.GetComponent<Button>();
#if CPP
rightBtn.onClick.AddListener(new Action(() => { TurnPage(Turn.Right); }));
#else
rightBtn.onClick.AddListener(() => { TurnPage(Turn.Right); });
#endif
var rightBtnText = rightBtnObj.GetComponentInChildren<Text>();
rightBtnText.text = ">";
var rightBtnLayout = rightBtnObj.AddComponent<LayoutElement>();
rightBtnLayout.flexibleHeight = 0;
rightBtnLayout.flexibleWidth = 0;
rightBtnLayout.preferredWidth = 30;
rightBtnLayout.minWidth = 30;
rightBtnLayout.minHeight = 30;
rightBtnLayout.preferredHeight = 30;
RefreshUI();
}
public void RefreshUI()
{
m_currentPageLabel.text = $"Page {m_currentPage + 1} / {LastPage + 1}";
}
#endregion
public void ConstructUI(GameObject parent)
{
m_pageUIHolder = UIFactory.CreateHorizontalGroup(parent);
Image image = m_pageUIHolder.GetComponent<Image>();
image.color = new Color(0f, 0f, 0f, 0f);
HorizontalLayoutGroup parentGroup = m_pageUIHolder.GetComponent<HorizontalLayoutGroup>();
parentGroup.childForceExpandHeight = true;
parentGroup.childForceExpandWidth = false;
parentGroup.childControlWidth = true;
parentGroup.childControlHeight = true;
LayoutElement parentLayout = m_pageUIHolder.AddComponent<LayoutElement>();
parentLayout.minHeight = 20;
parentLayout.flexibleHeight = 0;
parentLayout.minWidth = 290;
parentLayout.flexibleWidth = 30;
GameObject leftBtnObj = UIFactory.CreateButton(m_pageUIHolder);
Button leftBtn = leftBtnObj.GetComponent<Button>();
#if CPP
leftBtn.onClick.AddListener(new Action(() => { TurnPage(Turn.Left); }));
#else
leftBtn.onClick.AddListener(() => { TurnPage(Turn.Left); });
#endif
Text leftBtnText = leftBtnObj.GetComponentInChildren<Text>();
leftBtnText.text = "<";
LayoutElement leftBtnLayout = leftBtnObj.AddComponent<LayoutElement>();
leftBtnLayout.flexibleHeight = 0;
leftBtnLayout.flexibleWidth = 0;
leftBtnLayout.minWidth = 50;
leftBtnLayout.minHeight = 20;
GameObject labelObj = UIFactory.CreateLabel(m_pageUIHolder, TextAnchor.MiddleCenter);
m_currentPageLabel = labelObj.GetComponent<Text>();
m_currentPageLabel.text = "Page 1 / TODO";
LayoutElement textLayout = labelObj.AddComponent<LayoutElement>();
textLayout.flexibleWidth = 1.5f;
textLayout.preferredWidth = 200;
GameObject rightBtnObj = UIFactory.CreateButton(m_pageUIHolder);
Button rightBtn = rightBtnObj.GetComponent<Button>();
#if CPP
rightBtn.onClick.AddListener(new Action(() => { TurnPage(Turn.Right); }));
#else
rightBtn.onClick.AddListener(() => { TurnPage(Turn.Right); });
#endif
Text rightBtnText = rightBtnObj.GetComponentInChildren<Text>();
rightBtnText.text = ">";
LayoutElement rightBtnLayout = rightBtnObj.AddComponent<LayoutElement>();
rightBtnLayout.flexibleHeight = 0;
rightBtnLayout.flexibleWidth = 0;
rightBtnLayout.minWidth = 50;
rightBtnLayout.minHeight = 20;
ListCount = 0;
}
#endregion
}
}

View File

@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ExplorerBeta.UI.Shared
namespace ExplorerBeta.UI.Shared
{
public class Syntax
{

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExplorerBeta.Input;
using ExplorerBeta.UI.Main;
using ExplorerBeta.UI.Shared;
using ExplorerBeta.UI.Main;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace ExplorerBeta.UI
{
public static class UIManager
@ -25,7 +19,7 @@ namespace ExplorerBeta.UI
// Create submodules
new MainMenu();
// Force refresh of anchors (?)
// Force refresh of anchors
Canvas.ForceUpdateCanvases();
CanvasRoot.SetActive(false);
@ -40,7 +34,7 @@ namespace ExplorerBeta.UI
private static GameObject CreateRootCanvas()
{
var rootObj = new GameObject("ExplorerCanvas");
GameObject rootObj = new GameObject("ExplorerCanvas");
UnityEngine.Object.DontDestroyOnLoad(rootObj);
rootObj.layer = 5;
@ -51,12 +45,13 @@ namespace ExplorerBeta.UI
InputModule = rootObj.AddComponent<StandaloneInputModule>();
InputModule.ActivateModule();
var canvas = rootObj.AddComponent<Canvas>();
Canvas canvas = rootObj.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceCamera;
canvas.referencePixelsPerUnit = 100;
canvas.sortingOrder = 999;
canvas.pixelPerfect = false;
var scaler = rootObj.AddComponent<CanvasScaler>();
CanvasScaler scaler = rootObj.AddComponent<CanvasScaler>();
scaler.referenceResolution = new Vector2(1920, 1080);
scaler.screenMatchMode = CanvasScaler.ScreenMatchMode.Expand;
@ -81,7 +76,7 @@ namespace ExplorerBeta.UI
#if CPP
if (InputModule.m_InputPointerEvent != null)
{
var evt = InputModule.m_InputPointerEvent;
PointerEventData evt = InputModule.m_InputPointerEvent;
if (!evt.eligibleForClick && evt.selectedObject)
{
evt.eligibleForClick = true;
@ -99,16 +94,19 @@ namespace ExplorerBeta.UI
public static void OnSceneChange()
{
// todo
SceneExplorer.Instance?.OnSceneChange();
}
public static Sprite CreateSprite(Texture2D tex, Rect size = default)
{
#if CPP
var pivot = Vector2.zero;
var border = Vector4.zero;
Vector2 pivot = Vector2.zero;
Vector4 border = Vector4.zero;
if (size == default)
{
size = new Rect(0, 0, tex.width, tex.height);
}
return Sprite.CreateSprite_Injected(tex, ref size, ref pivot, 100f, 0u, SpriteMeshType.Tight, ref border, false);
#else
@ -118,13 +116,13 @@ namespace ExplorerBeta.UI
public static Texture2D MakeSolidTexture(Color color, int width, int height)
{
var pixels = new Color[width * height];
Color[] pixels = new Color[width * height];
for (int i = 0; i < pixels.Length; i++)
{
pixels[i] = color;
}
var tex = new Texture2D(width, height);
Texture2D tex = new Texture2D(width, height);
tex.SetPixels(pixels);
tex.Apply();

View File

@ -1,18 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine;
namespace Explorer.Unstrip.ColorUtility
namespace ExplorerBeta.Unstrip.ColorUtility
{
public static class ColorUtilityUnstrip
{
public static string ToHex(this Color color)
{
var r = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255);
var g = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255);
var b = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255);
byte r = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255);
byte g = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255);
byte b = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255);
return $"{r:X2}{g:X2}{b:X2}";
}

View File

@ -1,15 +1,9 @@
#if CPP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnhollowerBaseLib;
using UnityEngine;
using System.IO;
using ExplorerBeta.Helpers;
using System.Runtime.InteropServices;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using UnhollowerBaseLib;
using UnityEngine;
namespace ExplorerBeta.Unstrip.ImageConversion
{
@ -21,7 +15,7 @@ namespace ExplorerBeta.Unstrip.ImageConversion
public static byte[] EncodeToPNG(this Texture2D tex)
{
var data = ICallHelper.GetICall<d_EncodeToPNG>("UnityEngine.ImageConversion::EncodeToPNG")
byte[] data = ICallHelper.GetICall<d_EncodeToPNG>("UnityEngine.ImageConversion::EncodeToPNG")
.Invoke(tex.Pointer);
// The Il2Cpp EncodeToPNG() method does return System.Byte[],
@ -31,7 +25,7 @@ namespace ExplorerBeta.Unstrip.ImageConversion
byte[] safeData = new byte[data.Length];
for (int i = 0; i < data.Length; i++)
{
safeData[i] = (byte)data[i];
safeData[i] = (byte)data[i];
}
return safeData;
@ -43,13 +37,13 @@ namespace ExplorerBeta.Unstrip.ImageConversion
public static bool LoadImage(this Texture2D tex, byte[] data, bool markNonReadable)
{
var il2cppArray = new Il2CppStructArray<byte>(data.Length);
Il2CppStructArray<byte> il2cppArray = new Il2CppStructArray<byte>(data.Length);
for (int i = 0; i < data.Length; i++)
{
il2cppArray[i] = data[i];
}
var ret = ICallHelper.GetICall<d_LoadImage>("UnityEngine.ImageConversion::LoadImage")
bool ret = ICallHelper.GetICall<d_LoadImage>("UnityEngine.ImageConversion::LoadImage")
.Invoke(tex.Pointer, il2cppArray.Pointer, markNonReadable);
return ret;
@ -64,7 +58,7 @@ namespace ExplorerBeta.Unstrip.ImageConversion
return false;
}
var data = File.ReadAllBytes(filePath);
byte[] data = File.ReadAllBytes(filePath);
return tex.LoadImage(data, markNonReadable);
}
}

View File

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using ExplorerBeta.Helpers;
#if CPP
using UnhollowerBaseLib;
@ -17,7 +13,7 @@ namespace ExplorerBeta.Unstrip.LayerMasks
public static string LayerToName(int layer)
{
var iCall = ICallHelper.GetICall<d_LayerToName>("UnityEngine.LayerMask::LayerToName");
d_LayerToName iCall = ICallHelper.GetICall<d_LayerToName>("UnityEngine.LayerMask::LayerToName");
return IL2CPP.Il2CppStringToManaged(iCall.Invoke(layer));
}
#else

View File

@ -1,9 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExplorerBeta.Helpers;
using UnityEngine;
#if CPP
using UnhollowerBaseLib;
#endif
@ -17,12 +13,12 @@ namespace ExplorerBeta.Unstrip.Resources
public static UnityEngine.Object[] FindObjectsOfTypeAll(Il2CppSystem.Type type)
{
var arrayPtr = ICallHelper.GetICall<d_FindObjectsOfTypeAll>("UnityEngine.Resources::FindObjectsOfTypeAll")
IntPtr arrayPtr = ICallHelper.GetICall<d_FindObjectsOfTypeAll>("UnityEngine.Resources::FindObjectsOfTypeAll")
.Invoke(type.Pointer);
var array = new Il2CppReferenceArray<UnityEngine.Object>(arrayPtr);
Il2CppReferenceArray<UnityEngine.Object> array = new Il2CppReferenceArray<UnityEngine.Object>(arrayPtr);
var ret = new UnityEngine.Object[array.Length];
UnityEngine.Object[] ret = new UnityEngine.Object[array.Length];
for (int i = 0; i < array.Length; i++)
{

View File

@ -1,10 +1,6 @@
#if CPP
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExplorerBeta.Helpers;
using UnhollowerBaseLib;
using UnityEngine;
using UnityEngine.SceneManagement;
@ -21,11 +17,13 @@ namespace ExplorerBeta.Unstrip.Scenes
public static GameObject[] GetRootGameObjects(int handle)
{
if (handle == -1)
{
return new GameObject[0];
}
var list = new Il2CppSystem.Collections.Generic.List<GameObject>(GetRootCount(handle));
Il2CppSystem.Collections.Generic.List<GameObject> list = new Il2CppSystem.Collections.Generic.List<GameObject>(GetRootCount(handle));
var iCall = ICallHelper.GetICall<d_GetRootGameObjects>("UnityEngine.SceneManagement.Scene::GetRootGameObjectsInternal");
d_GetRootGameObjects iCall = ICallHelper.GetICall<d_GetRootGameObjects>("UnityEngine.SceneManagement.Scene::GetRootGameObjectsInternal");
iCall.Invoke(handle, list.Pointer);
@ -40,7 +38,7 @@ namespace ExplorerBeta.Unstrip.Scenes
public static int GetRootCount(int handle)
{
var iCall = ICallHelper.GetICall<GetRootCountInternal_delegate>("UnityEngine.SceneManagement.Scene::GetRootCountInternal");
GetRootCountInternal_delegate iCall = ICallHelper.GetICall<GetRootCountInternal_delegate>("UnityEngine.SceneManagement.Scene::GetRootCountInternal");
return iCall.Invoke(handle);
}
}