using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using DG.Tweening; using Ichni.RhythmGame; using Lean.Pool; using Sirenix.OdinInspector; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; namespace Ichni.Editor { public partial class ToolBar : StaticWindow { [Title("Buttons")] public Button escapeButton; public Button reloadButton; public Button projectInfoButton; public Button songInfoButton; public Button saveButton; public Button exportButton; public Button mergeButton; public Button clipSaveButton; public Button clipLoadButton; public Button beatmapToolsButton; [Title("Search")] public TMP_InputField searchInput; public RectTransform searchResultsRoot; public GameObject searchResultItemPrefab; [Title("Windows")] public GeneralSecondaryWindow clipManagementWindow; private readonly List searchResultItems = new List(); protected override void Start() { base.Start(); escapeButton.onClick.AddListener(GenerateEscapeConfirmWindow); reloadButton.onClick.AddListener(GenerateReloadConfirmWindow); saveButton.onClick.AddListener(EditorManager.instance.projectManager.saveManager.Save); exportButton.onClick.AddListener(EditorManager.instance.projectManager.exportManager.Export); mergeButton.onClick.AddListener(GenerateMergeWindow); clipSaveButton.onClick.AddListener(GenerateSaveClipWindow); clipLoadButton.onClick.AddListener(GenerateLoadClipWindow); beatmapToolsButton.onClick.AddListener(GenerateBeatmapToolsWindow); //songInfoButton.onClick.AddListener(已经在songinfo好了); //projectInfoButton.onClick.AddListener(已经在projectinfo好了); SetupSearch(); } private void SetupSearch() { searchInput.onValueChanged.AddListener(OnSearchValueChanged); searchInput.onSelect.AddListener(_ => { searchResultsRoot.transform.DOScaleX(1, 0.25f); searchResultsRoot.gameObject.SetActive(true); }); // searchInput.onDeselect.AddListener(_ => // { // // 延迟隐藏,避免点击结果项时面板先消失了 // // }); searchResultsRoot.gameObject.SetActive(false); } private void OnSearchValueChanged(string query) { ClearSearchResults(); if (string.IsNullOrWhiteSpace(query)) return; string lowerQuery = query.ToLower(); var matches = EditorManager.instance.beatmapContainer.gameElementList .Where(e => e != null && e.elementName.ToLower().Contains(lowerQuery)) .Take(20) .ToList(); if (matches.Count == 0) return; searchResultsRoot.gameObject.SetActive(true); foreach (var element in matches) { var item = LeanPool.Spawn(searchResultItemPrefab, searchResultsRoot); var itemText = item.GetComponentInChildren(); if (itemText != null) itemText.text = element.elementName + " | " + element.GetType().ToString(); var button = item.GetComponentInChildren