111 lines
3.3 KiB
C#
111 lines
3.3 KiB
C#
using Cryville.Common;
|
|
using Cryville.Common.Unity;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
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() {
|
|
if (_cover != null) _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;
|
|
|
|
var basicProps = EnumerateBasicProperties().GetEnumerator();
|
|
if (basicProps.MoveNext()) {
|
|
m_title.text = basicProps.Current.Value;
|
|
if (basicProps.MoveNext()) {
|
|
m_desc.text = basicProps.Current.Value;
|
|
}
|
|
}
|
|
else {
|
|
m_title.text = "<color=#ff0000>Invalid resource</color>";
|
|
}
|
|
|
|
_cover = (AsyncDelivery<Texture2D>)EnumerateProperties().Where(prop => prop.Value is AsyncDelivery<Texture2D>).FirstOrDefault().Value;
|
|
|
|
if (_cover != null) _cover.Destination = DisplayCover;
|
|
if (selected) _tweener.EnterState("Selected");
|
|
}
|
|
IEnumerable<KeyValuePair<string, string>> EnumerateBasicProperties() {
|
|
foreach (var prop in EnumerateProperties()) {
|
|
if (prop.Value is string || prop.Value is IFormattable) {
|
|
yield return new KeyValuePair<string, string>(prop.Key, prop.Value.ToString());
|
|
}
|
|
}
|
|
}
|
|
IEnumerable<KeyValuePair<string, object>> EnumerateProperties() {
|
|
foreach (var prop in meta.Properties) {
|
|
if (prop.Values.ContainsKey("distinct-primary")) {
|
|
yield return new KeyValuePair<string, object>(prop.Name, prop.Values["distinct-primary"]);
|
|
if (prop.Values.ContainsKey("distinct-secondary")) {
|
|
yield return new KeyValuePair<string, object>(prop.Name, prop.Values["distinct-secondary"]);
|
|
}
|
|
}
|
|
else yield return new KeyValuePair<string, object>(prop.Name, prop.MainValue);
|
|
}
|
|
}
|
|
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;
|
|
var resourceBrowser = GetComponentInParent<PathedResourceBrowser>();
|
|
resourceBrowser.OnObjectItemClicked(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);
|
|
}
|
|
}
|
|
}
|