Files
crtr/Assets/Cryville/Crtr/Browsing/UI/BrowserItemTile.cs

95 lines
2.5 KiB
C#

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<Texture2D> _cover;
void Awake() {
_tweener = GetComponent<StateTweener>();
}
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<AsyncDelivery<Texture2D>>().FirstOrDefault().Value;
}
if (!validFlag) {
m_title.text = "<color=#ff0000>Invalid resource</color>";
}
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);
}
}
}