224 lines
5.8 KiB
C#
224 lines
5.8 KiB
C#
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<IDIS_TemplateItem> _items = new();
|
|
|
|
private IDIS_Template _currentTemplate;
|
|
|
|
public override async void OnStart()
|
|
{
|
|
_buttonGroup = new ButtonGroup();
|
|
_templateService = Entity.ServiceProvider.GetRequiredService<IDIS_TemplateService>();
|
|
|
|
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<TemplateFieldFormatType>(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<UXContainer>();
|
|
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<PanelContainer>().Create<MarginContainer>().Create<HBoxContainer>();
|
|
|
|
var field = new IDIS_TemplateItem(container.Create<LineEdit>(), container.Create<OptionButton>(),container.Create<Button>())
|
|
{
|
|
NameEdit =
|
|
{
|
|
PlaceholderText = "值名称",
|
|
SizeFlagsHorizontal = Control.SizeFlags.ExpandFill
|
|
},
|
|
TypeButton =
|
|
{
|
|
Selected = 0,
|
|
SizeFlagsHorizontal = Control.SizeFlags.ExpandFill
|
|
}
|
|
,
|
|
RemoveButton =
|
|
{
|
|
Text = "移除",
|
|
SizeFlagsHorizontal = Control.SizeFlags.ExpandFill
|
|
}
|
|
};
|
|
|
|
_items.Add(field);
|
|
|
|
var index = 0;
|
|
foreach (var name in Enum.GetNames<TemplateFieldFormatType>())
|
|
{
|
|
field.TypeButton.AddItem(name, index++);
|
|
}
|
|
|
|
field.RemoveButton.Pressed += () =>
|
|
{
|
|
_items.Remove(field);
|
|
container.GetParent().QueueFree();
|
|
};
|
|
return field;
|
|
}
|
|
|
|
private void OnTemplateDeleted(IDIS_Template template)
|
|
{
|
|
_currentTemplate = null;
|
|
Clear();
|
|
RebuildHeader();
|
|
}
|
|
private async void Delete()
|
|
{
|
|
if (_currentTemplate is null)
|
|
{
|
|
logLabel.Text = "当前没有选中的模板";
|
|
return;
|
|
}
|
|
var response = await _templateService.DeleteAsync(_currentTemplate.Prefix, _currentTemplate.Version);
|
|
logLabel.Text = response.Message;
|
|
}
|
|
|
|
private async void RebuildHeader()
|
|
{
|
|
var request = await _templateService.ToArrayAsync();
|
|
|
|
if (request.TryAs<IDIS_Template[]>(out var templates) is false) return;
|
|
|
|
headerBuilder.Clear();
|
|
|
|
foreach (var template in templates)
|
|
{
|
|
CreateHeader(template);
|
|
}
|
|
}
|
|
}
|