using Godot; using System; using System.Collections.Generic; using System.Runtime.InteropServices; using BITKit; namespace BITFactory; public partial class IDIS_RegisterService : Node { [ExportCategory("Services")] [Export] private IDIS_Service service; [Export] private IDIS_TemplateService templateService; [ExportCategory("TemplateList")] [Export] private ItemList templateList; [ExportCategory("Register Data")] [Export] private LineEdit handleEdit; [Export] private Button generateHandleButton; [Export] private Control registerContainer; [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 Dictionary> _currentValues = new(); private readonly List _currentReferences = new(); public override void _Ready() { templateList.ItemClicked += OnItemClicked; 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; templateList.Clear(); foreach (var x in templateService.templates) { templateList.AddItem(x.TemplateName); } } private void OnItemClicked(long index, Vector2 atPosition, long mouseButtonIndex) { MathNode.RemoveAllChild(registerContainer); MathNode.RemoveAllChild(referenceContainer); var template = templateService.templates[(int)index]; var grid = new GridContainer(); grid.Columns = 2; grid.AddThemeConstantOverride("h_separation", 64); registerContainer.AddChild(grid); _currentValues.Clear(); var _dirIndex = 0; foreach (var x in template.Formats) { var label = new Label(); var lineEdit = new LineEdit(); var myIndex = _dirIndex++; label.Text = x.format; lineEdit.PlaceholderText = x.hint; lineEdit.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill; _currentValues.Add(myIndex, new KeyValuePair(x.format, x.hint)); lineEdit.TextChanged += (s) => { _currentValues[myIndex] = new KeyValuePair(x.format, s); }; grid.AddChild(label); grid.AddChild(lineEdit); } 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() { 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.Value.Key, x.Value.Value); } 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.Play(); handleEdit.Text = string.Empty; } }