BITKit/Src/Unity/Scripts/UX/Builder/UXBuilder.cs

78 lines
2.0 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
{
2023-10-06 23:43:19 +08:00
[SerializeReference, SubclassSelector]
2023-08-11 23:57:37 +08:00
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-09-01 14:35:05 +08:00
public VisualElement VisualElement => visualElementProvider.GetVisualElement();
2023-08-23 01:59:26 +08:00
private IList ItemSource
{
get => _itemSource;
set => OnBindItemSource(value);
}
private IList _itemSource;
2023-10-06 23:43:19 +08:00
public T Build<T>() where T : VisualElement,new()
2023-08-11 23:57:37 +08:00
{
2023-10-06 23:43:19 +08:00
var clone =visualTreeAsset is not null ? visualTreeAsset.CloneTree()[0] : new T();
2023-08-11 23:57:37 +08:00
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>());
2024-03-31 23:31:00 +08:00
public void Clear(bool all=false)
2023-08-11 23:57:37 +08:00
{
2024-03-31 23:31:00 +08:00
if (all)
{
visualElementProvider.GetVisualElement().Clear();
return;
}
2023-08-11 23:57:37 +08:00
foreach (var x in instances)
{
2023-10-06 23:43:19 +08:00
x.RemoveFromHierarchy();
//visualElementProvider.GetVisualElement().Remove(x);
2023-08-11 23:57:37 +08:00
}
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
}