From c52bf734d3a86355a55dba8064594889ba141fce Mon Sep 17 00:00:00 2001 From: PopSlime Date: Mon, 13 Nov 2023 17:39:45 +0800 Subject: [PATCH] Watches file changes in legacy resource manager in favor of manual refresh. --- .../Crtr/Browsing/LegacyResourceManager.cs | 45 ++++++++++++++----- .../Crtr/Browsing/UI/PathedResourceBrowser.cs | 14 +++--- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs b/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs index 52c34e5..ecba4da 100644 --- a/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs +++ b/Assets/Cryville/Crtr/Browsing/LegacyResourceManager.cs @@ -15,11 +15,12 @@ using Logger = Cryville.Common.Logging.Logger; namespace Cryville.Crtr.Browsing { internal class LegacyResourceManager : IPathedResourceManager { - private readonly string _rootPath; - private DirectoryInfo cd; - private DirectoryInfo[] items = new DirectoryInfo[0]; + readonly string _rootPath; + DirectoryInfo _cd; + readonly FileSystemWatcher _watcher = new FileSystemWatcher(); + DirectoryInfo[] _items = new DirectoryInfo[0]; public string[] CurrentDirectory { get; private set; } - public int Count { get { return items.Length; } } + public int Count { get { return _items.Length; } } static bool _init; @@ -32,20 +33,40 @@ namespace Cryville.Crtr.Browsing { _init = true; ExtensionManager.Init(rootPath); } + _watcher.Changed += OnFileChanged; + _watcher.Created += OnFileChanged; + _watcher.Deleted += OnFileChanged; + _watcher.Renamed += OnFileChanged; + _watcher.Error += OnFileWatcherError; + } + + void OnFileWatcherError(object sender, ErrorEventArgs e) { + Logger.Log("main", 4, "Data", "An error occurred while watching file changes: {0}", e.GetException()); + } + + void OnFileChanged(object sender, FileSystemEventArgs e) { + ReloadFiles(); + } + + void ReloadFiles() { + _items = _cd.GetDirectories(); + _version++; + ItemChanged?.Invoke(); } public void ChangeDirectory(string[] dir) { CurrentDirectory = dir; - cd = new DirectoryInfo(_rootPath + "/charts/" + string.Join("/", dir)); - items = cd.GetDirectories(); - ItemChanged?.Invoke(); - _version++; + string path = Path.Combine(_rootPath, "charts", Path.Combine(dir)); + _cd = new DirectoryInfo(path); + _watcher.Path = path; + _watcher.EnableRaisingEvents = true; + ReloadFiles(); } public void OpenDirectory(int id) { string[] nd = new string[CurrentDirectory.Length + 1]; Array.Copy(CurrentDirectory, nd, CurrentDirectory.Length); - nd[CurrentDirectory.Length] = items[id].Name; + nd[CurrentDirectory.Length] = _items[id].Name; ChangeDirectory(nd); } @@ -57,7 +78,7 @@ namespace Cryville.Crtr.Browsing { public ChartDetail this[int index] { get { - var item = items[index]; + var item = _items[index]; ChartMeta meta = null; AsyncDelivery cover = null; var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc")); @@ -83,13 +104,13 @@ namespace Cryville.Crtr.Browsing { } public Uri GetItemUri(int id) { - var item = items[id]; + var item = _items[id]; var meta = new ChartMeta(); var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc")); using (var reader = new StreamReader(metaFile.FullName)) { meta = JsonConvert.DeserializeObject(reader.ReadToEnd()); } - return new Uri(Path.Combine(items[id].Name, string.Format("{0}.json", meta.data))); + return new Uri(Path.Combine(_items[id].Name, string.Format("{0}.json", meta.data))); } public bool ImportItemFrom(Uri uri) { diff --git a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs index 62651c5..2812bc0 100644 --- a/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs +++ b/Assets/Cryville/Crtr/Browsing/UI/PathedResourceBrowser.cs @@ -32,10 +32,15 @@ namespace Cryville.Crtr.Browsing.UI { _dialog.OnClose += OnAddDialogClosed; } - void OnItemChanged() { - ItemContainer.ItemCount = ResourceManager.Count; - _selectedItems.Clear(); - _items.Clear(); + bool _itemChanged; + void OnItemChanged() { _itemChanged = true; } + void Update() { + if (_itemChanged) { + _itemChanged = false; + _selectedItems.Clear(); + _items.Clear(); + ItemContainer.ItemCount = ResourceManager.Count; + } } private bool LoadItem(int id, GameObject obj) { @@ -77,7 +82,6 @@ namespace Cryville.Crtr.Browsing.UI { if (_dialog.FileName == null) return; if (ResourceManager.ImportItemFrom(new Uri(_dialog.FileName))) { Popup.Create("Import succeeded"); - OnPathClicked(ResourceManager.CurrentDirectory.Length - 1); } else { Popup.Create("Import failed");