Watches file changes in legacy resource manager in favor of manual refresh.

This commit is contained in:
2023-11-13 17:39:45 +08:00
parent ca60681de7
commit c52bf734d3
2 changed files with 42 additions and 17 deletions

View File

@@ -15,11 +15,12 @@ using Logger = Cryville.Common.Logging.Logger;
namespace Cryville.Crtr.Browsing { namespace Cryville.Crtr.Browsing {
internal class LegacyResourceManager : IPathedResourceManager<ChartDetail> { internal class LegacyResourceManager : IPathedResourceManager<ChartDetail> {
private readonly string _rootPath; readonly string _rootPath;
private DirectoryInfo cd; DirectoryInfo _cd;
private DirectoryInfo[] items = new DirectoryInfo[0]; readonly FileSystemWatcher _watcher = new FileSystemWatcher();
DirectoryInfo[] _items = new DirectoryInfo[0];
public string[] CurrentDirectory { get; private set; } public string[] CurrentDirectory { get; private set; }
public int Count { get { return items.Length; } } public int Count { get { return _items.Length; } }
static bool _init; static bool _init;
@@ -32,20 +33,40 @@ namespace Cryville.Crtr.Browsing {
_init = true; _init = true;
ExtensionManager.Init(rootPath); 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) { public void ChangeDirectory(string[] dir) {
CurrentDirectory = dir; CurrentDirectory = dir;
cd = new DirectoryInfo(_rootPath + "/charts/" + string.Join("/", dir)); string path = Path.Combine(_rootPath, "charts", Path.Combine(dir));
items = cd.GetDirectories(); _cd = new DirectoryInfo(path);
ItemChanged?.Invoke(); _watcher.Path = path;
_version++; _watcher.EnableRaisingEvents = true;
ReloadFiles();
} }
public void OpenDirectory(int id) { public void OpenDirectory(int id) {
string[] nd = new string[CurrentDirectory.Length + 1]; string[] nd = new string[CurrentDirectory.Length + 1];
Array.Copy(CurrentDirectory, nd, CurrentDirectory.Length); Array.Copy(CurrentDirectory, nd, CurrentDirectory.Length);
nd[CurrentDirectory.Length] = items[id].Name; nd[CurrentDirectory.Length] = _items[id].Name;
ChangeDirectory(nd); ChangeDirectory(nd);
} }
@@ -57,7 +78,7 @@ namespace Cryville.Crtr.Browsing {
public ChartDetail this[int index] { public ChartDetail this[int index] {
get { get {
var item = items[index]; var item = _items[index];
ChartMeta meta = null; ChartMeta meta = null;
AsyncDelivery<Texture2D> cover = null; AsyncDelivery<Texture2D> cover = null;
var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc")); var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc"));
@@ -83,13 +104,13 @@ namespace Cryville.Crtr.Browsing {
} }
public Uri GetItemUri(int id) { public Uri GetItemUri(int id) {
var item = items[id]; var item = _items[id];
var meta = new ChartMeta(); var meta = new ChartMeta();
var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc")); var metaFile = new FileInfo(Path.Combine(item.FullName, ".umgc"));
using (var reader = new StreamReader(metaFile.FullName)) { using (var reader = new StreamReader(metaFile.FullName)) {
meta = JsonConvert.DeserializeObject<ChartMeta>(reader.ReadToEnd()); meta = JsonConvert.DeserializeObject<ChartMeta>(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) { public bool ImportItemFrom(Uri uri) {

View File

@@ -32,10 +32,15 @@ namespace Cryville.Crtr.Browsing.UI {
_dialog.OnClose += OnAddDialogClosed; _dialog.OnClose += OnAddDialogClosed;
} }
void OnItemChanged() { bool _itemChanged;
ItemContainer.ItemCount = ResourceManager.Count; void OnItemChanged() { _itemChanged = true; }
_selectedItems.Clear(); void Update() {
_items.Clear(); if (_itemChanged) {
_itemChanged = false;
_selectedItems.Clear();
_items.Clear();
ItemContainer.ItemCount = ResourceManager.Count;
}
} }
private bool LoadItem(int id, GameObject obj) { private bool LoadItem(int id, GameObject obj) {
@@ -77,7 +82,6 @@ namespace Cryville.Crtr.Browsing.UI {
if (_dialog.FileName == null) return; if (_dialog.FileName == null) return;
if (ResourceManager.ImportItemFrom(new Uri(_dialog.FileName))) { if (ResourceManager.ImportItemFrom(new Uri(_dialog.FileName))) {
Popup.Create("Import succeeded"); Popup.Create("Import succeeded");
OnPathClicked(ResourceManager.CurrentDirectory.Length - 1);
} }
else { else {
Popup.Create("Import failed"); Popup.Create("Import failed");