using UnityEngine; using UnityEngine.UI; using UnityEngine.Localization.Components; using UnityEngine.Localization; using UnityEngine.Localization.Settings; using TMPro; using AibisDream.Framework; /// /// 收藏夹 / 生成窗口中的打孔带 UI 项。 /// namespace AibisDream.FixSystem { public class PunchTapeItem : MonoBehaviour { public Image clueImageUI; public LocalizeStringEvent nameText; public LocalizeStringEvent memoryIndexLabelText; public TMP_Text visibilityText; public TMP_Text contentIdText; public TMP_Text timecodeText; [HideInInspector] public bool used = false; private PunchTape punchTapeData; private PunchTapeDefinition punchTapeDefinition; private int localizationRefreshVersion; private void OnEnable() { LocalizationSettings.SelectedLocaleChanged += HandleSelectedLocaleChanged; } private void OnDisable() { LocalizationSettings.SelectedLocaleChanged -= HandleSelectedLocaleChanged; localizationRefreshVersion++; } public void Setup(PunchTape punchTape, PunchTapeDefinition definition) { punchTapeData = punchTape; punchTapeDefinition = definition; used = punchTape != null && punchTape.used; ApplyDisplay(punchTapeData, definition); } private void ApplyDisplay(PunchTape pt, PunchTapeDefinition definition) { if (pt == null || definition == null) { Debug.LogWarning("PunchTape 或其定义为空,显示已中止。", this); return; } if (clueImageUI != null) clueImageUI.color = pt.used ? Color.grey : Color.white; if (nameText != null) { RefreshLocalizedName(LocalizationSettings.SelectedLocale); } memoryIndexLabelText?.RefreshString(); if (visibilityText != null) visibilityText.text = $"@{definition.VisibilityCode}"; if (contentIdText != null) contentIdText.text = $"CID: {definition.ContentId}"; if (timecodeText != null) timecodeText.text = $"T+: {definition.Timecode}"; } private void HandleSelectedLocaleChanged(Locale locale) { RefreshLocalizedName(locale); } private async void RefreshLocalizedName(Locale locale) { if (nameText == null || punchTapeDefinition == null) return; int version = ++localizationRefreshVersion; string localizedName = await LocalizationKit.LocalizeParamAsync( punchTapeDefinition.DisplayNameParam, locale); if (version != localizationRefreshVersion || nameText == null || punchTapeDefinition == null) return; nameText.StringReference.Arguments = new object[] { localizedName }; nameText.RefreshString(); } public PunchTape GetPunchTapeData() { return punchTapeData; } } }