using System; using System.Collections.Generic; using System.Collections.ObjectModel; using JetBrains.Annotations; using UnityEngine; namespace RoR2.UI; public class UIElementPairAllocator where T : Component where D : new() { public delegate void ElementOperationDelegate(int index, T element); public readonly RectTransform containerTransform; public readonly GameObject elementPrefab; [NotNull] private List elementControllerComponentsList; [NotNull] public readonly ReadOnlyCollection elements; [NotNull] private List elementControllerDataList; [NotNull] public readonly ReadOnlyCollection elementsData; [CanBeNull] public ElementOperationDelegate onCreateElement; [CanBeNull] public ElementOperationDelegate onDestroyElement; public UIElementPairAllocator([NotNull] RectTransform containerTransform, [NotNull] GameObject elementPrefab) { this.containerTransform = containerTransform; this.elementPrefab = elementPrefab; elementControllerComponentsList = new List(); elements = new ReadOnlyCollection(elementControllerComponentsList); elementControllerDataList = new List(); elementsData = new ReadOnlyCollection(elementControllerDataList); } public void SetData(D val, int index) { elementControllerDataList[index] = val; } public void AllocateElements(int desiredCount) { if (desiredCount < 0) { throw new ArgumentOutOfRangeException(); } for (int num = elementControllerComponentsList.Count - 1; num >= desiredCount; num--) { T val = elementControllerComponentsList[num]; onDestroyElement?.Invoke(num, val); UnityEngine.Object.Destroy(val.gameObject); elementControllerComponentsList.RemoveAt(num); elementControllerDataList.RemoveAt(num); } for (int i = elementControllerComponentsList.Count; i < desiredCount; i++) { T component = UnityEngine.Object.Instantiate(elementPrefab, containerTransform).GetComponent(); elementControllerComponentsList.Add(component); component.gameObject.SetActive(value: true); elementControllerDataList.Add(new D()); onCreateElement?.Invoke(i, component); } } }