canto/Assets/Scripts/UI/UiElementInstance.cs
2025-07-18 20:38:44 -04:00

71 lines
1.7 KiB
C#

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();
}
}
}