Implement Clipboard and Notifications, misc cleanups

This commit is contained in:
Sinai 2022-01-18 20:19:20 +11:00
parent c79223f537
commit ea7b91f7fd
30 changed files with 518 additions and 333 deletions

View File

@ -603,7 +603,7 @@ If the game was built with Unity's stubbed netstandard 2.0 runtime, you can fix
} }
} }
private static readonly Dictionary<string, string> helpDict = new Dictionary<string, string>(); private static readonly Dictionary<string, string> helpDict = new();
public static void SetupHelpInteraction() public static void SetupHelpInteraction()
{ {
@ -658,15 +658,17 @@ var x = 5;
++x; ++x;
/* The following helpers are available in REPL mode: /* The following helpers are available in REPL mode:
* GetUsing(); - prints the current using directives to the console log
* GetVars(); - prints the names and values of the REPL variables you have defined
* GetClasses(); - prints the names and members of the classes you have defined
* Log(obj); - prints a message to the console log
* CurrentTarget; - System.Object, the target of the active Inspector tab * CurrentTarget; - System.Object, the target of the active Inspector tab
* AllTargets; - System.Object[], the targets of all Inspector tabs * AllTargets; - System.Object[], the targets of all Inspector tabs
* Log(obj); - prints a message to the console log
* Inspect(obj); - inspect the object with the Inspector * Inspect(obj); - inspect the object with the Inspector
* Inspect(someType); - inspect a Type with static reflection * Inspect(someType); - inspect a Type with static reflection
* Start(enumerator); - starts the IEnumerator as a Coroutine * Start(enumerator); - starts the IEnumerator as a Coroutine
* Copy(obj); - copies the object to the UnityExplorer Clipboard
* Paste(); - System.Object, the contents of the Clipboard.
* GetUsing(); - prints the current using directives to the console log
* GetVars(); - prints the names and values of the REPL variables you have defined
* GetClasses(); - prints the names and members of the classes you have defined
* help; - the default REPL help command, contains additional helpers. * help; - the default REPL help command, contains additional helpers.
*/"; */";

View File

@ -6,40 +6,39 @@ using System.Linq;
using System.Text; using System.Text;
using UnityEngine; using UnityEngine;
using UnityExplorer.Runtime; using UnityExplorer.Runtime;
using UnityExplorer.UI.Panels;
using UniverseLib; using UniverseLib;
namespace UnityExplorer.CSConsole namespace UnityExplorer.CSConsole
{ {
public class ScriptInteraction : InteractiveBase public class ScriptInteraction : InteractiveBase
{ {
public static object CurrentTarget
=> InspectorManager.ActiveInspector?.Target;
public static object[] AllTargets
=> InspectorManager.Inspectors.Select(it => it.Target).ToArray();
public static void Log(object message) public static void Log(object message)
{ => ExplorerCore.Log(message);
ExplorerCore.Log(message);
}
public static object CurrentTarget => InspectorManager.ActiveInspector?.Target;
public static object[] AllTargets => InspectorManager.Inspectors.Select(it => it.Target).ToArray();
public static void Inspect(object obj) public static void Inspect(object obj)
{ => InspectorManager.Inspect(obj);
InspectorManager.Inspect(obj);
}
public static void Inspect(Type type) public static void Inspect(Type type)
{ => InspectorManager.Inspect(type);
InspectorManager.Inspect(type);
}
public static void Start(IEnumerator ienumerator) public static void Start(IEnumerator ienumerator)
{ => RuntimeProvider.Instance.StartCoroutine(ienumerator);
RuntimeProvider.Instance.StartCoroutine(ienumerator);
} public static void Copy(object obj)
=> ClipboardPanel.Copy(obj);
public static object Paste()
=> ClipboardPanel.Current;
public static void GetUsing() public static void GetUsing()
{ => Log(Evaluator.GetUsing());
Log(Evaluator.GetUsing());
}
public static void GetVars() public static void GetVars()
{ {

View File

@ -44,6 +44,6 @@ namespace UnityExplorer.CacheObject
RefConfigElement.BoxedValue = value; RefConfigElement.BoxedValue = value;
} }
protected override bool SetCellEvaluateState(CacheObjectCell cell) => false; protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell) => true;
} }
} }

View File

@ -92,10 +92,6 @@ namespace UnityExplorer.CacheObject
} }
protected override bool SetCellEvaluateState(CacheObjectCell cell) protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell) => true;
{
// not needed
return false;
}
} }
} }

View File

@ -13,7 +13,7 @@ namespace UnityExplorer.CacheObject
public override bool ShouldAutoEvaluate => true; public override bool ShouldAutoEvaluate => true;
public override bool HasArguments => false; public override bool HasArguments => false;
public override bool CanWrite => Owner.CanWrite; public override bool CanWrite => Owner?.CanWrite ?? false;
public void SetListOwner(InteractiveList list, int listIndex) public void SetListOwner(InteractiveList list, int listIndex)
{ {
@ -37,11 +37,6 @@ namespace UnityExplorer.CacheObject
(Owner as InteractiveList).TrySetValueToIndex(value, this.ListIndex); (Owner as InteractiveList).TrySetValueToIndex(value, this.ListIndex);
} }
protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell) => true;
protected override bool SetCellEvaluateState(CacheObjectCell cell)
{
// not needed
return false;
}
} }
} }

View File

@ -95,7 +95,7 @@ namespace UnityExplorer.CacheObject
private static readonly Color evalEnabledColor = new Color(0.15f, 0.25f, 0.15f); private static readonly Color evalEnabledColor = new Color(0.15f, 0.25f, 0.15f);
private static readonly Color evalDisabledColor = new Color(0.15f, 0.15f, 0.15f); private static readonly Color evalDisabledColor = new Color(0.15f, 0.15f, 0.15f);
protected override bool SetCellEvaluateState(CacheObjectCell objectcell) protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell objectcell)
{ {
var cell = objectcell as CacheMemberCell; var cell = objectcell as CacheMemberCell;
@ -126,13 +126,13 @@ namespace UnityExplorer.CacheObject
SetValueState(cell, ValueStateArgs.Default); SetValueState(cell, ValueStateArgs.Default);
cell.RefreshSubcontentButton(); cell.RefreshSubcontentButton();
return true; return false;
} }
if (State == ValueState.NotEvaluated) if (State == ValueState.NotEvaluated)
Evaluate(); Evaluate();
return false; return true;
} }
public void OnEvaluateClicked() public void OnEvaluateClicked()
@ -148,7 +148,7 @@ namespace UnityExplorer.CacheObject
this.Evaluator = Pool<EvaluateWidget>.Borrow(); this.Evaluator = Pool<EvaluateWidget>.Borrow();
Evaluator.OnBorrowedFromPool(this); Evaluator.OnBorrowedFromPool(this);
Evaluator.UIRoot.transform.SetParent((CellView as CacheMemberCell).EvaluateHolder.transform, false); Evaluator.UIRoot.transform.SetParent((CellView as CacheMemberCell).EvaluateHolder.transform, false);
SetCellEvaluateState(CellView); TryAutoEvaluateIfUnitialized(CellView);
} }
else else
{ {
@ -157,7 +157,7 @@ namespace UnityExplorer.CacheObject
else else
Evaluator.UIRoot.SetActive(true); Evaluator.UIRoot.SetActive(true);
SetCellEvaluateState(CellView); TryAutoEvaluateIfUnitialized(CellView);
} }
} }
} }

View File

