mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-16 14:17:51 +08:00
361 lines
14 KiB
C#
361 lines
14 KiB
C#
//using System;
|
|
//using System.Collections.Generic;
|
|
//using System.Linq;
|
|
//using System.Reflection;
|
|
//using UnityEngine;
|
|
//using UnityEngine.UI;
|
|
//using UnityExplorer.UI;
|
|
//using UnityExplorer.Core.Runtime;
|
|
//using UnityExplorer.Core;
|
|
//using UnityExplorer.UI.Utility;
|
|
//using UnityExplorer.UI.InteractiveValues;
|
|
//using UnityExplorer.Inspectors.Reflection;
|
|
//using UnityExplorer.UI.Panels;
|
|
|
|
//namespace UnityExplorer.UI.CacheObject
|
|
//{
|
|
// public abstract class CacheMember : CacheObjectBase
|
|
// {
|
|
// public override bool IsMember => true;
|
|
|
|
// public override Type FallbackType { get; }
|
|
|
|
// public ReflectionInspector ParentInspector { get; set; }
|
|
// public MemberInfo MemInfo { get; set; }
|
|
// public Type DeclaringType { get; set; }
|
|
// public object DeclaringInstance { get; set; }
|
|
// public virtual bool IsStatic { get; private set; }
|
|
|
|
// public string ReflectionException { get; set; }
|
|
|
|
// public override bool CanWrite => m_canWrite ?? GetCanWrite();
|
|
// private bool? m_canWrite;
|
|
|
|
// public override bool HasParameters => ParamCount > 0;
|
|
// public virtual int ParamCount => m_arguments.Length;
|
|
// public override bool HasEvaluated => m_evaluated;
|
|
// public bool m_evaluated = false;
|
|
// public bool m_isEvaluating;
|
|
// public ParameterInfo[] m_arguments = new ParameterInfo[0];
|
|
// public string[] m_argumentInput = new string[0];
|
|
|
|
// public string NameForFiltering => m_nameForFilter ?? (m_nameForFilter = $"{MemInfo.DeclaringType.Name}.{MemInfo.Name}".ToLower());
|
|
// private string m_nameForFilter;
|
|
|
|
// public string RichTextName => m_richTextName ?? GetRichTextName();
|
|
// private string m_richTextName;
|
|
|
|
// public CacheMember(MemberInfo memberInfo, object declaringInstance, GameObject parentContent)
|
|
// {
|
|
// MemInfo = memberInfo;
|
|
// DeclaringType = memberInfo.DeclaringType;
|
|
// DeclaringInstance = declaringInstance;
|
|
// this.m_parentContent = parentContent;
|
|
|
|
// DeclaringInstance = ReflectionProvider.Instance.Cast(declaringInstance, DeclaringType);
|
|
// }
|
|
|
|
// public override void Enable()
|
|
// {
|
|
// base.Enable();
|
|
|
|
// ParentInspector.displayedMembers.Add(this);
|
|
|
|
// memberLabelElement.minWidth = 0.4f * InspectorPanel.CurrentPanelWidth;
|
|
// }
|
|
|
|
// public override void Disable()
|
|
// {
|
|
// base.Disable();
|
|
|
|
// ParentInspector.displayedMembers.Remove(this);
|
|
// }
|
|
|
|
// public static bool CanProcessArgs(ParameterInfo[] parameters)
|
|
// {
|
|
// foreach (var param in parameters)
|
|
// {
|
|
// var pType = param.ParameterType;
|
|
|
|
// if (pType.IsByRef && pType.HasElementType)
|
|
// pType = pType.GetElementType();
|
|
|
|
// if (pType != null && (pType.IsPrimitive || pType == typeof(string)))
|
|
// continue;
|
|
// else
|
|
// return false;
|
|
// }
|
|
// return true;
|
|
// }
|
|
|
|
// public override void CreateIValue(object value, Type fallbackType)
|
|
// {
|
|
// IValue = InteractiveValue.Create(value, fallbackType);
|
|
// IValue.Owner = this;
|
|
// IValue.m_mainContentParent = this.ContentGroup;
|
|
// IValue.m_subContentParent = this.SubContentGroup;
|
|
// }
|
|
|
|
// public override void UpdateValue()
|
|
// {
|
|
// if (!HasParameters || m_isEvaluating)
|
|
// {
|
|
// try
|
|
// {
|
|
// Type baseType = ReflectionUtility.GetActualType(IValue.Value) ?? FallbackType;
|
|
|
|
// if (!ReflectionProvider.Instance.IsReflectionSupported(baseType))
|
|
// throw new Exception("Type not supported with reflection");
|
|
|
|
// UpdateReflection();
|
|
|
|
// if (IValue.Value != null)
|
|
// IValue.Value = IValue.Value.TryCast(ReflectionUtility.GetActualType(IValue.Value));
|
|
// }
|
|
// catch (Exception e)
|
|
// {
|
|
// ReflectionException = e.ReflectionExToString(true);
|
|
// }
|
|
// }
|
|
|
|
// base.UpdateValue();
|
|
// }
|
|
|
|
// public abstract void UpdateReflection();
|
|
|
|
// public override void SetValue()
|
|
// {
|
|
// // no implementation for base class
|
|
// }
|
|
|
|
// public object[] ParseArguments()
|
|
// {
|
|
// if (m_arguments.Length < 1)
|
|
// return new object[0];
|
|
|
|
// var parsedArgs = new List<object>();
|
|
// for (int i = 0; i < m_arguments.Length; i++)
|
|
// {
|
|
// var input = m_argumentInput[i];
|
|
// var type = m_arguments[i].ParameterType;
|
|
|
|
// if (type.IsByRef)
|
|
// type = type.GetElementType();
|
|
|
|
// if (!string.IsNullOrEmpty(input))
|
|
// {
|
|
// if (type == typeof(string))
|
|
// {
|
|
// parsedArgs.Add(input);
|
|
// continue;
|
|
// }
|
|
// else
|
|
// {
|
|
// try
|
|
// {
|
|
// var arg = type.GetMethod("Parse", new Type[] { typeof(string) })
|
|
// .Invoke(null, new object[] { input });
|
|
|
|
// parsedArgs.Add(arg);
|
|
// continue;
|
|
// }
|
|
// catch
|
|
// {
|
|
// ExplorerCore.Log($"Could not parse input '{input}' for argument #{i} '{m_arguments[i].Name}' ({type.FullName})");
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// // No input, see if there is a default value.
|
|
// if (m_arguments[i].IsOptional)
|
|
// {
|
|
// parsedArgs.Add(m_arguments[i].DefaultValue);
|
|
// continue;
|
|
// }
|
|
|
|
// // Try add a null arg I guess
|
|
// parsedArgs.Add(null);
|
|
// }
|
|
|
|
// return parsedArgs.ToArray();
|
|
// }
|
|
|
|
// private bool GetCanWrite()
|
|
// {
|
|
// if (MemInfo is FieldInfo fi)
|
|
// m_canWrite = !(fi.IsLiteral && !fi.IsInitOnly);
|
|
// else if (MemInfo is PropertyInfo pi)
|
|
// m_canWrite = pi.CanWrite;
|
|
// else
|
|
// m_canWrite = false;
|
|
|
|
// return (bool)m_canWrite;
|
|
// }
|
|
|
|
// private string GetRichTextName()
|
|
// {
|
|
// return m_richTextName = SignatureHighlighter.ParseFullSyntax(MemInfo.DeclaringType, false, MemInfo);
|
|
// }
|
|
|
|
// #region UI
|
|
|
|
// internal Text memberLabelText;
|
|
// internal GameObject ContentGroup;
|
|
|
|
// internal LayoutElement memberLabelElement;
|
|
|
|
// internal override void ConstructUI()
|
|
// {
|
|
// base.ConstructUI();
|
|
|
|
// var horiGroup = UIFactory.CreateUIObject("HoriGroup", UIRoot);
|
|
// var groupRect = horiGroup.GetComponent<RectTransform>();
|
|
// groupRect.pivot = new Vector2(0, 1);
|
|
// groupRect.anchorMin = Vector2.zero;
|
|
// groupRect.anchorMax = Vector2.one;
|
|
// UIFactory.SetLayoutElement(horiGroup, minHeight: 30, flexibleHeight: 9999);
|
|
// UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(horiGroup, true, true, true, true, 2, 2, 2, 2, 2, childAlignment: TextAnchor.UpperLeft);
|
|
|
|
// memberLabelText = UIFactory.CreateLabel(horiGroup, "MemLabelText", RichTextName, TextAnchor.UpperLeft);
|
|
// memberLabelText.horizontalOverflow = HorizontalWrapMode.Wrap;
|
|
// UIFactory.SetLayoutElement(memberLabelText.gameObject, minHeight: 25, flexibleHeight: 9999, minWidth: 150, flexibleWidth: 0);
|
|
|
|
// memberLabelElement = memberLabelText.GetComponent<LayoutElement>();
|
|
|
|
// ContentGroup = UIFactory.CreateUIObject("ContentGroup", horiGroup, default);
|
|
// UIFactory.SetLayoutElement(ContentGroup, minHeight: 30, flexibleWidth: 9999);
|
|
// var contentRect = ContentGroup.GetComponent<RectTransform>();
|
|
// contentRect.pivot = new Vector2(0, 1);
|
|
// contentRect.anchorMin = new Vector2(0, 0);
|
|
// contentRect.anchorMax = new Vector2(1, 1);
|
|
// UIFactory.SetLayoutGroup<VerticalLayoutGroup>(ContentGroup, false, false, true, true, childAlignment: TextAnchor.MiddleLeft);
|
|
|
|
// ConstructArgInput(out GameObject argsHolder);
|
|
|
|
// ConstructEvaluateButtons(argsHolder);
|
|
|
|
// IValue.m_mainContentParent = this.ContentGroup;
|
|
|
|
// //RightContentGroup.SetActive(false);
|
|
|
|
// // ParentInspector.CacheObjectContents.Add(this.m_mainContent);
|
|
// }
|
|
|
|
// internal void ConstructArgInput(out GameObject argsHolder)
|
|
// {
|
|
// argsHolder = null;
|
|
|
|
// if (HasParameters)
|
|
// {
|
|
// argsHolder = UIFactory.CreateVerticalGroup(ContentGroup, "ArgsHolder", true, false, true, true, 4, new Color(1, 1, 1, 0));
|
|
|
|
// if (this is CacheMethod cm && cm.GenericArgs.Length > 0)
|
|
// cm.ConstructGenericArgInput(argsHolder);
|
|
|
|
// if (m_arguments.Length > 0)
|
|
// {
|
|
// UIFactory.CreateLabel(argsHolder, "ArgumentsLabel", "Arguments:", TextAnchor.MiddleLeft);
|
|
|
|
// for (int i = 0; i < m_arguments.Length; i++)
|
|
// AddArgRow(i, argsHolder);
|
|
// }
|
|
|
|
// argsHolder.SetActive(false);
|
|
// }
|
|
// }
|
|
|
|
// internal void AddArgRow(int i, GameObject parent)
|
|
// {
|
|
// var arg = m_arguments[i];
|
|
|
|
// var rowObj = UIFactory.CreateHorizontalGroup(parent, "ArgRow", true, false, true, true, 4, default, new Color(1, 1, 1, 0));
|
|
// UIFactory.SetLayoutElement(rowObj, minHeight: 25, flexibleWidth: 5000);
|
|
|
|
// var argTypeTxt = SignatureHighlighter.ParseFullSyntax(arg.ParameterType, false);
|
|
// var argLabel = UIFactory.CreateLabel(rowObj, "ArgLabel", $"{argTypeTxt} <color={SignatureHighlighter.LOCAL_ARG}>{arg.Name}</color>",
|
|
// TextAnchor.MiddleLeft);
|
|
// UIFactory.SetLayoutElement(argLabel.gameObject, minHeight: 25);
|
|
|
|
// var argInputObj = UIFactory.CreateInputField(rowObj, "ArgInput", "...", out InputField argInput, 14, (int)TextAnchor.MiddleLeft, 1);
|
|
// UIFactory.SetLayoutElement(argInputObj, flexibleWidth: 1200, preferredWidth: 150, minWidth: 20, minHeight: 25, flexibleHeight: 0);
|
|
|
|
// argInput.onValueChanged.AddListener((string val) => { m_argumentInput[i] = val; });
|
|
|
|
// if (arg.IsOptional)
|
|
// {
|
|
// var phInput = argInput.placeholder.GetComponent<Text>();
|
|
// phInput.text = " = " + arg.DefaultValue?.ToString() ?? "null";
|
|
// }
|
|
// }
|
|
|
|
// internal void ConstructEvaluateButtons(GameObject argsHolder)
|
|
// {
|
|
// if (HasParameters)
|
|
// {
|
|
// var evalGroupObj = UIFactory.CreateHorizontalGroup(ContentGroup, "EvalGroup", false, false, true, true, 5,
|
|
// default, new Color(1, 1, 1, 0));
|
|
// UIFactory.SetLayoutElement(evalGroupObj, minHeight: 25, flexibleHeight: 0, flexibleWidth: 5000);
|
|
|
|
// var evalButton = UIFactory.CreateButton(evalGroupObj,
|
|
// "EvalButton",
|
|
// $"Evaluate ({ParamCount})",
|
|
// null);
|
|
|
|
// RuntimeProvider.Instance.SetColorBlock(evalButton, new Color(0.4f, 0.4f, 0.4f),
|
|
// new Color(0.4f, 0.7f, 0.4f), new Color(0.3f, 0.3f, 0.3f));
|
|
|
|
// UIFactory.SetLayoutElement(evalButton.gameObject, minWidth: 100, minHeight: 22, flexibleWidth: 0);
|
|
|
|
// var evalText = evalButton.GetComponentInChildren<Text>();
|
|
|
|
// var cancelButton = UIFactory.CreateButton(evalGroupObj, "CancelButton", "Close", null, new Color(0.3f, 0.3f, 0.3f));
|
|
// UIFactory.SetLayoutElement(cancelButton.gameObject, minWidth: 100, minHeight: 22, flexibleWidth: 0);
|
|
|
|
// cancelButton.gameObject.SetActive(false);
|
|
|
|
// evalButton.onClick.AddListener(() =>
|
|
// {
|
|
// if (!m_isEvaluating)
|
|
// {
|
|
// argsHolder.SetActive(true);
|
|
// m_isEvaluating = true;
|
|
// evalText.text = "Evaluate";
|
|
// RuntimeProvider.Instance.SetColorBlock(evalButton, new Color(0.3f, 0.6f, 0.3f));
|
|
|
|
// cancelButton.gameObject.SetActive(true);
|
|
// }
|
|
// else
|
|
// {
|
|
// if (this is CacheMethod cm)
|
|
// cm.Evaluate();
|
|
// else
|
|
// UpdateValue();
|
|
// }
|
|
// });
|
|
|
|
// cancelButton.onClick.AddListener(() =>
|
|
// {
|
|
// cancelButton.gameObject.SetActive(false);
|
|
// argsHolder.SetActive(false);
|
|
// m_isEvaluating = false;
|
|
|
|
// evalText.text = $"Evaluate ({ParamCount})";
|
|
// RuntimeProvider.Instance.SetColorBlock(evalButton, new Color(0.4f, 0.4f, 0.4f));
|
|
// });
|
|
// }
|
|
// else if (this is CacheMethod)
|
|
// {
|
|
// // simple method evaluate button
|
|
|
|
// var evalButton = UIFactory.CreateButton(ContentGroup, "EvalButton", "Evaluate", () => { (this as CacheMethod).Evaluate(); });
|
|
// RuntimeProvider.Instance.SetColorBlock(evalButton, new Color(0.4f, 0.4f, 0.4f),
|
|
// new Color(0.4f, 0.7f, 0.4f), new Color(0.3f, 0.3f, 0.3f));
|
|
|
|
// UIFactory.SetLayoutElement(evalButton.gameObject, minWidth: 100, minHeight: 22, flexibleWidth: 0);
|
|
// }
|
|
// }
|
|
|
|
// #endregion
|
|
// }
|
|
//}
|