using Godot; using System; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using BITKit; using Cysharp.Threading.Tasks; namespace BITFactory; public partial class IDIS_SearchService : Node { [ExportCategory("Service")] [Export] private IDIS_Service service; [ExportCategory("UI 绑定 ")] [Export] private LineEdit searchEdit; [Export] private Control searchCandidateContainer; [Export] private StringResource searchButtonVariation; [Export] private Control searchEditPadding; [Export] private Button searchButton; [Export] private Button copyHandleButton; [ExportCategory("Query 绑定")] [Export] private Label handleLabel; [Export] private Label nameLabel; [Export] private Label createTimeLabel; [Export] private Label updateTimeLabel; [Export] private Control valueContainer; [Export] private Control referenceContainer; [ExportCategory("Template")] [Export] private PackedScene valueTemplate; [Export] private PackedScene referenceTemplate; [Export] private PackedScene categoryTemplate; private string currentHandle; public override void _Ready() { MathNode.ClearChild(searchCandidateContainer); MathNode.ClearChild(valueContainer); searchEdit.TextChanged += Search; //searchEdit.FocusExited += Clear; searchButton.Pressed+=Search; copyHandleButton.Pressed += CopyCurrentHandle; } private void Search() { Search(searchEdit.Text); } private void Search(string word) { var split = word.Split('?'); var condition = string.Empty; switch (split) { case var x when x.Length is 1: break; case var x when x.Length is 2: condition = split[1]; break; case var x when x.Length > 2: split = word.Split('?', 2); condition = split[1]; break; } var rawHandle = split[0]; MathNode.ClearChild(searchCandidateContainer); if (service.Query(word, out IDIS_Query[] queries) is false) return; if (queries.Length is 1 && queries.First().Handle == rawHandle) { QueryIDIS(queries.First()); return; } foreach (var query in queries.Take(3)) { var button = new Button(); button.Flat = true; searchCandidateContainer.AddChild(button); button.Text = $"{query.Handle}:{query.CreateUser}"; button.Pressed+=OnButtonOnPressed; button.ThemeTypeVariation = searchButtonVariation.Value; void OnButtonOnPressed() { searchEdit.Text =string.IsNullOrEmpty(condition) ? query.Handle :query.Handle + condition ; Search(query.Handle); QueryIDIS(query); } } } private async void Clear() { await Task.Delay(100); MathNode.ClearChild(searchCandidateContainer); } private void QueryIDIS(IDIS_Query query) { searchEditPadding.Hide(); handleLabel.Text = query.Handle; currentHandle = query.Handle; createTimeLabel.Text = query.CreateTime.ToString("yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture); updateTimeLabel.Text = query.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture); MathNode.ClearChild(valueContainer); MathNode.ClearChild(referenceContainer); foreach (var categoryGroup in query.Datas.GroupBy(x=>x.Category)) { var categoryContainer = categoryTemplate.Instantiate(); categoryContainer.Text = categoryGroup.First().Category; foreach (var x in categoryGroup) { var container = valueTemplate.Instantiate(); container.labels[0].Text = x.Name; container.labels[1].Text = x.Value; container.labels[2].Text = x.UpdateTime.ToString(CultureInfo.InvariantCulture); container.labels[3].Text = x.CreateTime.ToString(CultureInfo.InvariantCulture); categoryContainer.contextContainer.AddChild(container); } valueContainer.AddChild(categoryContainer); } foreach (var x in query.References) { var container = referenceTemplate.Instantiate(); container.Text = x.RelatedHandle; container.button.Pressed += () => { service.Query(x.RelatedHandle,out IDIS_Query _query); QueryIDIS(_query); }; referenceContainer.AddChild(container); } } private void CopyCurrentHandle() { DisplayServer.ClipboardSet(currentHandle); } }