using Cryville.Common; using Cryville.Common.Unity; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace Cryville.Crtr.Browsing.UI { internal class BrowserItemTile : BrowserItem, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler { #pragma warning disable IDE0044 [SerializeField] Sprite m_iconPlaceholder; #pragma warning restore IDE0044 [SerializeField] Image m_icon; [SerializeField] TMP_Text m_title; [SerializeField] TMP_Text m_desc; StateTweener _tweener; AsyncDelivery _cover; void Awake() { _tweener = GetComponent(); } void OnDestroy() { OnReset(); } protected override void OnReset() { _cover?.Cancel(); if (m_icon.sprite != null && m_icon.sprite != m_iconPlaceholder) { Destroy(m_icon.sprite.texture); Destroy(m_icon.sprite); } _tweener.ClearState(); } protected override void OnLoad(bool selected) { m_icon.sprite = m_iconPlaceholder; m_desc.text = string.Empty; bool validFlag = false; if (Meta != null) { var basicProps = Meta.EnumerateBasicProperties(true).GetEnumerator(); if (basicProps.MoveNext()) { m_title.text = basicProps.Current.Value.ToString(); if (basicProps.MoveNext()) { m_desc.text = basicProps.Current.Value.ToString(); } validFlag = true; } _cover = Meta.EnumerateProperties>().FirstOrDefault().Value; } if (!validFlag) { m_title.text = "Invalid resource"; } if (_cover != null) _cover.Destination = DisplayCover; if (IsDir) _tweener.EnterState("Directory"); if (selected) _tweener.EnterState("Selected"); } void DisplayCover(bool succeeded, Texture2D tex) { if (succeeded) { m_icon.sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero, 160, 0, SpriteMeshType.FullRect); } } public void OnClick() { if (Id == null) return; Browser.OnItemClicked(Id.Value); } public void OnPointerClick(PointerEventData eventData) { OnClick(); } public void OnPointerEnter(PointerEventData eventData) { _tweener.EnterState("Hovered", 0.1f); } public void OnPointerExit(PointerEventData eventData) { _tweener.ExitState("Hovered", 0.1f); } internal override void OnSelect() { base.OnSelect(); _tweener.EnterState("Selected", 0.1f); } internal override void OnDeselect() { base.OnDeselect(); _tweener.ExitState("Selected", 0.1f); } } }