using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; namespace BITKit.UX { [Serializable] public struct UXBarDictionary:IUXBarService { public static readonly ConcurrentDictionary BarDictionary =new(); [SerializeReference, SubclassSelector] private IReference path; public void SetOrCreate(int id, string name, float value, object data = null) { BarDictionary[path.Value].SetOrCreate(id, name, value, data); } public void Remove(int id) { BarDictionary[path.Value].Remove(id); } } public class UXBarService : MonoBehaviour, IUXBarService { [SerializeField] private UIDocument document; [SerializeReference, SubclassSelector] private IReference path; [SerializeReference, SubclassSelector] private IReference containerPath; [SerializeField] private VisualTreeAsset template; private VisualElement _container; private readonly ConcurrentDictionary _bars = new(); private void Start() { _container = document.rootVisualElement.Q(containerPath.Value); _container.Clear(); UXBarDictionary.BarDictionary.GetOrAdd(path.Value, this); destroyCancellationToken.Register(() => { UXBarDictionary.BarDictionary.TryRemove(path.Value, out _); }); } public void SetOrCreate(int id, string name, float value, object data = null) { var bar = _bars.GetOrAdd(id, Create); var label = bar.Get