using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UnityEngine; using UnityEngine.UIElements; namespace BITKit.UX { /// /// 基于Json的Table生成元素 /// public class JsonBasedTable : VisualElement { public new class UxmlTraits : VisualElement.UxmlTraits { private readonly UxmlStringAttributeDescription m_JsonAttribute = new () { name = "Json" }; private readonly UxmlBoolAttributeDescription m_allowWarningsAttribute = new () { name = "allowWarnings", defaultValue = false }; public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc) { base.Init(ve, bag, cc); var table = (JsonBasedTable)ve; table.Json = m_JsonAttribute.GetValueFromBag(bag, cc); table.AllowWarning = m_allowWarningsAttribute.GetValueFromBag(bag, cc); } } public new class UxmlFactory : UxmlFactory { } private string _json; public string Json { get => _json; set { _json = value; ApplyJson(); } } public bool AllowWarning { get; set; } private readonly List instanceColumns = new(); private void ApplyJson() { try { Clear(); style.flexDirection = FlexDirection.Row; style.justifyContent = Justify.FlexStart; instanceColumns.Clear(); if (string.IsNullOrEmpty(Json)) return; var jArray = JArray.Parse(Json); var colLength = jArray.Max(x => x.Count()); var rowLength = jArray.Count; for (var i = 0; i < colLength; i++) { var newContainer = this.Create(); newContainer.name = $"{nameof(VisualElement)}-{i}"; instanceColumns.Add(newContainer); } for (var y = 0; y < rowLength; y++) { var array = jArray[y] as JArray; for (var x = 0; x < colLength; x++) { var instance = instanceColumns[x]; if (x >= array!.Count) { instance.Create(); } else { var label = instance.Create