using System; using R3; using UnityEngine; using UnityEngine.UIElements; namespace KitsuneCafe.UI { public class UiElementInstance : MonoBehaviour, IDisposable { private IUiElement uiElement; private VisualElement visualElement; private readonly CompositeDisposable activeEffects = new(); private bool configured = false; public void Configure(IUiElement uiElement, VisualElement visualElement) { configured = true; this.uiElement = uiElement; this.visualElement = visualElement; activeEffects.Clear(); uiElement.Configure(visualElement); Raise(UiEvent.OnCreate); } private void Raise(UiEvent evt) { foreach (var effect in uiElement.GetEffectsFor(evt)) { // using explicit null comparison because of the way // GameObjects handle being null if (effect != null) { effect.Instantiate() .Execute(visualElement, destroyCancellationToken) .Subscribe() .AddTo(activeEffects); } } } public void Dispose() { if (!configured) { return; } Raise(UiEvent.OnDestroy); activeEffects.Dispose(); activeEffects.Clear(); uiElement = default; visualElement = default; configured = false; } private void OnDisable() { Dispose(); } private void OnDestroy() { Dispose(); } } }