From 8c11be48cfcdaddca6336ea8900c4beca7c08468 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Mon, 13 Nov 2023 00:26:18 +0800 Subject: [PATCH] Adapt resource manager to URI and list pattern. --- .../Crtr/Browsing/IResourceManager.cs | 10 +- .../Crtr/Browsing/LegacyResourceManager.cs | 114 +++++++++--------- .../Crtr/Browsing/UI/PathedResourceBrowser.cs | 8 +- .../Crtr/Browsing/UI/ResourceBrowserMaster.cs | 2 +- 4 files changed, 62 insertions(+), 72 deletions(-) diff --git a/Assets/Cryville/Crtr/Browsing/IResourceManager.cs b/Assets/Cryville/Crtr/Browsing/IResourceManager.cs index b47931e..877ac5a 100644 --- a/Assets/Cryville/Crtr/Browsing/IResourceManager.cs +++ b/Assets/Cryville/Crtr/Browsing/IResourceManager.cs @@ -2,14 +2,10 @@ using System; using System.Collections.Generic; namespace Cryville.Crtr.Browsing { - public interface IResourceManager { - int ItemCount { get; } + public interface IResourceManager : IReadOnlyList { + Uri GetItemUri(int id); - ResourceItemMeta GetItemMeta(int id); - T GetItemDetail(int id); - string GetItemPath(int id); - - bool ImportItemFrom(string path); + bool ImportItemFrom(Uri uri); string[] GetSupportedFormats(); IReadOnlyDictionary GetPresetPaths(); diff --git a/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs b/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs index 07804c5..283f5d8 100644 --- a/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs +++ b/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs @@ -6,6 +6,7 @@ using Cryville.Crtr.Extensions.Umg; using Cryville.Crtr.UI; using Newtonsoft.Json; using System; +using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; @@ -18,7 +19,7 @@ namespace Cryville.Crtr.Browsing { private DirectoryInfo cd; private DirectoryInfo[] items = new DirectoryInfo[0]; public string[] CurrentDirectory { get; private set; } - public int ItemCount { get { return items.Length; } } + public int Count { get { return items.Length; } } static bool _init; @@ -46,80 +47,52 @@ namespace Cryville.Crtr.Browsing { ChangeDirectory(nd); } - public void ReturnToDirectory(int id) { - string[] nd = new string[id + 1]; - Array.Copy(CurrentDirectory, nd, id + 1); + public void ReturnToDirectory(int index) { + string[] nd = new string[index + 1]; + Array.Copy(CurrentDirectory, nd, index + 1); ChangeDirectory(nd); } - public ResourceItemMeta GetItemMeta(int id) { - var item = items[id]; - var meta = new ChartMeta(); - string name = item.Name; - string desc = "(Unknown)"; - var metaFile = new FileInfo(item.FullName + "/.umgc"); - if (metaFile.Exists) { - using (var reader = new StreamReader(metaFile.FullName)) { - meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); - name = meta.song.name; - desc = meta.name; + public ChartDetail this[int index] { + get { + var item = items[index]; + ChartMeta meta = null; + var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc")); + if (metaFile.Exists) { + using (var reader = new StreamReader(metaFile.FullName)) { + meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); + } } - } - AsyncDelivery cover = null; - if (meta.cover != null && meta.cover != "") { - var coverFile = item.GetFiles(meta.cover); - if (coverFile.Length > 0) { - cover = new AsyncDelivery(); - var task = new LoadTextureTask(PlatformConfig.FileProtocolPrefix + coverFile[0].FullName, cover.Deliver); - cover.CancelSource = task.Cancel; - Game.NetworkTaskWorker.SubmitNetworkTask(task); + AsyncDelivery cover = null; + if (meta.cover != null && meta.cover != "") { + var coverFile = item.GetFiles(meta.cover); + if (coverFile.Length > 0) { + cover = new AsyncDelivery(); + var task = new LoadTextureTask(PlatformConfig.FileProtocolPrefix + coverFile[0].FullName, cover.Deliver); + cover.CancelSource = task.Cancel; + Game.NetworkTaskWorker.SubmitNetworkTask(task); + } } + return new ChartDetail { + Cover = cover, + Meta = meta, + }; } - return new ResourceItemMeta { - IsDirectory = false, - Icon = cover, - Name = name, - DescriptionMain = desc, - }; } - public ChartDetail GetItemDetail(int id) { + public Uri GetItemUri(int id) { var item = items[id]; var meta = new ChartMeta(); - var metaFile = new FileInfo(item.FullName + "/.umgc"); - if (metaFile.Exists) { - using (var reader = new StreamReader(metaFile.FullName)) { - meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); - } - } - AsyncDelivery cover = null; - if (meta.cover != null && meta.cover != "") { - var coverFile = item.GetFiles(meta.cover); - if (coverFile.Length > 0) { - cover = new AsyncDelivery(); - var task = new LoadTextureTask(PlatformConfig.FileProtocolPrefix + coverFile[0].FullName, cover.Deliver); - cover.CancelSource = task.Cancel; - Game.NetworkTaskWorker.SubmitNetworkTask(task); - } - } - return new ChartDetail { - Cover = cover, - Meta = meta, - }; - } - - public string GetItemPath(int id) { - var item = items[id]; - var meta = new ChartMeta(); - var metaFile = new FileInfo(item.FullName + "/.umgc"); + var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc")); using (var reader = new StreamReader(metaFile.FullName)) { meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); } - return string.Format("{0}/{1}.json", items[id].Name, meta.data); + return new Uri(Path.Combine(items[id].Name, string.Format("{0}.json", meta.data))); } - public bool ImportItemFrom(string path) { - var file = new FileInfo(path); + public bool ImportItemFrom(Uri uri) { + if (!uri.IsFile) throw new NotSupportedException(); + var file = new FileInfo(uri.LocalPath); IEnumerable converters; if (!ExtensionManager.TryGetConverters(file.Extension, out converters)) return false; foreach (var converter in converters) { @@ -195,6 +168,27 @@ namespace Cryville.Crtr.Browsing { return false; } + Enumerator GetEnumerator() { return new Enumerator(this); } + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } + + public struct Enumerator : IEnumerator { + readonly LegacyResourceManager _list; + public ChartDetail Current => throw new NotImplementedException(); + object IEnumerator.Current => Current; + + public Enumerator(LegacyResourceManager list) { _list = list; } + public void Dispose() { } + + public bool MoveNext() { + throw new NotImplementedException(); + } + + public void Reset() { + throw new NotImplementedException(); + } + } + void LogAndPopup(int level, string format, params object[] args) { var msg = string.Format(format, args); Logger.Log("main", level, "Resource", msg); diff --git a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs index d09a423..ab01a90 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs @@ -31,7 +31,7 @@ namespace Cryville.Crtr.Browsing.UI { } void OnItemChanged() { - ItemContainer.ItemCount = ResourceManager.ItemCount; + ItemContainer.ItemCount = ResourceManager.Count; _selectedItems.Clear(); _items.Clear(); } @@ -40,7 +40,7 @@ namespace Cryville.Crtr.Browsing.UI { var bi = obj.GetComponent(); _items[id] = bi; try { - var item = ResourceManager.GetItemMeta(id); + var item = ResourceManager[id]; bi.Load(id, item, _selectedItems.Contains(id)); } catch (Exception) { @@ -58,7 +58,7 @@ namespace Cryville.Crtr.Browsing.UI { _selectedItems.Clear(); _items[id].OnSelect(); _selectedItems.Add(id); - Master.ShowDetail(id, ResourceManager.GetItemDetail(id)); + Master.ShowDetail(id, ResourceManager[id]); } public void OnPathClicked(int id) { @@ -71,7 +71,7 @@ namespace Cryville.Crtr.Browsing.UI { private void OnAddDialogClosed() { if (_dialog.FileName == null) return; - if (ResourceManager.ImportItemFrom(_dialog.FileName)) { + if (ResourceManager.ImportItemFrom(new Uri(_dialog.FileName))) { Popup.Create("Import succeeded"); OnPathClicked(ResourceManager.CurrentDirectory.Length - 1); } diff --git a/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs b/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs index ea80594..3e79c16 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/ResourceBrowserMaster.cs @@ -89,7 +89,7 @@ namespace Cryville.Crtr.Browsing.UI { void SetDataSettings(int id, ChartDetail detail) { Settings.Default.LoadRuleset = detail.Meta.ruleset + "/.umgr"; Settings.Default.LoadRulesetConfig = detail.Meta.ruleset + ".json"; - Settings.Default.LoadChart = m_mainBrowser.ResourceManager.GetItemPath(id); + Settings.Default.LoadChart = m_mainBrowser.ResourceManager.GetItemUri(id).LocalPath; } } }