UnityExplorer/src/CacheObject/CacheMember.cs

174 lines
6.0 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEngine;
using UnityExplorer.Runtime;
using UnityExplorer.CacheObject.Views;
using UnityExplorer.Inspectors;
2021-12-02 18:35:46 +11:00
using UniverseLib.UI.Models;
using UnityExplorer.UI;
2021-12-02 18:35:46 +11:00
using UniverseLib;
using UniverseLib.UI;
using UnityExplorer.UI.Widgets;
2022-01-31 21:24:01 +11:00
using UniverseLib.Utility;
using UniverseLib.UI.ObjectPool;
using System.Collections;
using HarmonyLib;
namespace UnityExplorer.CacheObject
{
public abstract class CacheMember : CacheObjectBase
{
public abstract Type DeclaringType { get; }
2021-04-30 21:34:50 +10:00
public string NameForFiltering { get; protected set; }
public object DeclaringInstance => IsStatic ? null : (m_declaringInstance ??= Owner.Target.TryCast(DeclaringType));
private object m_declaringInstance;
2021-05-05 21:27:09 +10:00
public abstract bool IsStatic { get; }
2021-05-04 20:10:46 +10:00
public override bool HasArguments => Arguments?.Length > 0 || GenericArguments.Length > 0;
public ParameterInfo[] Arguments { get; protected set; } = new ParameterInfo[0];
public Type[] GenericArguments { get; protected set; } = ArgumentUtility.EmptyTypes;
2021-05-04 20:10:46 +10:00
public EvaluateWidget Evaluator { get; protected set; }
public bool Evaluating => Evaluator != null && Evaluator.UIRoot.activeSelf;
2021-06-05 19:36:09 +10:00
2021-04-30 21:34:50 +10:00
public virtual void SetInspectorOwner(ReflectionInspector inspector, MemberInfo member)
{
this.Owner = inspector;
this.NameLabelText = this switch
{
CacheMethod => SignatureHighlighter.HighlightMethod(member as MethodInfo),
CacheConstructor => SignatureHighlighter.HighlightConstructor(member as ConstructorInfo),
_ => SignatureHighlighter.Parse(member.DeclaringType, false, member),
};
this.NameForFiltering = SignatureHighlighter.RemoveHighlighting(NameLabelText);
this.NameLabelTextRaw = NameForFiltering;
}
2021-05-04 20:10:46 +10:00
public override void ReleasePooledObjects()
{
base.ReleasePooledObjects();
if (this.Evaluator != null)
{
this.Evaluator.OnReturnToPool();
Pool<EvaluateWidget>.Return(this.Evaluator);
this.Evaluator = null;
}
}
2021-05-05 21:27:09 +10:00
public override void UnlinkFromView()
2021-05-04 20:10:46 +10:00
{
if (this.Evaluator != null)
this.Evaluator.UIRoot.transform.SetParent(Pool<EvaluateWidget>.Instance.InactiveHolder.transform, false);
2021-05-05 21:27:09 +10:00
base.UnlinkFromView();
2021-05-04 20:10:46 +10:00
}
protected abstract object TryEvaluate();
protected abstract void TrySetValue(object value);
2021-09-06 15:51:40 +10:00
/// <summary>
/// Evaluate is called when first shown (if ShouldAutoEvaluate), or else when Evaluate button is clicked, or auto-updated.
/// </summary>
public void Evaluate()
2021-05-04 20:10:46 +10:00
{
2021-09-06 15:51:40 +10:00
SetValueFromSource(TryEvaluate());
2021-05-04 20:10:46 +10:00
}
/// <summary>
2021-09-06 15:51:40 +10:00
/// Called when user presses the Evaluate button.
/// </summary>
2021-09-06 15:51:40 +10:00
public void EvaluateAndSetCell()
{
2021-09-06 15:51:40 +10:00
Evaluate();
if (CellView != null)
SetDataToCell(CellView);
}
public override void TrySetUserValue(object value)
{
2021-04-30 21:34:50 +10:00
TrySetValue(value);
Evaluate();
}
protected override void SetValueState(CacheObjectCell cell, ValueStateArgs args)
{
base.SetValueState(cell, args);
}
private static readonly Color evalEnabledColor = new(0.15f, 0.25f, 0.15f);
private static readonly Color evalDisabledColor = new(0.15f, 0.15f, 0.15f);
2021-05-04 20:10:46 +10:00
protected override bool TryAutoEvaluateIfUnitialized(CacheObjectCell objectcell)
{
2021-04-30 21:34:50 +10:00
var cell = objectcell as CacheMemberCell;
cell.EvaluateHolder.SetActive(!ShouldAutoEvaluate);
if (!ShouldAutoEvaluate)
{
2021-05-11 19:18:27 +10:00
cell.EvaluateButton.Component.gameObject.SetActive(true);
if (HasArguments)
2021-05-04 20:10:46 +10:00
{
if (!Evaluating)
cell.EvaluateButton.ButtonText.text = $"Evaluate ({Arguments.Length + GenericArguments.Length})";
else
{
cell.EvaluateButton.ButtonText.text = "Hide";
Evaluator.UIRoot.transform.SetParent(cell.EvaluateHolder.transform, false);
2022-01-31 21:24:01 +11:00
RuntimeHelper.SetColorBlock(cell.EvaluateButton.Component, evalEnabledColor, evalEnabledColor * 1.3f);
2021-05-04 20:10:46 +10:00
}
}
else
cell.EvaluateButton.ButtonText.text = "Evaluate";
2021-05-04 20:10:46 +10:00
if (!Evaluating)
2022-01-31 21:24:01 +11:00
RuntimeHelper.SetColorBlock(cell.EvaluateButton.Component, evalDisabledColor, evalDisabledColor * 1.3f);
}
if (State == ValueState.NotEvaluated && !ShouldAutoEvaluate)
{
SetValueState(cell, ValueStateArgs.Default);
cell.RefreshSubcontentButton();
return false;
}
if (State == ValueState.NotEvaluated)
Evaluate();
return true;
}
2021-05-04 20:10:46 +10:00
public void OnEvaluateClicked()
{
if (!HasArguments)
{
EvaluateAndSetCell();
}
else
{
if (Evaluator == null)
{
this.Evaluator = Pool<EvaluateWidget>.Borrow();
Evaluator.OnBorrowedFromPool(this);
Evaluator.UIRoot.transform.SetParent((CellView as CacheMemberCell).EvaluateHolder.transform, false);
TryAutoEvaluateIfUnitialized(CellView);
2021-05-04 20:10:46 +10:00
}
else
{
if (Evaluator.UIRoot.activeSelf)
Evaluator.UIRoot.SetActive(false);
else
Evaluator.UIRoot.SetActive(true);
TryAutoEvaluateIfUnitialized(CellView);
2021-05-04 20:10:46 +10:00
}
}
}
}
}