using System.Collections.Generic; using Cielonos.MainGame.Inventory; using Cielonos.MainGame.UI; using Sirenix.OdinInspector; using SLSUtilities.General; using TMPro; using UniRx; using UnityEngine; using UnityEngine.Localization.Settings; using UnityEngine.Serialization; using UnityEngine.UI; namespace SLSUtilities.UI { /// /// 通用物品详情面板,显示物品图标、名称、类型、描述条目、标签等信息。 /// 可被不同的 UIPage 复用(机械台、商店、背包检视等)。 /// public class ItemDetailPanel : UIElementBase { [Title("Detail Panel References")] public TMP_Text selectionHintText; //public Image itemIcon; public TMP_Text nameText; public TMP_Text typeRarityText; public TMP_Text institutionText; public RectTransform tagContainer; public GameObject tagPrefab; // ─────────────────── 描述条目 ─────────────────── [Title("Description Entries")] [Tooltip("描述条目的容器,应挂载 VerticalLayoutGroup 以实现垂直排列。")] public RectTransform descriptionContainer; [Tooltip("描述条目预制体,需挂载 ItemDescriptionEntry 组件。")] public GameObject descriptionEntryPrefab; // ─────────────────── 运行时数据 ─────────────────── private ItemBase currentItem; private readonly List activeEntries = new List(); /// 当前显示的物品。 public ItemBase CurrentItem => currentItem; /// /// 使用指定物品的数据填充详情面板并显示。 /// public void SetItem(ItemBase item) { currentItem = item; if (item == null || item.contentData == null) { ClearPanel(); return; } ContentData data = item.contentData; // 图标 /*Sprite icon = data.itemIcon; if (itemIcon != null) { itemIcon.sprite = icon; itemIcon.enabled = icon != null; }*/ // 名称(本地化) nameText.text = data.displayNameKey.Localize("Items"); // 类型 typeRarityText.text = data.itemType.ToString() + " - " + data.itemRarity.ToString(); //机构 institutionText.text = string.Empty; for (var index = 0; index < data.institutions.Count; index++) { var institution = data.institutions[index]; string comma = LocalizationSettings.SelectedLocale.Identifier.Code.StartsWith("zh") ? "、" : ", "; if(index < data.institutions.Count - 1) institutionText.text += institution.Localize("Items") + comma; else institutionText.text += institution.Localize("Items"); } // 描述条目 RefreshDescriptions(data); // 标签 RefreshTags(data); selectionHintText.gameObject.SetActive(false); } /// 清空面板内容并隐藏。 public void ClearPanel() { currentItem = null; //if (itemIcon != null) itemIcon.enabled = false; if (nameText != null) nameText.text = string.Empty; if (typeRarityText != null) typeRarityText.text = string.Empty; ClearDescriptions(); ClearTags(); selectionHintText.gameObject.SetActive(true); } // ================================================================ // 描述条目 // ================================================================ private void RefreshDescriptions(ContentData data) { ClearDescriptions(); if (descriptionContainer == null || descriptionEntryPrefab == null) return; if (data.descriptions == null || data.descriptions.Count == 0) return; Dictionary descriptionArgs = currentItem?.GetDescriptionArgs(); foreach (ItemDescription desc in data.descriptions) { ItemDescriptionEntry entry = Instantiate(descriptionEntryPrefab, descriptionContainer).GetComponent(); entry.SetDescription(desc, descriptionArgs); activeEntries.Add(entry); } LayoutRebuilder.ForceRebuildLayoutImmediate(descriptionContainer); } private void ClearDescriptions() { foreach (ItemDescriptionEntry entry in activeEntries) { if (entry != null) { Destroy(entry.gameObject); } } activeEntries.Clear(); } // ================================================================ // 标签 // ================================================================ private void RefreshTags(ContentData data) { ClearTags(); if (tagContainer == null || tagPrefab == null || data.tags == null) return; foreach (string tag in data.tags) { GameObject tagObj = Instantiate(tagPrefab, tagContainer); TMP_Text tagText = tagObj.GetComponentInChildren(); if (tagText != null) { tagText.text = tag; } } } private void ClearTags() { if (tagContainer == null) return; for (int i = tagContainer.childCount - 1; i >= 0; i--) { Destroy(tagContainer.GetChild(i).gameObject); } } } }