@ -254,8 +254,8 @@ namespace UnityExplorer.CacheObject
// Setting cell state from our model // Setting cell state from our model
/// <summary>Return true if SetCell should abort, false if it should continue.</summary> /// <summary>Return false if SetCell should abort, true if it should continue.</summary>
protected abstract bool SetCellEvaluateState(CacheObjectCell cell); protected abstract bool TryAutoEvaluateIfUnitialized(CacheObjectCell cell);
public virtual void SetDataToCell(CacheObjectCell cell) public virtual void SetDataToCell(CacheObjectCell cell)
{ {
@ -271,9 +271,21 @@ namespace UnityExplorer.CacheObject
IValue.SetLayout(); IValue.SetLayout();
} }
if (SetCellEvaluateState(cell)) bool evaluated = TryAutoEvaluateIfUnitialized(cell);
if (cell.CopyButton != null)
{
bool hasEvaluated = State != ValueState.NotEvaluated && State != ValueState.Exception;
cell.CopyButton.Component.gameObject.SetActive(hasEvaluated);
cell.PasteButton.Component.gameObject.SetActive(hasEvaluated && this.CanWrite);
}
if (!evaluated)
return; return;
// The following only executes if the object has evaluated.
// For members and properties with args, they will return by default now.
switch (State) switch (State)
{ {
case ValueState.Exception: case ValueState.Exception:

View File

@ -32,11 +32,13 @@ namespace UnityExplorer.CacheObject.IValues
private PropertyInfo genericIndexer; private PropertyInfo genericIndexer;
public int ItemCount => cachedEntries.Count; public int ItemCount => cachedEntries.Count;
private readonly List<CacheListEntry> cachedEntries = new List<CacheListEntry>(); private readonly List<CacheListEntry> cachedEntries = new();
public ScrollPool<CacheListEntryCell> ListScrollPool { get; private set; } public ScrollPool<CacheListEntryCell> ListScrollPool { get; private set; }
public Text TopLabel; public Text TopLabel;
private LayoutElement scrollLayout;
private Text NotSupportedLabel;
public override void OnBorrowed(CacheObjectBase owner) public override void OnBorrowed(CacheObjectBase owner)
{ {
@ -65,6 +67,28 @@ namespace UnityExplorer.CacheObject.IValues
cachedEntries.Clear(); cachedEntries.Clear();
} }
// List entry scroll pool
public override void SetLayout()
{
var minHeight = 5f;
foreach (var cell in ListScrollPool.CellPool)
{
if (cell.Enabled)
minHeight += cell.Rect.rect.height;
}
this.scrollLayout.minHeight = Math.Min(InspectorPanel.CurrentPanelHeight - 400f, minHeight);
}
public void OnCellBorrowed(CacheListEntryCell cell) { } // not needed
public void SetCell(CacheListEntryCell cell, int index)
{
CacheObjectControllerHelper.SetCell(cell, index, cachedEntries, null);
}
// Setting the List value itself to this model // Setting the List value itself to this model
public override void SetValue(object value) public override void SetValue(object value)
{ {
@ -212,32 +236,6 @@ namespace UnityExplorer.CacheObject.IValues
} }
} }
// List entry scroll pool
public override void SetLayout()
{
var minHeight = 5f;
foreach (var cell in ListScrollPool.CellPool)
{
if (cell.Enabled)
minHeight += cell.Rect.rect.height;
}
this.scrollLayout.minHeight = Math.Min(InspectorPanel.CurrentPanelHeight - 400f, minHeight);
}
public void OnCellBorrowed(CacheListEntryCell cell) { } // not needed
public void SetCell(CacheListEntryCell cell, int index)
{
CacheObjectControllerHelper.SetCell(cell, index, cachedEntries, null);
}
private LayoutElement scrollLayout;
private Text NotSupportedLabel;
public override GameObject CreateContent(GameObject parent) public override GameObject CreateContent(GameObject parent)
{ {
UIRoot = UIFactory.CreateVerticalGroup(parent, "InteractiveList", true, true, true, true, 6, new Vector4(10, 3, 15, 4), UIRoot = UIFactory.CreateVerticalGroup(parent, "InteractiveList", true, true, true, true, 6, new Vector4(10, 3, 15, 4),

View File

@ -7,6 +7,7 @@ using UnityEngine.UI;
using UnityExplorer.CacheObject.IValues; using UnityExplorer.CacheObject.IValues;
using UnityExplorer.Inspectors; using UnityExplorer.Inspectors;
using UnityExplorer.UI; using UnityExplorer.UI;
using UnityExplorer.UI.Panels;
using UnityExplorer.UI.Widgets; using UnityExplorer.UI.Widgets;
using UniverseLib; using UniverseLib;
using UniverseLib.UI; using UniverseLib.UI;
@ -47,9 +48,10 @@ namespace UnityExplorer.CacheObject.Views
public LayoutElement NameLayout; public LayoutElement NameLayout;
public GameObject RightGroupContent; public GameObject RightGroupContent;
public LayoutElement RightGroupLayout; public LayoutElement RightGroupLayout;
public GameObject SubContentHolder;
public Text NameLabel; public Text NameLabel;
public InputFieldRef HiddenNameLabel; public InputFieldRef HiddenNameLabel; // for selecting the name label
public Text TypeLabel; public Text TypeLabel;
public Text ValueLabel; public Text ValueLabel;
public Toggle Toggle; public Toggle Toggle;
@ -60,7 +62,11 @@ namespace UnityExplorer.CacheObject.Views
public ButtonRef SubContentButton; public ButtonRef SubContentButton;
public ButtonRef ApplyButton; public ButtonRef ApplyButton;
public GameObject SubContentHolder; public ButtonRef CopyButton;
public ButtonRef PasteButton;
public readonly Color subInactiveColor = new(0.23f, 0.23f, 0.23f);
public readonly Color subActiveColor = new(0.23f, 0.33f, 0.23f);
protected virtual void ApplyClicked() protected virtual void ApplyClicked()
{ {
@ -82,26 +88,26 @@ namespace UnityExplorer.CacheObject.Views
this.Occupant.OnCellSubContentToggle(); this.Occupant.OnCellSubContentToggle();
} }
public readonly Color subInactiveColor = new Color(0.23f, 0.23f, 0.23f); protected virtual void OnCopyClicked()
public readonly Color subActiveColor = new Color(0.23f, 0.33f, 0.23f); {
ClipboardPanel.Copy(this.Occupant.Value);
}
protected virtual void OnPasteClicked()
{
if (ClipboardPanel.TryPaste(this.Occupant.FallbackType, out object paste))
this.Occupant.SetUserValue(paste);
}
public void RefreshSubcontentButton() public void RefreshSubcontentButton()
{ {
if (!this.SubContentHolder.activeSelf) this.SubContentButton.ButtonText.text = SubContentHolder.activeSelf ? "▼" : "▲";
{ Color color = SubContentHolder.activeSelf ? subActiveColor : subInactiveColor;
this.SubContentButton.ButtonText.text = "▲"; RuntimeProvider.Instance.SetColorBlock(SubContentButton.Component, color, color * 1.3f);
RuntimeProvider.Instance.SetColorBlock(SubContentButton.Component, subInactiveColor, subInactiveColor * 1.3f);
}
else
{
this.SubContentButton.ButtonText.text = "▼";
RuntimeProvider.Instance.SetColorBlock(SubContentButton.Component, subActiveColor, subActiveColor * 1.3f);
}
} }
protected abstract void ConstructEvaluateHolder(GameObject parent); protected abstract void ConstructEvaluateHolder(GameObject parent);
public virtual GameObject CreateContent(GameObject parent) public virtual GameObject CreateContent(GameObject parent)
{ {
// Main layout // Main layout
@ -158,7 +164,7 @@ namespace UnityExplorer.CacheObject.Views
TypeLabel = UIFactory.CreateLabel(rightHoriGroup, "ReturnLabel", "<notset>", TextAnchor.MiddleLeft); TypeLabel = UIFactory.CreateLabel(rightHoriGroup, "ReturnLabel", "<notset>", TextAnchor.MiddleLeft);
TypeLabel.horizontalOverflow = HorizontalWrapMode.Wrap; TypeLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
UIFactory.SetLayoutElement(TypeLabel.gameObject, minHeight: 25, flexibleHeight: 150, minWidth: 60, flexibleWidth: 0); UIFactory.SetLayoutElement(TypeLabel.gameObject, minHeight: 25, flexibleHeight: 150, minWidth: 45, flexibleWidth: 0);
// Bool and number value interaction // Bool and number value interaction
@ -188,6 +194,24 @@ namespace UnityExplorer.CacheObject.Views
ValueLabel.horizontalOverflow = HorizontalWrapMode.Wrap; ValueLabel.horizontalOverflow = HorizontalWrapMode.Wrap;
UIFactory.SetLayoutElement(ValueLabel.gameObject, minHeight: 25, flexibleHeight: 150, flexibleWidth: 9999); UIFactory.SetLayoutElement(ValueLabel.gameObject, minHeight: 25, flexibleHeight: 150, flexibleWidth: 9999);
// Copy and Paste buttons
var buttonHolder = UIFactory.CreateHorizontalGroup(rightHoriGroup, "CopyPasteButtons", false, false, true, true, 4,
bgColor: new(1,1,1,0), childAlignment: TextAnchor.MiddleLeft);
UIFactory.SetLayoutElement(buttonHolder, minWidth: 60, flexibleWidth: 0);
CopyButton = UIFactory.CreateButton(buttonHolder, "CopyButton", "Copy", new Color(0.13f, 0.13f, 0.13f, 1f));
UIFactory.SetLayoutElement(CopyButton.Component.gameObject, minHeight: 25, minWidth: 28, flexibleWidth: 0);
CopyButton.ButtonText.color = Color.yellow;
CopyButton.ButtonText.fontSize = 10;
CopyButton.OnClick += OnCopyClicked;
PasteButton = UIFactory.CreateButton(buttonHolder, "PasteButton", "Paste", new Color(0.13f, 0.13f, 0.13f, 1f));
UIFactory.SetLayoutElement(PasteButton.Component.gameObject, minHeight: 25, minWidth: 28, flexibleWidth: 0);
PasteButton.ButtonText.color = Color.green;
PasteButton.ButtonText.fontSize = 10;
PasteButton.OnClick += OnPasteClicked;
// Subcontent // Subcontent
SubContentHolder = UIFactory.CreateUIObject("SubContent", UIRoot); SubContentHolder = UIFactory.CreateUIObject("SubContent", UIRoot);

View File

@ -38,6 +38,7 @@ namespace UnityExplorer.Config
public static ConfigElement<string> OptionsPanelData; public static ConfigElement<string> OptionsPanelData;
public static ConfigElement<string> ConsoleLogData; public static ConfigElement<string> ConsoleLogData;
public static ConfigElement<string> HookManagerData; public static ConfigElement<string> HookManagerData;
public static ConfigElement<string> ClipboardData;
internal static readonly Dictionary<string, IConfigElement> ConfigElements = new Dictionary<string, IConfigElement>(); internal static readonly Dictionary<string, IConfigElement> ConfigElements = new Dictionary<string, IConfigElement>();
internal static readonly Dictionary<string, IConfigElement> InternalConfigs = new Dictionary<string, IConfigElement>(); internal static readonly Dictionary<string, IConfigElement> InternalConfigs = new Dictionary<string, IConfigElement>();
@ -132,6 +133,7 @@ namespace UnityExplorer.Config
OptionsPanelData = new ConfigElement<string>("OptionsPanel", "", "", true); OptionsPanelData = new ConfigElement<string>("OptionsPanel", "", "", true);
ConsoleLogData = new ConfigElement<string>("ConsoleLog", "", "", true); ConsoleLogData = new ConfigElement<string>("ConsoleLog", "", "", true);
HookManagerData = new ConfigElement<string>("HookManager", "", "", true); HookManagerData = new ConfigElement<string>("HookManager", "", "", true);
ClipboardData = new ConfigElement<string>("Clipboard", "", "", true);
} }
} }
} }

