diff --git a/Assets/Cryville/Crtr/Browsing/ChartDetail.cs b/Assets/Cryville/Crtr/Browsing/ChartDetail.cs index 7199b46..b51bcc6 100644 --- a/Assets/Cryville/Crtr/Browsing/ChartDetail.cs +++ b/Assets/Cryville/Crtr/Browsing/ChartDetail.cs @@ -1,10 +1,30 @@ using Cryville.Common; +using Cryville.Crtr.Browsing.UI; using Cryville.Crtr.Extension; +using System; +using System.Collections.Generic; using UnityEngine; namespace Cryville.Crtr.Browsing { - public struct ChartDetail { + public struct ChartDetail : IBrowserItemMeta { public AsyncDelivery Cover { get; set; } public ChartMeta Meta { get; set; } + + public IEnumerable Properties { + get { + if (Meta == null) yield break; + yield return new MetaProperty("Name", new Dictionary { + { "", string.Format("{0} - {1}", Meta.song.name, Meta.name) }, + { "short", Meta.name }, + { "distinct-primary", Meta.song.name }, + { "distinct-secondary", Meta.name }, + }); + yield return new MetaProperty("Image", Cover); + yield return new MetaProperty("Song.Author", Meta.song.author); + yield return new MetaProperty("Author", Meta.author); + yield return new MetaProperty("Length", TimeSpan.FromSeconds(Meta.length)); + yield return new MetaProperty("NoteCount", Meta.note_count); + } + } } } diff --git a/Assets/Cryville/Crtr/Browsing/UI/BrowserItem.cs b/Assets/Cryville/Crtr/Browsing/UI/BrowserItem.cs index 99f5c28..1c9966f 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/BrowserItem.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/BrowserItem.cs @@ -3,8 +3,8 @@ using UnityEngine; namespace Cryville.Crtr.Browsing.UI { internal abstract class BrowserItem : MonoBehaviour { public int? Id { get; private set; } - protected ChartDetail meta; - internal void Load(int id, ChartDetail item, bool selected) { + protected IBrowserItemMeta meta; + internal void Load(int id, IBrowserItemMeta item, bool selected) { OnReset(); Id = id; meta = item; diff --git a/Assets/Cryville/Crtr/Browsing/UI/BrowserItemTile.cs b/Assets/Cryville/Crtr/Browsing/UI/BrowserItemTile.cs index eaca0bb..70e4352 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/BrowserItemTile.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/BrowserItemTile.cs @@ -1,4 +1,8 @@ +using Cryville.Common; using Cryville.Common.Unity; +using System; +using System.Collections.Generic; +using System.Linq; using TMPro; using UnityEngine; using UnityEngine.EventSystems; @@ -19,6 +23,7 @@ namespace Cryville.Crtr.Browsing.UI { TMP_Text m_desc; StateTweener _tweener; + AsyncDelivery _cover; void Awake() { _tweener = GetComponent(); @@ -28,7 +33,7 @@ namespace Cryville.Crtr.Browsing.UI { OnReset(); } protected override void OnReset() { - if (meta.Cover != null) meta.Cover.Cancel(); + if (_cover != null) _cover.Cancel(); if (m_icon.sprite != null && m_icon.sprite != m_iconPlaceholder) { Destroy(m_icon.sprite.texture); Destroy(m_icon.sprite); @@ -38,18 +43,43 @@ namespace Cryville.Crtr.Browsing.UI { protected override void OnLoad(bool selected) { m_icon.sprite = m_iconPlaceholder; - if (meta.Cover != null) meta.Cover.Destination = DisplayCover; - if (meta.Meta != null) { - m_title.text = meta.Meta.song.name; - m_desc.text = meta.Meta.name; + 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 = "Invalid resource"; - m_desc.text = string.Empty; } + + _cover = (AsyncDelivery)EnumerateProperties().Where(prop => prop.Value is AsyncDelivery).FirstOrDefault().Value; + + if (_cover != null) _cover.Destination = DisplayCover; if (selected) _tweener.EnterState("Selected"); } - private void DisplayCover(bool succeeded, Texture2D tex) { + IEnumerable> EnumerateBasicProperties() { + foreach (var prop in EnumerateProperties()) { + if (prop.Value is string || prop.Value is IFormattable) { + yield return new KeyValuePair(prop.Key, prop.Value.ToString()); + } + } + } + IEnumerable> EnumerateProperties() { + foreach (var prop in meta.Properties) { + if (prop.Values.ContainsKey("distinct-primary")) { + yield return new KeyValuePair(prop.Name, prop.Values["distinct-primary"]); + if (prop.Values.ContainsKey("distinct-secondary")) { + yield return new KeyValuePair(prop.Name, prop.Values["distinct-secondary"]); + } + } + else yield return new KeyValuePair(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); } diff --git a/Assets/Cryville/Crtr/Browsing/UI/IBrowserItemMeta.cs b/Assets/Cryville/Crtr/Browsing/UI/IBrowserItemMeta.cs new file mode 100644 index 0000000..b95662c --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/UI/IBrowserItemMeta.cs @@ -0,0 +1,7 @@ +using System.Collections.Generic; + +namespace Cryville.Crtr.Browsing.UI { + public interface IBrowserItemMeta { + IEnumerable Properties { get; } + } +} diff --git a/Assets/Cryville/Crtr/Browsing/UI/IBrowserItemMeta.cs.meta b/Assets/Cryville/Crtr/Browsing/UI/IBrowserItemMeta.cs.meta new file mode 100644 index 0000000..fc86968 --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/UI/IBrowserItemMeta.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 026e696a02e3d674bad92bf80aa77278 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Browsing/UI/MetaProperty.cs b/Assets/Cryville/Crtr/Browsing/UI/MetaProperty.cs new file mode 100644 index 0000000..319367a --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/UI/MetaProperty.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace Cryville.Crtr.Browsing.UI { + public class MetaProperty { + public string Name { get; set; } + public IReadOnlyDictionary Values { get; set; } + public object MainValue { get { return Values[""]; } } + public MetaProperty(string name, IReadOnlyDictionary values) { + if (values.Count == 0) throw new ArgumentException("Value is empty."); + if (!values.ContainsKey("")) throw new ArgumentException("Main value is missing."); + Name = name; + Values = values; + } + public MetaProperty(string name, object value) { + Name = name; + Values = new Dictionary { { "", value } }; + } + } +} diff --git a/Assets/Cryville/Crtr/Browsing/UI/MetaProperty.cs.meta b/Assets/Cryville/Crtr/Browsing/UI/MetaProperty.cs.meta new file mode 100644 index 0000000..67965f8 --- /dev/null +++ b/Assets/Cryville/Crtr/Browsing/UI/MetaProperty.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8ccfc6a81a7c774d8df59df0ddd4c1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs index 41fec2d..979dcff 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs @@ -88,7 +88,7 @@ namespace Cryville.Crtr.Browsing.UI { bi.Load(id, item, _selectedItems.Contains(id)); } catch (Exception) { - bi.Load(id, default(ChartDetail), _selectedItems.Contains(id)); + bi.Load(id, null, _selectedItems.Contains(id)); } return true; }