144 lines
4.1 KiB
C#
144 lines
4.1 KiB
C#
|
using Godot;
|
||
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using BITKit;
|
||
|
|
||
|
namespace BITFactory;
|
||
|
[GlobalClass]
|
||
|
public partial class IDIS_TemplateWeaver : FormWeaverResource
|
||
|
{
|
||
|
[Export] private NodePath addFieldsButtonPath;
|
||
|
[Export] private NodePath templateBuilderPath;
|
||
|
[Export] private NodePath templateNameEditPath;
|
||
|
[Export] private NodePath saveTemplateNameButtonPath;
|
||
|
private Button addFieldsButton => formBuilder.GetNode<Button>(addFieldsButtonPath);
|
||
|
private TemplateBuilder templateBuilder => formBuilder.GetNode<TemplateBuilder>(templateBuilderPath);
|
||
|
private LineEdit templateNameEdit => formBuilder.GetNode<LineEdit>(templateNameEditPath);
|
||
|
private Button saveTemplateNameButton => formBuilder.GetNode<Button>(saveTemplateNameButtonPath);
|
||
|
|
||
|
private readonly List<IDIS_TemplateForm> fields = new();
|
||
|
public override void Weaver(Control container, IFormField formField)
|
||
|
{
|
||
|
var field = formField as IDIS_TemplateForm;
|
||
|
|
||
|
fields.Add(field);
|
||
|
|
||
|
var hBox = container.Create<HBoxContainer>();
|
||
|
var nameEdit = hBox.Create<LineEdit>();
|
||
|
var typeButton = hBox.Create<OptionButton>();
|
||
|
var defaultValueEdit = hBox.Create<LineEdit>();
|
||
|
var categoryEdit = hBox.Create<LineEdit>();
|
||
|
var removeButton = hBox.Create<Button>();
|
||
|
|
||
|
nameEdit.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||
|
typeButton.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||
|
defaultValueEdit.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||
|
categoryEdit.SizeFlagsHorizontal = Control.SizeFlags.ExpandFill;
|
||
|
|
||
|
nameEdit.PlaceholderText="名称";
|
||
|
typeButton.Text = "类型";
|
||
|
defaultValueEdit.PlaceholderText="默认值";
|
||
|
categoryEdit.PlaceholderText="分类";
|
||
|
|
||
|
typeButton.GetPopup().AddItem("string");
|
||
|
typeButton.GetPopup().AddItem("int");
|
||
|
typeButton.GetPopup().AddItem("ulong");
|
||
|
typeButton.GetPopup().AddItem("double");
|
||
|
typeButton.GetPopup().AddItem("h_site");
|
||
|
typeButton.GetPopup().AddItem("base64");
|
||
|
typeButton.GetPopup().AddItem("guid");
|
||
|
|
||
|
typeButton.Selected = 0;
|
||
|
|
||
|
nameEdit.Text = field!.Name;
|
||
|
typeButton.Text = field!.Type;
|
||
|
defaultValueEdit.Text = field!.DefaultValue;
|
||
|
categoryEdit.Text = field!.Category;
|
||
|
removeButton.Text= "删除";
|
||
|
|
||
|
nameEdit.TextChanged+=x=>field!.Name=x;
|
||
|
typeButton.ItemSelected+=x=>field!.Type=typeButton.GetPopup().GetItemText((int)x);
|
||
|
defaultValueEdit.TextChanged+=x=>field!.DefaultValue=x;
|
||
|
categoryEdit.TextChanged+=x=>field!.Category=x;
|
||
|
|
||
|
removeButton.Pressed+=()=>
|
||
|
{
|
||
|
fields.Remove(field!);
|
||
|
container.QueueFree();
|
||
|
|
||
|
var current = templateBuilder.CurrentTemplate.Fields.ToList();
|
||
|
current.Remove(formField);
|
||
|
templateBuilder.CurrentTemplate.Fields = current.ToArray();
|
||
|
};
|
||
|
}
|
||
|
|
||
|
public override string GetContent()
|
||
|
{
|
||
|
if (fields.Any(x =>
|
||
|
{
|
||
|
switch (x.Name, x.Type, x.DefaultValue, x.Category)
|
||
|
{
|
||
|
case ("", _, _, _):
|
||
|
case (_, "", _, _):
|
||
|
case (_, _, "", _):
|
||
|
return true;
|
||
|
default:
|
||
|
return false;
|
||
|
}
|
||
|
}))
|
||
|
{
|
||
|
throw new InvalidOperationException("请填写完整");
|
||
|
}
|
||
|
var value = JsonHelper.Get(fields);
|
||
|
return value;
|
||
|
}
|
||
|
public override void Clear()
|
||
|
{
|
||
|
fields.Clear();
|
||
|
templateNameEdit.Text = templateBuilder.CurrentTemplate?.Name;
|
||
|
}
|
||
|
public override void OnStart()
|
||
|
{
|
||
|
addFieldsButton.Pressed+=AddFields;
|
||
|
|
||
|
templateNameEdit.TextSubmitted+=ChangeCurrentTemplateName;
|
||
|
saveTemplateNameButton.Pressed+=()=>
|
||
|
{
|
||
|
ChangeCurrentTemplateName(templateNameEdit.Text);
|
||
|
};
|
||
|
}
|
||
|
private void AddFields()
|
||
|
{
|
||
|
var current = templateBuilder.CurrentTemplate.Fields.ToList();
|
||
|
current.Add(new IDIS_TemplateForm()
|
||
|
{
|
||
|
|
||
|
});
|
||
|
templateBuilder.CurrentTemplate.Fields = current.ToArray();
|
||
|
|
||
|
templateBuilder.Rebuild();
|
||
|
}
|
||
|
|
||
|
private void ChangeCurrentTemplateName(string newName)
|
||
|
{
|
||
|
if(templateBuilder.CurrentTemplate==null) return;
|
||
|
|
||
|
if (templateBuilder.template.GetTemplates().Any(x => x.Name == newName))
|
||
|
// ReSharper disable once StringLiteralTypo
|
||
|
newName+=DateTime.Now.ToString("mmss");
|
||
|
|
||
|
templateBuilder.CurrentTemplate.Name = newName;
|
||
|
|
||
|
templateBuilder.template.ManualSave();
|
||
|
|
||
|
templateBuilder.Rebuild();
|
||
|
|
||
|
UXContextMenu
|
||
|
.Create()
|
||
|
.AddAction("New PopopMenu",null)
|
||
|
.Build();
|
||
|
|
||
|
}
|
||
|
}
|