View File

@ -16,7 +16,7 @@ namespace UnityExplorer
public static class ExplorerCore public static class ExplorerCore
{ {
public const string NAME = "UnityExplorer"; public const string NAME = "UnityExplorer";
public const string VERSION = "4.4.5"; public const string VERSION = "4.5.0";
public const string AUTHOR = "Sinai"; public const string AUTHOR = "Sinai";
public const string GUID = "com.sinai.unityexplorer"; public const string GUID = "com.sinai.unityexplorer";
@ -67,6 +67,8 @@ namespace UnityExplorer
UIManager.InitUI(); UIManager.InitUI();
Log($"{NAME} {VERSION} initialized."); Log($"{NAME} {VERSION} initialized.");
//InspectorManager.Inspect(typeof(Tests.TestClass));
} }
/// <summary> /// <summary>

View File

@ -241,7 +241,6 @@ namespace UnityExplorer.Inspectors
} }
} }
#region UI Construction #region UI Construction
public override GameObject CreateContent(GameObject parent) public override GameObject CreateContent(GameObject parent)

View File

@ -8,6 +8,7 @@ using UniverseLib.Input;
using UnityExplorer.UI; using UnityExplorer.UI;
using UniverseLib.UI; using UniverseLib.UI;
using UniverseLib; using UniverseLib;
using UnityExplorer.UI.Panels;
namespace UnityExplorer.Inspectors namespace UnityExplorer.Inspectors
{ {
@ -51,6 +52,11 @@ namespace UnityExplorer.Inspectors
ConstructTransformControls(); ConstructTransformControls();
} }
private void OnCopyClicked()
{
ClipboardPanel.Copy(this.GOTarget);
}
#region GO Controls #region GO Controls
private string lastGoName; private string lastGoName;
@ -467,6 +473,11 @@ namespace UnityExplorer.Inspectors
UIFactory.SetLayoutElement(PathInput.UIRoot, minHeight: 25, minWidth: 100, flexibleWidth: 9999); UIFactory.SetLayoutElement(PathInput.UIRoot, minHeight: 25, minWidth: 100, flexibleWidth: 9999);
PathInput.Component.lineType = InputField.LineType.MultiLineSubmit; PathInput.Component.lineType = InputField.LineType.MultiLineSubmit;
var copyButton = UIFactory.CreateButton(firstRow, "CopyButton", "Copy to Clipboard", new Color(0.2f, 0.2f, 0.2f, 1));
copyButton.ButtonText.color = Color.yellow;
UIFactory.SetLayoutElement(copyButton.Component.gameObject, minHeight: 25, minWidth: 120);
copyButton.OnClick += OnCopyClicked;
//var pathApplyBtn = UIFactory.CreateButton(firstRow, "PathButton", "Set Parent Path", new Color(0.2f, 0.2f, 0.2f)); //var pathApplyBtn = UIFactory.CreateButton(firstRow, "PathButton", "Set Parent Path", new Color(0.2f, 0.2f, 0.2f));
//UIFactory.SetLayoutElement(pathApplyBtn.Component.gameObject, minHeight: 25, minWidth: 120); //UIFactory.SetLayoutElement(pathApplyBtn.Component.gameObject, minHeight: 25, minWidth: 120);
//pathApplyBtn.OnClick += () => { OnPathEndEdit(PathInput.Text); }; //pathApplyBtn.OnClick += () => { OnPathEndEdit(PathInput.Text); };

View File

