iFactory.Godot/Mods/工业数据采集与分析应用分享/Scripts/IDIS_TemplateBuilder.cs

224 lines
5.8 KiB
C#
Raw Permalink Normal View History

2023-09-17 02:55:33 +08:00
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);
}
}
}