using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; using UnityEngine.UI; using UnityExplorer.UI.ObjectPool; using UnityExplorer.UI.Panels; namespace UnityExplorer.UI.Inspectors { public static class InspectorManager { public static readonly List Inspectors = new List(); public static InspectorBase ActiveInspector { get; private set; } public static float PanelWidth; public static void Inspect(object obj) { if (obj.IsNullOrDestroyed()) return; obj = obj.TryCast(); if (obj is GameObject) CreateInspector(obj); else CreateInspector(obj); } public static void Inspect(Type type) { CreateInspector(type, true); } public static void SetInspectorActive(InspectorBase inspector) { UnsetActiveInspector(); ActiveInspector = inspector; inspector.OnSetActive(); } public static void UnsetActiveInspector() { if (ActiveInspector != null) ActiveInspector.OnSetInactive(); } private static void CreateInspector(object target, bool staticReflection = false) where T : InspectorBase { var inspector = Pool.Borrow(); Inspectors.Add(inspector); UIManager.SetPanelActive(UIManager.Panels.Inspector, true); inspector.UIRoot.transform.SetParent(InspectorPanel.Instance.ContentHolder.transform, false); if (inspector is ReflectionInspector reflectInspector) reflectInspector.StaticOnly = staticReflection; inspector.OnBorrowedFromPool(target); SetInspectorActive(inspector); } internal static void ReleaseInspector(T inspector) where T : InspectorBase { inspector.OnReturnToPool(); Pool.Return(inspector); Inspectors.Remove(inspector); } internal static void Update() { for (int i = Inspectors.Count - 1; i >= 0; i--) Inspectors[i].Update(); } internal static void OnPanelResized(float width) { PanelWidth = width; foreach (var obj in Inspectors) { if (obj is ReflectionInspector inspector) { inspector.SetLayouts(); } } } } }