BITKit/Packages/Runtime~/Unity/Scripts/UX/Builder/UXBuilder.cs

72 lines
1.7 KiB
C#
Raw Normal View History

2023-08-23 01:59:26 +08:00
using System;
2023-08-11 23:57:37 +08:00
using System.Collections;
using System.Collections.Generic;
using BITKit.UX;
using UnityEngine;
using UnityEngine.UIElements;
2023-08-23 01:59:26 +08:00
// ReSharper disable MemberCanBePrivate.Global
2023-08-11 23:57:37 +08:00
public class UXBuilder : MonoBehaviour
{
[SerializeField, SerializeReference, SubclassSelector]
private IVisualElementProvider visualElementProvider;
[SerializeField] private VisualTreeAsset visualTreeAsset;
2023-08-23 01:59:26 +08:00
[SerializeField] private bool clearOnStart;
2023-08-11 23:57:37 +08:00
private readonly List<VisualElement> instances = new();
2023-08-23 01:59:26 +08:00
private IList ItemSource
{
get => _itemSource;
set => OnBindItemSource(value);
}
private IList _itemSource;
2023-08-11 23:57:37 +08:00
public T Build<T>() where T : VisualElement
{
var clone = visualTreeAsset.CloneTree()[0];
visualElementProvider.GetVisualElement().Add(clone);
instances.Add(clone);
return clone as T;
}
2023-08-23 01:59:26 +08:00
public T Build<T>(Func<VisualElement> createFactory) where T : VisualElement
{
var clone = createFactory.Invoke();
visualElementProvider.GetVisualElement().Add(clone);
instances.Add(clone);
return clone as T;
}
public UXContainer BuildAsContainer(Func<VisualElement> createFactory) => new(Build<VisualElement>(createFactory));
2023-08-11 23:57:37 +08:00
public UXContainer BuildAsContainer() => new(Build<VisualElement>());
public void Clear()
{
foreach (var x in instances)
{
visualElementProvider.GetVisualElement().Remove(x);
}
instances.Clear();
}
2023-08-23 01:59:26 +08:00
private void OnBindItemSource(IList source)
{
_itemSource = source;
}
public void Rebuild()
{
}
private void Start()
{
if (clearOnStart)
{
visualElementProvider.GetVisualElement().Clear();
}
}
2023-08-11 23:57:37 +08:00
}