@ -9,52 +9,49 @@ using UniverseLib.UI.Models;
using UnityExplorer.UI.Widgets; using UnityExplorer.UI.Widgets;
using UniverseLib.UI; using UniverseLib.UI;
using UniverseLib; using UniverseLib;
using UnityExplorer.UI.Panels;
namespace UnityExplorer.Inspectors namespace UnityExplorer.Inspectors
{ {
public class InspectorTab : IPooledObject public class InspectorTab : IPooledObject
{ {
public GameObject UIRoot { get; set; } public GameObject UIRoot { get; set; }
public float DefaultHeight => 25f; public float DefaultHeight => 25f;
public ButtonRef TabButton; public ButtonRef TabButton;
public Text TabText; public Text TabText;
public ButtonRef CloseButton; public ButtonRef CloseButton;
private static readonly Color _enabledTabColor = new Color(0.15f, 0.22f, 0.15f); private static readonly Color enabledTabColor = new(0.15f, 0.22f, 0.15f);
private static readonly Color _disabledTabColor = new Color(0.13f, 0.13f, 0.13f); private static readonly Color disabledTabColor = new(0.13f, 0.13f, 0.13f);
public void SetTabColor(bool active) public void SetTabColor(bool active)
{ {
if (active) Color color = active ? enabledTabColor : disabledTabColor;
RuntimeProvider.Instance.SetColorBlock(TabButton.Component, _enabledTabColor, _enabledTabColor * 1.2f); RuntimeProvider.Instance.SetColorBlock(TabButton.Component, color, color * 1.2f);
else
RuntimeProvider.Instance.SetColorBlock(TabButton.Component, _disabledTabColor, _disabledTabColor * 1.2f);
} }
public GameObject CreateContent(GameObject parent) public GameObject CreateContent(GameObject parent)
{ {
UIRoot = UIFactory.CreateHorizontalGroup(parent, "TabObject", false, true, true, true, 0, UIRoot = UIFactory.CreateHorizontalGroup(parent, "TabObject", false, true, true, true, 1,
default, new Color(0.13f, 0.13f, 0.13f), childAlignment: TextAnchor.MiddleLeft); default, new Color(0.13f, 0.13f, 0.13f), childAlignment: TextAnchor.MiddleLeft);
UIFactory.SetLayoutElement(UIRoot, minWidth: 200, flexibleWidth: 0); UIFactory.SetLayoutElement(UIRoot, minWidth: 200, flexibleWidth: 0);
UIRoot.AddComponent<Mask>(); UIRoot.AddComponent<Mask>();
UIRoot.AddComponent<Outline>();
TabButton = UIFactory.CreateButton(UIRoot, "TabButton", ""); TabButton = UIFactory.CreateButton(UIRoot, "TabButton", "");
UIFactory.SetLayoutElement(TabButton.Component.gameObject, minWidth: 175, flexibleWidth: 0); UIFactory.SetLayoutElement(TabButton.Component.gameObject, minWidth: 173, flexibleWidth: 0);
UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(TabButton.Component.gameObject, false, false, true, true, 0, 0, 0, 3); UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(TabButton.Component.gameObject, false, false, true, true, 0, 0, 0, 3);
TabText = TabButton.Component.GetComponentInChildren<Text>(); TabText = TabButton.Component.GetComponentInChildren<Text>();
UIFactory.SetLayoutElement(TabText.gameObject, minHeight: 25, minWidth: 175, flexibleWidth: 0); UIFactory.SetLayoutElement(TabText.gameObject, minHeight: 25, minWidth: 173, flexibleWidth: 0);
TabText.alignment = TextAnchor.MiddleLeft; TabText.alignment = TextAnchor.MiddleLeft;
TabText.fontSize = 12; TabText.fontSize = 12;
TabText.horizontalOverflow = HorizontalWrapMode.Overflow; TabText.horizontalOverflow = HorizontalWrapMode.Overflow;
CloseButton = UIFactory.CreateButton(UIRoot, "CloseButton", "X", new Color(0.2f, 0.2f, 0.2f, 1)); CloseButton = UIFactory.CreateButton(UIRoot, "CloseButton", "X", new Color(0.15f, 0.15f, 0.15f, 1));
UIFactory.SetLayoutElement(CloseButton.Component.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0); UIFactory.SetLayoutElement(CloseButton.Component.gameObject, minHeight: 25, minWidth: 25, flexibleWidth: 0);
var closeBtnText = CloseButton.Component.GetComponentInChildren<Text>(); CloseButton.ButtonText.color = Color.red;
closeBtnText.color = Color.red;
return UIRoot; return UIRoot;
} }

View File

@ -327,6 +327,11 @@ namespace UnityExplorer.Inspectors
cell.Occupant.IValue.SetLayout(); cell.Occupant.IValue.SetLayout();
} }
private void OnCopyClicked()
{
ClipboardPanel.Copy(this.Target ?? this.TargetType);
}
// UI Construction // UI Construction
private GameObject mainContentHolder; private GameObject mainContentHolder;
@ -338,7 +343,10 @@ namespace UnityExplorer.Inspectors
// Class name, assembly // Class name, assembly
var titleHolder = UIFactory.CreateUIObject("TitleHolder", UIRoot); var topRow = UIFactory.CreateHorizontalGroup(UIRoot, "TopRow", false, false, true, true, 4, default, new(1, 1, 1, 0), TextAnchor.MiddleLeft);
UIFactory.SetLayoutElement(topRow, minHeight: 25, flexibleWidth: 9999);
var titleHolder = UIFactory.CreateUIObject("TitleHolder", topRow);
UIFactory.SetLayoutElement(titleHolder, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999); UIFactory.SetLayoutElement(titleHolder, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999);
NameText = UIFactory.CreateLabel(titleHolder, "VisibleTitle", "NotSet", TextAnchor.MiddleLeft); NameText = UIFactory.CreateLabel(titleHolder, "VisibleTitle", "NotSet", TextAnchor.MiddleLeft);
@ -360,6 +368,11 @@ namespace UnityExplorer.Inspectors
HiddenNameText.Component.textComponent.color = Color.clear; HiddenNameText.Component.textComponent.color = Color.clear;
UIFactory.SetLayoutElement(HiddenNameText.Component.gameObject, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999); UIFactory.SetLayoutElement(HiddenNameText.Component.gameObject, minHeight: 35, flexibleHeight: 0, flexibleWidth: 9999);
var copyButton = UIFactory.CreateButton(topRow, "CopyButton", "Copy to Clipboard", new Color(0.2f, 0.2f, 0.2f, 1));
copyButton.ButtonText.color = Color.yellow;
UIFactory.SetLayoutElement(copyButton.Component.gameObject, minHeight: 25, minWidth: 120, flexibleWidth: 0);
copyButton.OnClick += OnCopyClicked;
AssemblyText = UIFactory.CreateLabel(UIRoot, "AssemblyLabel", "not set", TextAnchor.MiddleLeft); AssemblyText = UIFactory.CreateLabel(UIRoot, "AssemblyLabel", "not set", TextAnchor.MiddleLeft);
UIFactory.SetLayoutElement(AssemblyText.gameObject, minHeight: 25, flexibleWidth: 9999); UIFactory.SetLayoutElement(AssemblyText.gameObject, minHeight: 25, flexibleWidth: 9999);

View File

@ -5,7 +5,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using UnityEngine; using UnityEngine;
using UnityExplorer.Core;
using UnityExplorer.Config; using UnityExplorer.Config;
namespace UnityExplorer.Loader.ML namespace UnityExplorer.Loader.ML

View File

@ -8,7 +8,6 @@ using UnityExplorer.Config;
using UnityExplorer.Loader.STANDALONE; using UnityExplorer.Loader.STANDALONE;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using UniverseLib.Input; using UniverseLib.Input;
using UnityExplorer.Core;
#if CPP #if CPP
using UnhollowerRuntimeLib; using UnhollowerRuntimeLib;
#endif #endif

View File

@ -24,7 +24,10 @@ namespace UnityExplorer.Tests
#endif #endif
} }
public static object LiterallyAnything = null;
// Test enumerables // Test enumerables
public static int[,,] MultiDimensionalArray = new int[45, 45, 45];
public static List<object> ListOfInts; public static List<object> ListOfInts;
public static List<List<List<string>>> NestedList; public static List<List<List<string>>> NestedList;
public static IDictionary MixedDictionary; public static IDictionary MixedDictionary;
@ -40,7 +43,12 @@ namespace UnityExplorer.Tests
public static CameraClearFlags EnumTest2; public static CameraClearFlags EnumTest2;
public static Color Color = Color.magenta; public static Color Color = Color.magenta;
public static Color32 Color32 = Color.red; public static Color32 Color32 = Color.red;
public static string ALongString = new string('#', 10000); public static string ALongString = new('#', 10000);
public static float[] AParseTest(ref List<float[,,]> arg0, ref float[,] arg1)
{
return new float[] { 1, 2, 3 };
}
public static List<object> RandomList public static List<object> RandomList
{ {

View File

@ -1,22 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UnityExplorer.UI
{
public static class Clipboard
{
public static object Current { get; private set; }
public static void Init()
{
}
public static void Copy(object obj)
{
Current = obj;
}
}
}

55
src/UI/Notification.cs Normal file
View File

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UniverseLib.Input;
using UniverseLib.UI;
namespace UnityExplorer.UI
{
public static class Notification
{
private static Text popupLabel;
private static string _currentNotification;
private static float _timeOfLastNotification;
public static void Init()
{
ConstructUI();
}
public static void ShowMessage(string message)
{
popupLabel.text = message;
_currentNotification = message;
_timeOfLastNotification = Time.realtimeSinceStartup;
popupLabel.transform.localPosition = UIManager.UIRootRect.InverseTransformPoint(InputManager.MousePosition) + (Vector3.up * 25);
}
public static void Update()
{
if (_currentNotification != null)
{
if (Time.realtimeSinceStartup - _timeOfLastNotification > 2f)
{
_currentNotification = null;
popupLabel.text = "";
}
}
}
private static void ConstructUI()
{
popupLabel = UIFactory.CreateLabel(UIManager.UIRoot, "ClipboardNotification", "", TextAnchor.MiddleCenter);
popupLabel.rectTransform.sizeDelta = new(500, 100);
popupLabel.gameObject.AddComponent<Outline>();
var popupGroup = popupLabel.gameObject.AddComponent<CanvasGroup>();
popupGroup.blocksRaycasts = false;
}
}
}

View File

@ -0,0 +1,120 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityExplorer.CacheObject;
using UnityExplorer.CacheObject.Views;
using UnityExplorer.Config;
using UniverseLib;
using UniverseLib.Input;
using UniverseLib.UI;
using UniverseLib.UI.Widgets;
namespace UnityExplorer.UI.Panels
{
public class ClipboardPanel : UIPanel
{
public static object Current { get; private set; }
public override UIManager.Panels PanelType => UIManager.Panels.Clipboard;
public override string Name => "Clipboard";
public override int MinWidth => 500;
public override int MinHeight => 95;
public override bool CanDragAndResize => true;
public override bool NavButtonWanted => true;
public override bool ShouldSaveActiveState => true;
public override bool ShowByDefault => true;
public override string GetSaveDataFromConfigManager() => ConfigManager.ClipboardData.Value;
public override void DoSaveToConfigElement() => ConfigManager.ClipboardData.Value = this.ToSaveData();
private static Text CurrentPasteLabel;
public static void Copy(object obj)
{
Current = obj;
Notification.ShowMessage("Copied!");
UpdateCurrentPasteInfo();
}
public static bool TryPaste(Type targetType, out object paste)
{
paste = Current;
var pasteType = Current?.GetActualType();
if (Current != null && !targetType.IsAssignableFrom(pasteType))
{
Notification.ShowMessage($"Cannot assign '{pasteType.Name}' to '{targetType.Name}'!");
return false;
}
Notification.ShowMessage("Pasted!");
return true;
}
public static void ClearClipboard()
{
Current = null;
UpdateCurrentPasteInfo();
}
private static void UpdateCurrentPasteInfo()
{
CurrentPasteLabel.text = ToStringUtility.ToStringWithType(Current, typeof(object), false);
}
private static void InspectClipboard()
{
if (Current.IsNullOrDestroyed())
{
Notification.ShowMessage("Cannot inspect a null or destroyed object!");
return;
}
InspectorManager.Inspect(Current);
}
protected internal override void DoSetDefaultPosAndAnchors()
{
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, MinWidth);
this.Rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, MinHeight);
this.Rect.anchorMin = new Vector2(0.1f, 0.05f);
this.Rect.anchorMax = new Vector2(0.4f, 0.15f);
}
public override void ConstructPanelContent()
{
this.UIRoot.GetComponent<Image>().color = new(0.1f, 0.1f, 0.1f);
// Actual panel content
var firstRow = UIFactory.CreateHorizontalGroup(UIRoot, "FirstRow", false, false, true, true, 5, new(2,2,2,2), new(1,1,1,0));
UIFactory.SetLayoutElement(firstRow, minHeight: 25, flexibleWidth: 999);
// Title for "Current Paste:"
var currentPasteTitle = UIFactory.CreateLabel(firstRow, "CurrentPasteTitle", "Current paste:", TextAnchor.MiddleLeft, color: Color.grey);
UIFactory.SetLayoutElement(currentPasteTitle.gameObject, minHeight: 25, minWidth: 100, flexibleWidth: 999);
// Clear clipboard button
var clearButton = UIFactory.CreateButton(firstRow, "ClearPasteButton", "Clear Clipboard");
UIFactory.SetLayoutElement(clearButton.Component.gameObject, minWidth: 120, minHeight: 25, flexibleWidth: 0);
clearButton.OnClick += () => Copy(null);
// Current Paste info row
var currentPasteHolder = UIFactory.CreateHorizontalGroup(UIRoot, "SecondRow", false, false, true, true, 0,
new(2, 2, 2, 2), childAlignment: TextAnchor.UpperCenter);
// Actual current paste info label
CurrentPasteLabel = UIFactory.CreateLabel(currentPasteHolder, "CurrentPasteInfo", "not set", TextAnchor.UpperLeft);
UIFactory.SetLayoutElement(CurrentPasteLabel.gameObject, minHeight: 25, minWidth: 100, flexibleWidth: 999, flexibleHeight: 999);
UpdateCurrentPasteInfo();
// Inspect button
var inspectButton = UIFactory.CreateButton(currentPasteHolder, "InspectButton", "Inspect");
UIFactory.SetLayoutElement(inspectButton.Component.gameObject, minHeight: 25, flexibleHeight: 0, minWidth: 80, flexibleWidth: 0);
inspectButton.OnClick += InspectClipboard;
}
}
}

View File

