using Godot; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using BITKit; using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; namespace BITFactory; public partial class IDIS_RegisterService : Node { [ExportCategory("Services")] [Export] private IDIS_Service service; [Export] private IDIS_TemplateService templateService; [ExportCategory("UI 绑定")] [Export] private NodeBuilder templateIndexBuilder; [Export] private LineEdit handleEdit; [Export] private Button generateHandleButton; [Export] private NodeBuilder templateFormatBuilder; [Export] private Button registerButton; [Export] private ProgressBar registerProgress; [ExportCategory("Register Reference")] [Export] private Control referenceContainer; [Export] private Button addReferenceButton; [ExportCategory("Hints")] [Export] private Label hints; private readonly List<(string format,string value,string category)> _currentValues = new(); private readonly List _currentReferences = new(); public override void _Ready() { registerButton.Pressed += Register; generateHandleButton.Pressed += ()=>handleEdit.Text = IDIS_Service.GenerateHandle(); addReferenceButton.Pressed += AddReferenceEdit; handleEdit.Editable = false; registerButton.Disabled = true; Rebuild(); } private void Rebuild() { if (Engine.IsEditorHint()) return; templateIndexBuilder.Clear(); templateFormatBuilder.Clear(); foreach (var x in templateService.templates) { var container = templateIndexBuilder.Build(); container.button.Text = x.TemplateName; container.button.Pressed += () => { Entry(x); }; } } private void Entry(IDIS_Template template) { _currentValues.Clear(); templateFormatBuilder.Clear(); var currentIndex = 0; foreach (var x in template.Formats) { var myIndex = currentIndex++; _currentValues.Add((x.format, string.Empty, x.category)); var formatContainer = templateFormatBuilder.Build(); formatContainer.labels[0].Text = x.format; formatContainer.lineEdits[0].PlaceholderText = x.hint; formatContainer.lineEdits[0].TextChanged += s => { var value = _currentValues[myIndex]; value.value = s; _currentValues[myIndex] = value; }; } handleEdit.Editable = true; registerButton.Disabled = false; } private void AddReferenceEdit() { var lineEdit = new LineEdit(); var currentIndex = referenceContainer.GetChildCount(); _currentReferences.Add(string.Empty); lineEdit.TextChanged += s => { _currentReferences[currentIndex] = s; }; lineEdit.Text = "88.123.99/"; referenceContainer.AddChild(lineEdit); } private void Register() { if (_currentValues.Any(x => string.IsNullOrEmpty(x.format) || string.IsNullOrEmpty(x.value) || string.IsNullOrEmpty(x.category))) { hints.SetTextAsync("请填写完整的数据格式"); return; } var handle = string.IsNullOrEmpty(handleEdit.Text) ? IDIS_Service.GenerateHandle() : handleEdit.Text; var dataJson = JsonHelper.Get(_currentValues); var referenceJson = JsonHelper.Get(_currentReferences); BIT4Log.Log($"注册标识:{handle}"); BIT4Log.Log($"\n{dataJson}"); BIT4Log.Log("注册引用:"); BIT4Log.Log($"\n{referenceJson}"); hints.Text="正在注册..."; service.Register(handle); foreach (var x in _currentValues) { service.Register(handle, x.format, x.value,x.category); } foreach (var x in _currentReferences) { service.RegisterReference(handle, x); } var tween = CreateTween(); registerButton.Disabled = true; registerProgress.Value = 0; tween.TweenProperty(registerProgress, "value", registerProgress.MaxValue, 0.5f); tween.Finished+= () => { registerProgress.Value = 0; registerProgress.Visible = false; registerButton.Disabled = false; hints.Text = "注册成功"; tween.Stop(); }; tween.Play(); handleEdit.Text = string.Empty; } }