using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; using Explorer.UI; using Explorer.UI.Shared; using Explorer.Helpers; namespace Explorer.CacheObject { public class CacheObjectBase { public InteractiveValue IValue; public virtual bool CanWrite => false; public virtual bool HasParameters => false; public virtual bool IsMember => false; public bool IsStaticClassSearchResult { get; set; } public virtual void Init(object obj, Type valueType) { if (valueType == null && obj == null) { return; } //ExplorerCore.Log("Initializing InteractiveValue of type " + valueType.FullName); InteractiveValue interactive; if (valueType == typeof(GameObject) || valueType == typeof(Transform)) { interactive = new InteractiveGameObject(); } else if (valueType == typeof(Texture2D)) { interactive = new InteractiveTexture2D(); } else if (valueType == typeof(Texture)) { interactive = new InteractiveTexture(); } else if (valueType == typeof(Sprite)) { interactive = new InteractiveSprite(); } else if (valueType.IsPrimitive || valueType == typeof(string)) { interactive = new InteractivePrimitive(); } else if (valueType.IsEnum) { if (valueType.GetCustomAttributes(typeof(FlagsAttribute), true) is object[] attributes && attributes.Length > 0) { interactive = new InteractiveFlags(); } else { interactive = new InteractiveEnum(); } } else if (valueType == typeof(Vector2) || valueType == typeof(Vector3) || valueType == typeof(Vector4)) { interactive = new InteractiveVector(); } else if (valueType == typeof(Quaternion)) { interactive = new InteractiveQuaternion(); } else if (valueType == typeof(Color)) { interactive = new InteractiveColor(); } else if (valueType == typeof(Rect)) { interactive = new InteractiveRect(); } // must check this before IsEnumerable else if (ReflectionHelpers.IsDictionary(valueType)) { interactive = new InteractiveDictionary(); } else if (ReflectionHelpers.IsEnumerable(valueType)) { interactive = new InteractiveEnumerable(); } else { interactive = new InteractiveValue(); } interactive.Value = obj; interactive.ValueType = valueType; this.IValue = interactive; this.IValue.OwnerCacheObject = this; UpdateValue(); this.IValue.Init(); } public virtual void Draw(Rect window, float width) { IValue.Draw(window, width); } public virtual void UpdateValue() { IValue.UpdateValue(); } public virtual void SetValue() => throw new NotImplementedException(); } }