@ -46,10 +46,7 @@ namespace UnityExplorer.UI.Panels
public override string GetSaveDataFromConfigManager() => ConfigManager.InspectorData.Value; public override string GetSaveDataFromConfigManager() => ConfigManager.InspectorData.Value;
public override void DoSaveToConfigElement() public override void DoSaveToConfigElement() => ConfigManager.InspectorData.Value = this.ToSaveData();
{
ConfigManager.InspectorData.Value = this.ToSaveData();
}
protected internal override void DoSetDefaultPosAndAnchors() protected internal override void DoSetDefaultPosAndAnchors()
{ {

View File

@ -15,15 +15,33 @@ namespace UnityExplorer.UI.Panels
{ {
public class PanelDragger public class PanelDragger
{ {
private enum MouseState
{
Down,
Held,
NotPressed
}
#region Static #region Static
public static bool Resizing { get; private set; } public static bool Resizing { get; private set; }
public static bool ResizePrompting => resizeCursorObj && resizeCursorObj.activeSelf;
public static bool ResizePrompting => s_resizeCursorObj && s_resizeCursorObj.activeSelf; public static GameObject resizeCursorObj;
internal static bool wasAnyDragging;
internal static List<PanelDragger> Instances = new();
private static bool handledInstanceThisFrame;
static PanelDragger()
{
UIPanel.OnPanelsReordered += OnPanelsReordered;
}
internal static void ForceEnd() internal static void ForceEnd()
{ {
s_resizeCursorObj.SetActive(false); resizeCursorObj.SetActive(false);
wasAnyDragging = false; wasAnyDragging = false;
Resizing = false; Resizing = false;
@ -34,13 +52,6 @@ namespace UnityExplorer.UI.Panels
} }
} }
internal static List<PanelDragger> Instances = new List<PanelDragger>();
static PanelDragger()
{
UIPanel.OnPanelsReordered += OnPanelsReordered;
}
public static void OnPanelsReordered() public static void OnPanelsReordered()
{ {
Instances.Sort((a, b) => b.Panel.GetSiblingIndex().CompareTo(a.Panel.GetSiblingIndex())); Instances.Sort((a, b) => b.Panel.GetSiblingIndex().CompareTo(a.Panel.GetSiblingIndex()));
@ -54,18 +65,9 @@ namespace UnityExplorer.UI.Panels
} }
} }
private enum MouseState
{
Down,
Held,
NotPressed
}
private static bool handledInstanceThisFrame;
public static void UpdateInstances() public static void UpdateInstances()
{ {
if (!s_resizeCursorObj) if (!resizeCursorObj)
CreateCursorUI(); CreateCursorUI();
MouseState state; MouseState state;
@ -99,10 +101,6 @@ namespace UnityExplorer.UI.Panels
#endregion #endregion
public static GameObject s_resizeCursorObj;
internal static bool wasAnyDragging;
// Instance // Instance
public UIPanel UIPanel { get; private set; } public UIPanel UIPanel { get; private set; }
@ -112,27 +110,23 @@ namespace UnityExplorer.UI.Panels
public event Action<RectTransform> OnFinishResize; public event Action<RectTransform> OnFinishResize;
public event Action<RectTransform> OnFinishDrag; public event Action<RectTransform> OnFinishDrag;
private readonly RectTransform canvasTransform;
// Dragging // Dragging
public RectTransform DragableArea { get; set; } public RectTransform DragableArea { get; set; }
public bool WasDragging { get; set; } public bool WasDragging { get; set; }
private Vector2 m_lastDragPosition; private Vector2 lastDragPosition;
// Resizing // Resizing
private const int RESIZE_THICKNESS = 10; private const int RESIZE_THICKNESS = 10;
//internal readonly Vector2 minResize = new Vector2(200, 50);
private bool WasResizing { get; set; } private bool WasResizing { get; set; }
private ResizeTypes m_currentResizeType = ResizeTypes.NONE; private ResizeTypes currentResizeType = ResizeTypes.NONE;
private Vector2 m_lastResizePos; private Vector2 lastResizePos;
private bool WasHoveringResize => s_resizeCursorObj.activeInHierarchy; private bool WasHoveringResize => resizeCursorObj.activeInHierarchy;
private ResizeTypes m_lastResizeHoverType; private ResizeTypes lastResizeHoverType;
private Rect m_totalResizeRect; private Rect totalResizeRect;
public PanelDragger(RectTransform dragArea, RectTransform panelToDrag, UIPanel panel) public PanelDragger(RectTransform dragArea, RectTransform panelToDrag, UIPanel panel)
{ {
@ -141,16 +135,13 @@ namespace UnityExplorer.UI.Panels
DragableArea = dragArea; DragableArea = dragArea;
Panel = panelToDrag; Panel = panelToDrag;
if (!canvasTransform)
canvasTransform = Panel.GetComponentInParent<Canvas>().GetComponent<RectTransform>();
UpdateResizeCache(); UpdateResizeCache();
} }
public void Destroy() public void Destroy()
{ {
if (s_resizeCursorObj) if (resizeCursorObj)
GameObject.Destroy(s_resizeCursorObj); GameObject.Destroy(resizeCursorObj);
if (Instances.Contains(this)) if (Instances.Contains(this))
Instances.Remove(this); Instances.Remove(this);
@ -166,7 +157,7 @@ namespace UnityExplorer.UI.Panels
Vector3 dragPos = DragableArea.InverseTransformPoint(rawMousePos); Vector3 dragPos = DragableArea.InverseTransformPoint(rawMousePos);
bool inDragPos = DragableArea.rect.Contains(dragPos); bool inDragPos = DragableArea.rect.Contains(dragPos);
if (WasHoveringResize && s_resizeCursorObj) if (WasHoveringResize && resizeCursorObj)
UpdateHoverImagePos(); UpdateHoverImagePos();
switch (state) switch (state)
@ -243,15 +234,15 @@ namespace UnityExplorer.UI.Panels
{ {
wasAnyDragging = true; wasAnyDragging = true;
WasDragging = true; WasDragging = true;
m_lastDragPosition = InputManager.MousePosition; lastDragPosition = InputManager.MousePosition;
} }
public void OnDrag() public void OnDrag()
{ {
var mousePos = InputManager.MousePosition; var mousePos = InputManager.MousePosition;
Vector2 diff = (Vector2)mousePos - m_lastDragPosition; Vector2 diff = (Vector2)mousePos - lastDragPosition;
m_lastDragPosition = mousePos; lastDragPosition = mousePos;
Panel.localPosition = Panel.localPosition + (Vector3)diff; Panel.localPosition = Panel.localPosition + (Vector3)diff;
@ -296,7 +287,7 @@ namespace UnityExplorer.UI.Panels
private void UpdateResizeCache() private void UpdateResizeCache()
{ {
m_totalResizeRect = new Rect(Panel.rect.x - RESIZE_THICKNESS + 1, totalResizeRect = new Rect(Panel.rect.x - RESIZE_THICKNESS + 1,
Panel.rect.y - RESIZE_THICKNESS + 1, Panel.rect.y - RESIZE_THICKNESS + 1,
Panel.rect.width + DBL_THICKESS - 2, Panel.rect.width + DBL_THICKESS - 2,
Panel.rect.height + DBL_THICKESS - 2); Panel.rect.height + DBL_THICKESS - 2);
@ -305,34 +296,34 @@ namespace UnityExplorer.UI.Panels
if (AllowDragAndResize) if (AllowDragAndResize)
{ {
m_resizeMask[ResizeTypes.Bottom] = new Rect( m_resizeMask[ResizeTypes.Bottom] = new Rect(
m_totalResizeRect.x, totalResizeRect.x,
m_totalResizeRect.y, totalResizeRect.y,
m_totalResizeRect.width, totalResizeRect.width,
RESIZE_THICKNESS); RESIZE_THICKNESS);
m_resizeMask[ResizeTypes.Left] = new Rect( m_resizeMask[ResizeTypes.Left] = new Rect(
m_totalResizeRect.x, totalResizeRect.x,
m_totalResizeRect.y, totalResizeRect.y,
RESIZE_THICKNESS, RESIZE_THICKNESS,
m_totalResizeRect.height); totalResizeRect.height);
m_resizeMask[ResizeTypes.Top] = new Rect( m_resizeMask[ResizeTypes.Top] = new Rect(
m_totalResizeRect.x, totalResizeRect.x,
Panel.rect.y + Panel.rect.height - 2, Panel.rect.y + Panel.rect.height - 2,
m_totalResizeRect.width, totalResizeRect.width,
RESIZE_THICKNESS); RESIZE_THICKNESS);
m_resizeMask[ResizeTypes.Right] = new Rect( m_resizeMask[ResizeTypes.Right] = new Rect(
m_totalResizeRect.x + Panel.rect.width + RESIZE_THICKNESS - 2, totalResizeRect.x + Panel.rect.width + RESIZE_THICKNESS - 2,
m_totalResizeRect.y, totalResizeRect.y,
RESIZE_THICKNESS, RESIZE_THICKNESS,
m_totalResizeRect.height); totalResizeRect.height);
} }
} }
private bool MouseInResizeArea(Vector2 mousePos) private bool MouseInResizeArea(Vector2 mousePos)
{ {
return m_totalResizeRect.Contains(mousePos); return totalResizeRect.Contains(mousePos);
} }
private ResizeTypes GetResizeType(Vector2 mousePos) private ResizeTypes GetResizeType(Vector2 mousePos)
@ -361,16 +352,16 @@ namespace UnityExplorer.UI.Panels
public void OnHoverResize(ResizeTypes resizeType) public void OnHoverResize(ResizeTypes resizeType)
{ {
if (WasHoveringResize && m_lastResizeHoverType == resizeType) if (WasHoveringResize && lastResizeHoverType == resizeType)
return; return;
// we are entering resize, or the resize type has changed. // we are entering resize, or the resize type has changed.
//WasHoveringResize = true; //WasHoveringResize = true;
m_lastResizeHoverType = resizeType; lastResizeHoverType = resizeType;
s_resizeCursorObj.SetActive(true); resizeCursorObj.SetActive(true);
s_resizeCursorObj.transform.SetAsLastSibling(); resizeCursorObj.transform.SetAsLastSibling();
// set the rotation for the resize icon // set the rotation for the resize icon
float iconRotation = 0f; float iconRotation = 0f;
@ -387,9 +378,9 @@ namespace UnityExplorer.UI.Panels
iconRotation = 135f; break; iconRotation = 135f; break;
} }
Quaternion rot = s_resizeCursorObj.transform.rotation; Quaternion rot = resizeCursorObj.transform.rotation;
rot.eulerAngles = new Vector3(0, 0, iconRotation); rot.eulerAngles = new Vector3(0, 0, iconRotation);
s_resizeCursorObj.transform.rotation = rot; resizeCursorObj.transform.rotation = rot;
UpdateHoverImagePos(); UpdateHoverImagePos();
} }
@ -397,19 +388,19 @@ namespace UnityExplorer.UI.Panels
// update the resize icon position to be above the mouse // update the resize icon position to be above the mouse
private void UpdateHoverImagePos() private void UpdateHoverImagePos()
{ {
s_resizeCursorObj.transform.localPosition = canvasTransform.InverseTransformPoint(InputManager.MousePosition); resizeCursorObj.transform.localPosition = UIManager.UIRootRect.InverseTransformPoint(InputManager.MousePosition);
} }
public void OnHoverResizeEnd() public void OnHoverResizeEnd()
{ {
//WasHoveringResize = false; //WasHoveringResize = false;
s_resizeCursorObj.SetActive(false); resizeCursorObj.SetActive(false);
} }
public void OnBeginResize(ResizeTypes resizeType) public void OnBeginResize(ResizeTypes resizeType)
{ {
m_currentResizeType = resizeType; currentResizeType = resizeType;
m_lastResizePos = InputManager.MousePosition; lastResizePos = InputManager.MousePosition;
WasResizing = true; WasResizing = true;
Resizing = true; Resizing = true;
} }
@ -417,15 +408,15 @@ namespace UnityExplorer.UI.Panels
public void OnResize() public void OnResize()
{ {
Vector3 mousePos = InputManager.MousePosition; Vector3 mousePos = InputManager.MousePosition;
Vector2 diff = m_lastResizePos - (Vector2)mousePos; Vector2 diff = lastResizePos - (Vector2)mousePos;
if ((Vector2)mousePos == m_lastResizePos) if ((Vector2)mousePos == lastResizePos)
return; return;
if (mousePos.x < 0 || mousePos.y < 0 || mousePos.x > Screen.width || mousePos.y > Screen.height) if (mousePos.x < 0 || mousePos.y < 0 || mousePos.x > Screen.width || mousePos.y > Screen.height)
return; return;
m_lastResizePos = mousePos; lastResizePos = mousePos;
float diffX = (float)((decimal)diff.x / Screen.width); float diffX = (float)((decimal)diff.x / Screen.width);
float diffY = (float)((decimal)diff.y / Screen.height); float diffY = (float)((decimal)diff.y / Screen.height);
@ -433,14 +424,14 @@ namespace UnityExplorer.UI.Panels
Vector2 anchorMin = Panel.anchorMin; Vector2 anchorMin = Panel.anchorMin;
Vector2 anchorMax = Panel.anchorMax; Vector2 anchorMax = Panel.anchorMax;
if (m_currentResizeType.HasFlag(ResizeTypes.Left)) if (currentResizeType.HasFlag(ResizeTypes.Left))
anchorMin.x -= diffX; anchorMin.x -= diffX;
else if (m_currentResizeType.HasFlag(ResizeTypes.Right)) else if (currentResizeType.HasFlag(ResizeTypes.Right))
anchorMax.x -= diffX; anchorMax.x -= diffX;
if (m_currentResizeType.HasFlag(ResizeTypes.Top)) if (currentResizeType.HasFlag(ResizeTypes.Top))
anchorMax.y -= diffY; anchorMax.y -= diffY;
else if (m_currentResizeType.HasFlag(ResizeTypes.Bottom)) else if (currentResizeType.HasFlag(ResizeTypes.Bottom))
anchorMin.y -= diffY; anchorMin.y -= diffY;
var prevMin = Panel.anchorMin; var prevMin = Panel.anchorMin;
@ -475,13 +466,13 @@ namespace UnityExplorer.UI.Panels
try try
{ {
var text = UIFactory.CreateLabel(UIManager.UIRoot, "ResizeCursor", "↔", TextAnchor.MiddleCenter, Color.white, true, 35); var text = UIFactory.CreateLabel(UIManager.UIRoot, "ResizeCursor", "↔", TextAnchor.MiddleCenter, Color.white, true, 35);
s_resizeCursorObj = text.gameObject; resizeCursorObj = text.gameObject;
RectTransform rect = s_resizeCursorObj.GetComponent<RectTransform>(); RectTransform rect = resizeCursorObj.GetComponent<RectTransform>();
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 64); rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 64);
rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 64); rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 64);
s_resizeCursorObj.SetActive(false); resizeCursorObj.SetActive(false);
} }
catch (Exception e) catch (Exception e)
{ {

View File

@ -23,8 +23,8 @@ namespace UnityExplorer.UI.Panels
public static event Action OnPanelsReordered; public static event Action OnPanelsReordered;
public static event Action OnClickedOutsidePanels; public static event Action OnClickedOutsidePanels;
internal static readonly List<UIPanel> instances = new List<UIPanel>(); internal static readonly List<UIPanel> instances = new();
internal static readonly Dictionary<int, UIPanel> transformToPanelDict = new Dictionary<int, UIPanel>(); internal static readonly Dictionary<int, UIPanel> transformToPanelDict = new();
public static void UpdateFocus() public static void UpdateFocus()
{ {

View File

@ -27,17 +27,6 @@ namespace UnityExplorer.UI.Panels
private ButtonListHandler<GameObject, ButtonCell> dataHandler; private ButtonListHandler<GameObject, ButtonCell> dataHandler;
private ScrollPool<ButtonCell> buttonScrollPool; private ScrollPool<ButtonCell> buttonScrollPool;
public override void ConstructPanelContent()
{
dataHandler = new ButtonListHandler<GameObject, ButtonCell>(buttonScrollPool, GetEntries, SetCell, ShouldDisplayCell, OnCellClicked);
buttonScrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.content, "ResultsList", out GameObject scrollObj,
out GameObject scrollContent);
buttonScrollPool.Initialize(dataHandler);
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
}
public void ShowResults() public void ShowResults()
{ {
dataHandler.RefreshData(); dataHandler.RefreshData();
@ -65,6 +54,17 @@ namespace UnityExplorer.UI.Panels
cell.Button.ButtonText.text = $"<color=cyan>{obj.name}</color> ({obj.transform.GetTransformPath(true)})"; cell.Button.ButtonText.text = $"<color=cyan>{obj.name}</color> ({obj.transform.GetTransformPath(true)})";
} }
public override void ConstructPanelContent()
{
dataHandler = new ButtonListHandler<GameObject, ButtonCell>(buttonScrollPool, GetEntries, SetCell, ShouldDisplayCell, OnCellClicked);
buttonScrollPool = UIFactory.CreateScrollPool<ButtonCell>(this.content, "ResultsList", out GameObject scrollObj,
out GameObject scrollContent);
buttonScrollPool.Initialize(dataHandler);
UIFactory.SetLayoutElement(scrollObj, flexibleHeight: 9999);
}
protected internal override void DoSetDefaultPosAndAnchors() protected internal override void DoSetDefaultPosAndAnchors()
{ {
this.Rect.anchorMin = new Vector2(0.5f, 0.5f); this.Rect.anchorMin = new Vector2(0.5f, 0.5f);

View File

@ -35,6 +35,7 @@ namespace UnityExplorer.UI
MouseInspector, MouseInspector,
UIInspectorResults, UIInspectorResults,
HookManager, HookManager,
Clipboard
} }
public enum VerticalAnchor public enum VerticalAnchor
@ -49,12 +50,15 @@ namespace UnityExplorer.UI
private static UIBase uiBase; private static UIBase uiBase;
public static GameObject UIRoot => uiBase?.RootObject; public static GameObject UIRoot => uiBase?.RootObject;
public static RectTransform UIRootRect => _uiRootRect ??= UIRoot.GetComponent<RectTransform>();
private static RectTransform _uiRootRect;
internal static GameObject PanelHolder { get; private set; } internal static GameObject PanelHolder { get; private set; }
private static readonly Dictionary<Panels, UIPanel> UIPanels = new Dictionary<Panels, UIPanel>(); private static readonly Dictionary<Panels, UIPanel> UIPanels = new();
public static RectTransform NavBarRect; public static RectTransform NavBarRect;
public static GameObject NavbarTabButtonHolder; public static GameObject NavbarTabButtonHolder;
private static readonly Vector2 NAVBAR_DIMENSIONS = new(1020f, 35f);
private static ButtonRef closeBtn; private static ButtonRef closeBtn;
private static ButtonRef pauseBtn; private static ButtonRef pauseBtn;
@ -62,6 +66,9 @@ namespace UnityExplorer.UI
private static bool pauseButtonPausing; private static bool pauseButtonPausing;
private static float lastTimeScale; private static float lastTimeScale;
private static int lastScreenWidth;
private static int lastScreenHeight;
public static bool ShowMenu public static bool ShowMenu
{ {
get => uiBase != null && uiBase.Enabled; get => uiBase != null && uiBase.Enabled;
@ -83,6 +90,7 @@ namespace UnityExplorer.UI
lastScreenWidth = Screen.width; lastScreenWidth = Screen.width;
lastScreenHeight = Screen.height; lastScreenHeight = Screen.height;
// Create UI. // Create UI.
CreatePanelHolder(); CreatePanelHolder();
CreateTopNavBar(); CreateTopNavBar();
@ -93,6 +101,7 @@ namespace UnityExplorer.UI
UIPanels.Add(Panels.Inspector, new InspectorPanel()); UIPanels.Add(Panels.Inspector, new InspectorPanel());
UIPanels.Add(Panels.CSConsole, new CSConsolePanel()); UIPanels.Add(Panels.CSConsole, new CSConsolePanel());
UIPanels.Add(Panels.HookManager, new HookManagerPanel()); UIPanels.Add(Panels.HookManager, new HookManagerPanel());
UIPanels.Add(Panels.Clipboard, new ClipboardPanel());
UIPanels.Add(Panels.ConsoleLog, new LogPanel()); UIPanels.Add(Panels.ConsoleLog, new LogPanel());
UIPanels.Add(Panels.Options, new OptionsPanel()); UIPanels.Add(Panels.Options, new OptionsPanel());
UIPanels.Add(Panels.UIInspectorResults, new UiInspectorResultsPanel()); UIPanels.Add(Panels.UIInspectorResults, new UiInspectorResultsPanel());
@ -102,8 +111,8 @@ namespace UnityExplorer.UI
panel.ConstructUI(); panel.ConstructUI();
// Call some initialize methods // Call some initialize methods
Notification.Init();
ConsoleController.Init(); ConsoleController.Init();
Clipboard.Init();
// Add this listener to prevent ScrollPool doing anything while we are resizing panels // Add this listener to prevent ScrollPool doing anything while we are resizing panels
ScrollPool<ICell>.writingLockedListeners.Add(() => !PanelDragger.Resizing); ScrollPool<ICell>.writingLockedListeners.Add(() => !PanelDragger.Resizing);
@ -120,9 +129,6 @@ namespace UnityExplorer.UI
// Main UI Update loop // Main UI Update loop
private static int lastScreenWidth;
private static int lastScreenHeight;
public static void Update() public static void Update()
{ {
if (!UIRoot) if (!UIRoot)
@ -135,6 +141,9 @@ namespace UnityExplorer.UI
return; return;
} }
// Update Notification modal
Notification.Update();
// Check forceUnlockMouse toggle // Check forceUnlockMouse toggle
if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value)) if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value))
UniverseLib.Config.ConfigManager.Force_Unlock_Mouse = !UniverseLib.Config.ConfigManager.Force_Unlock_Mouse; UniverseLib.Config.ConfigManager.Force_Unlock_Mouse = !UniverseLib.Config.ConfigManager.Force_Unlock_Mouse;
@ -208,14 +217,14 @@ namespace UnityExplorer.UI
NavBarRect.anchorMin = new Vector2(0.5f, 1f); NavBarRect.anchorMin = new Vector2(0.5f, 1f);
NavBarRect.anchorMax = new Vector2(0.5f, 1f); NavBarRect.anchorMax = new Vector2(0.5f, 1f);
NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 0); NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 0);
NavBarRect.sizeDelta = new Vector2(1080f, 35f); NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
break; break;
case VerticalAnchor.Bottom: case VerticalAnchor.Bottom:
NavBarRect.anchorMin = new Vector2(0.5f, 0f); NavBarRect.anchorMin = new Vector2(0.5f, 0f);
NavBarRect.anchorMax = new Vector2(0.5f, 0f); NavBarRect.anchorMax = new Vector2(0.5f, 0f);
NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 35); NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 35);
NavBarRect.sizeDelta = new Vector2(1080f, 35f); NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
break; break;
} }
} }

