using Godot; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Threading; using BITKit; using Cysharp.Threading.Tasks; using IDIS.Models; using IDIS.Services; using Microsoft.Extensions.DependencyInjection; using SQLitePCL; // ReSharper disable UnusedMember.Local namespace IDIS; public partial class IDIS_TemplateBuilder : EntityComponent { private enum TemplateFieldFormatType { String=0, Int=1, Float=2, DateTime=3, Guid=4, } private class IDIS_TemplateItem { public readonly LineEdit NameEdit; public readonly OptionButton TypeButton; public readonly Button RemoveButton; public IDIS_TemplateItem(LineEdit nameEdit, OptionButton typeButton, Button removeButton) { NameEdit = nameEdit; TypeButton = typeButton; RemoveButton = removeButton; } } [Export] private UXContainer prefixEdit; [Export] private UXContainer versionEdit; [Export] private UXContainer descriptionEdit; [Export] private Button createButton; [Export] private Button createEmptyButton; [Export] private Button addItemButton; [Export] private Button deleteButton; [Export] private Label logLabel; [ExportCategory("Builder ")] [Export] private NodeBuilder headerBuilder; [Export] private NodeBuilder contentBuilder; private IDIS_TemplateService _templateService; private ButtonGroup _buttonGroup; private readonly List _items = new(); private IDIS_Template _currentTemplate; public override async void OnStart() { _buttonGroup = new ButtonGroup(); _templateService = Entity.ServiceProvider.GetRequiredService(); createEmptyButton.Pressed += Clear; addItemButton.Pressed += ()=>CreateField(); createButton.Pressed += CreateTemplate; deleteButton.Pressed += Delete; _templateService.OnTemplateCreated +=x=> CreateHeader(x); _templateService.OnTemplateDeleted += OnTemplateDeleted; await BITApp.SwitchToMainThread(); RebuildHeader(); } private void Clear() { contentBuilder.Clear(); _items.Clear(); prefixEdit.lineEdits[0].Text = string.Empty; versionEdit.lineEdits[0].Text = string.Empty; descriptionEdit.lineEdits[0].Text = string.Empty; } private void Entry(IDIS_Template template) { Clear(); foreach (var x in template.Items) { var field = CreateField(); field.NameEdit.Text = x.Name; field.TypeButton.Selected = (int)Enum.Parse(x.IdType); } prefixEdit.lineEdits[0].Text = template.Prefix; versionEdit.lineEdits[0].Text = template.Version; descriptionEdit.lineEdits[0].Text = template.Description; _currentTemplate = template; } private async void CreateTemplate() { var template = new IDIS_Template { Prefix = prefixEdit.lineEdits[0].Text, Version = versionEdit.lineEdits[0].Text, Description = descriptionEdit.lineEdits[0].Text, Items = _items.Select(x => new IDIS_Template_Item(x.NameEdit.Text, x.TypeButton.GetItemText(x.TypeButton.Selected))).ToArray() }; if (string.IsNullOrEmpty(template.Prefix)) { logLabel.Text = "前缀不能为空"; return; } if(string.IsNullOrEmpty(template.Version)) { logLabel.Text = "版本号不能为空"; return; } if(_items.Count is 0) { logLabel.Text = "模板项不能为空"; return; } if(_items.Any(x=>string.IsNullOrEmpty(x.NameEdit.Text) || x.TypeButton.Selected < 0)) { logLabel.Text = "模板项不能为空"; return; } if (Regex.IsMatch(template.Prefix, IDIS_Code.Prefix) is false) { logLabel.Text = $"前缀格式不正确,${template.Prefix} is not match {IDIS_Code.Prefix},use 88.123.99 instead"; return; } createButton.Disabled = true; logLabel.Text = "正在等待 模板服务 响应..."; var response = await _templateService.SaveAsync(template); logLabel.Text = "正在等待 回到主线程..."; await UniTask.SwitchToSynchronizationContext(BITApp.SynchronizationContext); logLabel.Text = response.Message; createButton.Disabled = false; _currentTemplate = template; } private UXContainer CreateHeader(IDIS_Template template) { var container = headerBuilder.Build(); container.buttons[0].ButtonGroup = _buttonGroup; container.buttons[0].Text = $"{template.Prefix} {template.Version}"; container.buttons[0].Pressed += () => Entry(template); return container; } private IDIS_TemplateItem CreateField() { var container = contentBuilder.Build().Create().Create(); var field = new IDIS_TemplateItem(container.Create(), container.Create(),container.Create