using Cryville.Common; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UI; namespace Cryville.Crtr.Browsing.UI { public class DetailPanel : MonoBehaviour { [SerializeField] Sprite m_coverPlaceholder; [SerializeField] GameObject m_placeholder; [SerializeField] GameObject m_content; [SerializeField] Image m_cover; [SerializeField] TMP_Text m_title; [SerializeField] TMP_Text m_desc; AsyncDelivery _image; void OnDestroy() { DestroyDynamicResources(); } public void Load(IResourceMeta meta) { m_placeholder.SetActive(false); m_content.SetActive(true); DestroyDynamicResources(); m_cover.sprite = m_coverPlaceholder; _image = meta.EnumerateProperties>().FirstOrDefault().Value; if (_image != null) _image.Destination = DisplayCover; var nameProp = meta.Properties.FirstOrDefault(prop => prop.Name == "Name"); if (nameProp != null) { var names = nameProp.EnumerateProperty(true).GetEnumerator(); if (names.MoveNext()) { m_title.text = names.Current.Value.ToString(); if (names.MoveNext()) { m_title.text += "\n" + names.Current.Value.ToString(); } } else { m_title.text = ""; } m_desc.text = ""; var basicProps = meta.EnumerateBasicProperties().Where(prop => prop.Key != "Name").GetEnumerator(); for (int i = 0; i < 4 && basicProps.MoveNext(); i++) { var cur = basicProps.Current; var str = string.Format("{0}: {1}", cur.Key, cur.Value); if (i == 0) m_desc.text = str; else m_desc.text += "\n" + str; } } else { m_title.text = "Invalid resource"; m_desc.text = ""; } } void DisplayCover(bool succeeded, Texture2D tex) { if (!succeeded) return; m_cover.sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero, 160, 0, SpriteMeshType.FullRect); } public void Clear() { m_placeholder.SetActive(true); m_content.SetActive(false); DestroyDynamicResources(); } void DestroyDynamicResources() { _image?.Cancel(); if (m_cover.sprite != null && m_cover.sprite != m_coverPlaceholder) { Destroy(m_cover.sprite.texture); Destroy(m_cover.sprite); } } } }