View File

@ -42,8 +42,6 @@ namespace UnityExplorer.UI.Widgets
SetArgRows(); SetArgRows();
this.UIRoot.SetActive(true); this.UIRoot.SetActive(true);
InspectorManager.OnInspectedTabsChanged += InspectorManager_OnInspectedTabsChanged;
} }
public void OnReturnToPool() public void OnReturnToPool()
@ -63,14 +61,6 @@ namespace UnityExplorer.UI.Widgets
genericHandlers = null; genericHandlers = null;
this.Owner = null; this.Owner = null;
InspectorManager.OnInspectedTabsChanged -= InspectorManager_OnInspectedTabsChanged;
}
private void InspectorManager_OnInspectedTabsChanged()
{
foreach (var handler in this.paramHandlers)
handler.PopulateDropdown();
} }
public Type[] TryParseGenericArguments() public Type[] TryParseGenericArguments()

View File

@ -1,9 +1,12 @@
using System; using HarmonyLib;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Reflection; using System.Reflection;
using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
using UnityExplorer.CacheObject.IValues; using UnityExplorer.CacheObject.IValues;
using UnityExplorer.UI.Panels;
using UnityExplorer.UI.Widgets.AutoComplete; using UnityExplorer.UI.Widgets.AutoComplete;
using UniverseLib; using UniverseLib;
using UniverseLib.UI; using UniverseLib.UI;
@ -15,11 +18,15 @@ namespace UnityExplorer.UI.Widgets
private ParameterInfo paramInfo; private ParameterInfo paramInfo;
private Type paramType; private Type paramType;
internal Dropdown dropdown;
private bool usingDropdown;
internal EnumCompleter enumCompleter; internal EnumCompleter enumCompleter;
private ButtonRef enumHelperButton; private ButtonRef enumHelperButton;
private bool usingBasicLabel;
private object basicValue;
private GameObject basicLabelHolder;
private Text basicLabel;
private ButtonRef pasteButton;
public void OnBorrowed(EvaluateWidget evaluator, ParameterInfo paramInfo) public void OnBorrowed(EvaluateWidget evaluator, ParameterInfo paramInfo)
{ {
this.evaluator = evaluator; this.evaluator = evaluator;
@ -34,8 +41,10 @@ namespace UnityExplorer.UI.Widgets
if (ParseUtility.CanParse(paramType) || typeof(Type).IsAssignableFrom(paramType)) if (ParseUtility.CanParse(paramType) || typeof(Type).IsAssignableFrom(paramType))
{ {
usingBasicLabel = false;
this.inputField.Component.gameObject.SetActive(true); this.inputField.Component.gameObject.SetActive(true);
this.dropdown.gameObject.SetActive(false); this.basicLabelHolder.SetActive(false);
this.typeCompleter.Enabled = typeof(Type).IsAssignableFrom(paramType); this.typeCompleter.Enabled = typeof(Type).IsAssignableFrom(paramType);
this.enumCompleter.Enabled = paramType.IsEnum; this.enumCompleter.Enabled = paramType.IsEnum;
this.enumHelperButton.Component.gameObject.SetActive(paramType.IsEnum); this.enumHelperButton.Component.gameObject.SetActive(paramType.IsEnum);
@ -63,16 +72,15 @@ namespace UnityExplorer.UI.Widgets
else else
{ {
// non-parsable, and not a Type // non-parsable, and not a Type
usingBasicLabel = true;
this.inputField.Component.gameObject.SetActive(false); this.inputField.Component.gameObject.SetActive(false);
this.dropdown.gameObject.SetActive(true); this.basicLabelHolder.SetActive(true);
this.typeCompleter.Enabled = false; this.typeCompleter.Enabled = false;
this.enumCompleter.Enabled = false; this.enumCompleter.Enabled = false;
this.enumHelperButton.Component.gameObject.SetActive(false); this.enumHelperButton.Component.gameObject.SetActive(false);
usingDropdown = true; SetDisplayedValueFromPaste();
PopulateDropdown();
InspectorManager.OnInspectedTabsChanged += PopulateDropdown;
} }
} }
@ -81,109 +89,89 @@ namespace UnityExplorer.UI.Widgets
this.evaluator = null; this.evaluator = null;
this.paramInfo = null; this.paramInfo = null;
usingDropdown = false;
this.enumCompleter.Enabled = false; this.enumCompleter.Enabled = false;
this.typeCompleter.Enabled = false; this.typeCompleter.Enabled = false;
this.inputField.Text = ""; this.inputField.Text = "";
InspectorManager.OnInspectedTabsChanged -= PopulateDropdown; this.usingBasicLabel = false;
this.basicValue = null;
} }
public object Evaluate() public object Evaluate()
{ {
if (!usingDropdown) if (usingBasicLabel)
return basicValue;
var input = this.inputField.Text;
if (typeof(Type).IsAssignableFrom(paramType))
return ReflectionUtility.GetTypeByName(input);
if (paramType == typeof(string))
return input;
if (string.IsNullOrEmpty(input))
{ {
var input = this.inputField.Text; if (paramInfo.IsOptional)
return paramInfo.DefaultValue;
if (typeof(Type).IsAssignableFrom(paramType))
return ReflectionUtility.GetTypeByName(input);
if (paramType == typeof(string))
return input;
if (string.IsNullOrEmpty(input))
{
if (paramInfo.IsOptional)
return paramInfo.DefaultValue;
else
return null;
}
if (!ParseUtility.TryParse(input, paramType, out object parsed, out Exception ex))
{
ExplorerCore.LogWarning($"Cannot parse argument '{paramInfo.Name}' ({paramInfo.ParameterType.Name})" +
$"{(ex == null ? "" : $", {ex.GetType().Name}: {ex.Message}")}");
return null;
}
else else
return parsed; return null;
}
if (!ParseUtility.TryParse(input, paramType, out object parsed, out Exception ex))
{
ExplorerCore.LogWarning($"Cannot parse argument '{paramInfo.Name}' ({paramInfo.ParameterType.Name})" +
$"{(ex == null ? "" : $", {ex.GetType().Name}: {ex.Message}")}");
return null;
} }
else else
return parsed;
}
private void OnPasteClicked()
{
if (ClipboardPanel.TryPaste(this.paramType, out object paste))
{ {
if (dropdown.value == 0) basicValue = paste;
return null; SetDisplayedValueFromPaste();
}
}
private void SetDisplayedValueFromPaste()
{
if (usingBasicLabel)
basicLabel.text = ToStringUtility.ToStringWithType(basicValue, paramType, false);
else
{
if (typeof(Type).IsAssignableFrom(paramType))
inputField.Text = (basicValue as Type).FullDescription();
else else
return dropdownUnderlyingValues[dropdown.value]; inputField.Text = ParseUtility.ToStringForInput(basicValue, paramType);
} }
} }
private object[] dropdownUnderlyingValues;
internal void PopulateDropdown()
{
if (!usingDropdown)
return;
dropdown.options.Clear();
var underlyingValues = new List<object>();
dropdown.options.Add(new Dropdown.OptionData("null"));
underlyingValues.Add(null);
var argType = paramType;
int tabIndex = 0;
foreach (var tab in InspectorManager.Inspectors)
{
tabIndex++;
if (argType.IsAssignableFrom(tab.Target.GetActualType()))
{
dropdown.options.Add(new Dropdown.OptionData($"Tab {tabIndex}: {tab.Tab.TabText.text}"));
underlyingValues.Add(tab.Target);
}
}
dropdownUnderlyingValues = underlyingValues.ToArray();
}
private void EnumHelper_OnClick()
{
enumCompleter.HelperButtonClicked();
}
public override void CreateSpecialContent() public override void CreateSpecialContent()
{ {
enumCompleter = new(paramType, this.inputField)
{
Enabled = false
};
enumHelperButton = UIFactory.CreateButton(UIRoot, "EnumHelper", "▼"); enumHelperButton = UIFactory.CreateButton(UIRoot, "EnumHelper", "▼");
UIFactory.SetLayoutElement(enumHelperButton.Component.gameObject, minWidth: 25, minHeight: 25, flexibleWidth: 0, flexibleHeight: 0); UIFactory.SetLayoutElement(enumHelperButton.Component.gameObject, minWidth: 25, minHeight: 25, flexibleWidth: 0, flexibleHeight: 0);
enumHelperButton.OnClick += EnumHelper_OnClick; enumHelperButton.OnClick += enumCompleter.HelperButtonClicked;
var dropdownObj = UIFactory.CreateDropdown(UIRoot, out dropdown, "Select argument...", 14, (int val) => basicLabelHolder = UIFactory.CreateHorizontalGroup(UIRoot, "BasicLabelHolder", true, true, true, true, bgColor: new(0.1f, 0.1f, 0.1f));
{ UIFactory.SetLayoutElement(basicLabelHolder, minHeight: 25, flexibleHeight: 50, minWidth: 100, flexibleWidth: 1000);
//ArgDropdownChanged(val); basicLabel = UIFactory.CreateLabel(basicLabelHolder, "BasicLabel", "null", TextAnchor.MiddleLeft);
}); basicLabel.gameObject.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
UIFactory.SetLayoutElement(dropdownObj, minHeight: 25, flexibleHeight: 50, minWidth: 100, flexibleWidth: 1000);
dropdownObj.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
enumCompleter = new EnumCompleter(paramType, this.inputField); pasteButton = UIFactory.CreateButton(UIRoot, "PasteButton", "Paste", new Color(0.13f, 0.13f, 0.13f, 1f));
enumCompleter.Enabled = false; UIFactory.SetLayoutElement(pasteButton.Component.gameObject, minHeight: 25, minWidth: 28, flexibleWidth: 0);
pasteButton.ButtonText.color = Color.green;
pasteButton.ButtonText.fontSize = 10;
pasteButton.OnClick += OnPasteClicked;
} }
//private void ArgDropdownChanged(int value)
//{
// // not needed
//}
} }
} }

