71 lines
1.7 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|