diff --git a/src/UI/Widgets/TransformTree/CachedTransform.cs b/src/UI/Widgets/TransformTree/CachedTransform.cs index 5c3f806..b631de3 100644 --- a/src/UI/Widgets/TransformTree/CachedTransform.cs +++ b/src/UI/Widgets/TransformTree/CachedTransform.cs @@ -8,27 +8,31 @@ namespace UnityExplorer.UI.Widgets { public class CachedTransform { - public Transform RefTransform { get; } + public TransformTree Tree { get; } + public Transform Value { get; private set; } + public int InstanceID { get; private set; } public CachedTransform Parent { get; internal set; } - public string Name { get; internal set; } - public int ChildCount { get; internal set; } + //public string Name { get; internal set; } + //public int ChildCount { get; internal set; } public int Depth { get; internal set; } - public bool Expanded { get; set; } + public bool Expanded => Tree.IsCellExpanded(InstanceID); - public CachedTransform(Transform transform, CachedTransform parent = null) + public CachedTransform(TransformTree tree, Transform transform, CachedTransform parent = null) { - RefTransform = transform; - Expanded = false; + Tree = tree; + Value = transform; Parent = parent; - Update(); + Update(transform); } - public void Update() + public void Update(Transform transform) { - Name = RefTransform.name; - ChildCount = RefTransform.childCount; + Value = transform; + InstanceID = transform.GetInstanceID(); + //Name = Value.name; + //ChildCount = Value.childCount; Depth = Parent?.Depth + 1 ?? 0; } } diff --git a/src/UI/Widgets/TransformTree/TransformTree.cs b/src/UI/Widgets/TransformTree/TransformTree.cs index e7cae8d..1e3c01d 100644 --- a/src/UI/Widgets/TransformTree/TransformTree.cs +++ b/src/UI/Widgets/TransformTree/TransformTree.cs @@ -5,34 +5,65 @@ using System.Linq; using System.Text; using UnityEngine; using UnityEngine.UI; -using UnityExplorer.Core; using UnityExplorer.UI.Widgets.InfiniteScroll; namespace UnityExplorer.UI.Widgets { - public class TransformTree : MonoBehaviour, IListDataSource + public class TransformTree : IListDataSource { public Func> GetRootEntriesMethod; + public bool Filtering => !string.IsNullOrEmpty(currentFilter); + private bool wasFiltering; + public string CurrentFilter { get => currentFilter; - set => currentFilter = value?.ToLower() ?? ""; + set + { + currentFilter = value?.ToLower() ?? ""; + if (!wasFiltering && Filtering) + wasFiltering = true; + else if (wasFiltering && !Filtering) + { + wasFiltering = false; + autoExpandedIDs.Clear(); + } + } } private string currentFilter; - internal InfiniteScrollRect infiniteScroll; + internal InfiniteScrollRect Scroller; - //internal readonly List objectTree = new List(); + internal readonly List displayedObjects = new List(); - internal readonly Dictionary objectCache = new Dictionary(); - internal Dictionary tempObjectCache; + private readonly Dictionary objectCache = new Dictionary(); - public int ItemCount => objectCache.Count; + private readonly HashSet expandedInstanceIDs = new HashSet(); + private readonly HashSet autoExpandedIDs = new HashSet(); - internal void Awake() + public int ItemCount => displayedObjects.Count; + + public TransformTree(InfiniteScrollRect infiniteScroller) + { + Scroller = infiniteScroller; + } + + public void Init() { RuntimeProvider.Instance.StartCoroutine(InitCoroutine()); + + //test + var root = new GameObject("StressTest"); + for (int i = 0; i < 100; i++) + { + var obj = new GameObject("GameObject " + i); + obj.transform.parent = root.transform; + for (int j = 0; j < 100; j++) + { + new GameObject("Child " + j).transform.parent = obj.transform; + } + } } private IEnumerator InitCoroutine() @@ -40,51 +71,72 @@ namespace UnityExplorer.UI.Widgets yield return null; RefreshData(); - infiniteScroll.DataSource = this; - infiniteScroll.Initialize(this); + Scroller.DataSource = this; + Scroller.Initialize(this); + } + + public ICell CreateCell(RectTransform cellTransform) + { + var nameButton = cellTransform.Find("NameButton").GetComponent