View File

@ -172,13 +172,13 @@
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="UniverseLib.Mono"> <Reference Include="UniverseLib.Mono">
<HintPath>packages\UniverseLib.1.0.4\lib\net35\UniverseLib.Mono.dll</HintPath> <HintPath>packages\UniverseLib.1.0.6\lib\net35\UniverseLib.Mono.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<!-- Il2Cpp refs --> <!-- Il2Cpp refs -->
<ItemGroup Condition="'$(IsCpp)'=='true'"> <ItemGroup Condition="'$(IsCpp)'=='true'">
<Reference Include="UniverseLib.IL2CPP"> <Reference Include="UniverseLib.IL2CPP">
<HintPath>packages\UniverseLib.1.0.4\lib\net472\UniverseLib.IL2CPP.dll</HintPath> <HintPath>packages\UniverseLib.1.0.6\lib\net472\UniverseLib.IL2CPP.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnhollowerBaseLib"> <Reference Include="UnhollowerBaseLib">
<HintPath>..\lib\Il2CppAssemblyUnhollower\UnhollowerBaseLib\bin\Release\net4.7.2\UnhollowerBaseLib.dll</HintPath> <HintPath>..\lib\Il2CppAssemblyUnhollower\UnhollowerBaseLib\bin\Release\net4.7.2\UnhollowerBaseLib.dll</HintPath>
@ -222,7 +222,6 @@
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="UI\Clipboard\Clipboard.cs" />
<Compile Include="Hooks\HookCell.cs" /> <Compile Include="Hooks\HookCell.cs" />
<Compile Include="Hooks\HookInstance.cs" /> <Compile Include="Hooks\HookInstance.cs" />
<Compile Include="Hooks\HookManager.cs" /> <Compile Include="Hooks\HookManager.cs" />
@ -257,6 +256,8 @@
<Compile Include="CacheObject\Views\CacheListEntryCell.cs" /> <Compile Include="CacheObject\Views\CacheListEntryCell.cs" />
<Compile Include="CacheObject\Views\CacheMemberCell.cs" /> <Compile Include="CacheObject\Views\CacheMemberCell.cs" />
<Compile Include="CacheObject\Views\CacheObjectCell.cs" /> <Compile Include="CacheObject\Views\CacheObjectCell.cs" />
<Compile Include="UI\Notification.cs" />
<Compile Include="UI\Panels\ClipboardPanel.cs" />
<Compile Include="UI\Widgets\AutoComplete\EnumCompleter.cs" /> <Compile Include="UI\Widgets\AutoComplete\EnumCompleter.cs" />
<Compile Include="UI\Widgets\EvaluateWidget\EvaluateWidget.cs" /> <Compile Include="UI\Widgets\EvaluateWidget\EvaluateWidget.cs" />
<Compile Include="Inspectors\GameObjectInspector.cs" /> <Compile Include="Inspectors\GameObjectInspector.cs" />
@ -276,7 +277,7 @@
<Compile Include="Inspectors\ReflectionInspector.cs" /> <Compile Include="Inspectors\ReflectionInspector.cs" />
<Compile Include="CacheObject\IValues\InteractiveValueStruct.cs" /> <Compile Include="CacheObject\IValues\InteractiveValueStruct.cs" />
<Compile Include="UI\Panels\HookManagerPanel.cs" /> <Compile Include="UI\Panels\HookManagerPanel.cs" />
<Compile Include="UI\Panels\UiInspectorResultsPanel.cs" /> <Compile Include="UI\Panels\UIInspectorResultsPanel.cs" />
<Compile Include="UI\Panels\LogPanel.cs" /> <Compile Include="UI\Panels\LogPanel.cs" />
<Compile Include="UI\Panels\CSConsolePanel.cs" /> <Compile Include="UI\Panels\CSConsolePanel.cs" />
<Compile Include="UI\Panels\OptionsPanel.cs" /> <Compile Include="UI\Panels\OptionsPanel.cs" />

View File

@ -4,5 +4,5 @@
<package id="ILRepack.Lib.MSBuild.Task" version="2.0.18.2" targetFramework="net35" /> <package id="ILRepack.Lib.MSBuild.Task" version="2.0.18.2" targetFramework="net35" />
<package id="ini-parser" version="2.5.2" targetFramework="net35" /> <package id="ini-parser" version="2.5.2" targetFramework="net35" />
<package id="Mono.Cecil" version="0.10.4" targetFramework="net35" /> <package id="Mono.Cecil" version="0.10.4" targetFramework="net35" />
<package id="UniverseLib" version="1.0.4" targetFramework="net35" /> <package id="UniverseLib" version="1.0.6" targetFramework="net35" />
</packages> </packages>