Explorar o código

Add menu file caching

All of this is pretty much stolen from COM3D2.CacheEditMenu. Thanks
Mr. Hosrington.
https://git.coder.horse/ghorsington/COM3D2.CacheEditMenu
habeebweeb %!s(int64=4) %!d(string=hai) anos
pai
achega
cf1b826d40

+ 86 - 0
COM3D2.MeidoPhotoStudio.Plugin/MeidoPhotoStudio/MenuFileCache.cs

@@ -0,0 +1,86 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+
+/*
+    All of this is pretty much stolen from COM3D2.CacheEditMenu. Thanks Mr. Hosrington.
+    https://git.coder.horse/ghorsington/COM3D2.CacheEditMenu
+*/
+namespace COM3D2.MeidoPhotoStudio.Plugin
+{
+    using static MenuFileUtility;
+    internal static class BinaryExtensions
+    {
+        public static string ReadNullableString(this BinaryReader binaryReader)
+        {
+            return binaryReader.ReadBoolean() ? binaryReader.ReadString() : null;
+        }
+
+        public static void WriteNullableString(this BinaryWriter binaryWriter, string str)
+        {
+            binaryWriter.Write(str != null);
+            if (str != null) binaryWriter.Write(str);
+        }
+    }
+
+    internal class MenuFileCache
+    {
+        private const int cacheVersion = 765;
+        public static readonly string cachePath = Path.Combine(Constants.configPath, "cache.dat");
+        private Dictionary<string, ModItem> modItems;
+        private bool rebuild = false;
+        public ModItem this[string menu]
+        {
+            get => modItems[menu];
+            set
+            {
+                if (!modItems.ContainsKey(menu))
+                {
+                    rebuild = true;
+                    modItems[menu] = value;
+                }
+            }
+        }
+
+        public MenuFileCache()
+        {
+            modItems = new Dictionary<string, ModItem>();
+            if (File.Exists(cachePath)) Deserialize();
+        }
+
+        public bool Has(string menuFileName)
+        {
+            return modItems.ContainsKey(menuFileName);
+        }
+
+        private void Deserialize()
+        {
+            using (BinaryReader binaryReader = new BinaryReader(File.OpenRead(cachePath)))
+            {
+                if (binaryReader.ReadInt32() != cacheVersion)
+                {
+                    UnityEngine.Debug.Log($"Cache version out of date. Rebuilding");
+                    return;
+                }
+                while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length)
+                {
+                    ModItem item = ModItem.Deserialize(binaryReader);
+                    modItems[item.MenuFile] = item;
+                }
+            }
+        }
+
+        public void Serialize()
+        {
+            if (!rebuild) return;
+            using (BinaryWriter binaryWriter = new BinaryWriter(File.OpenWrite(cachePath)))
+            {
+                binaryWriter.Write(cacheVersion);
+                foreach (ModItem item in modItems.Values)
+                {
+                    item.Serialize(binaryWriter);
+                }
+            }
+        }
+    }
+}

+ 37 - 5
COM3D2.MeidoPhotoStudio.Plugin/MeidoPhotoStudio/MenuFileUtility.cs

@@ -557,7 +557,7 @@ namespace COM3D2.MeidoPhotoStudio.Plugin
             modItem.Category = menuDataBase.GetCategoryMpnText();
             if (!accMpn.Contains(modItem.Category)) return false;
             modItem.MenuFile = menuDataBase.GetMenuFileName().ToLower();
-            if (!validBG2MenuFile(modItem.MenuFile)) return false;
+            if (!ValidBG2MenuFile(modItem.MenuFile)) return false;
             modItem.Name = menuDataBase.GetMenuName();
             modItem.IconFile = menuDataBase.GetIconS();
             modItem.Priority = menuDataBase.GetPriority();
@@ -566,7 +566,7 @@ namespace COM3D2.MeidoPhotoStudio.Plugin
 
         public static bool ParseMenuFile(string menuFile, ModItem modItem)
         {
-            if (!validBG2MenuFile(menuFile)) return false;
+            if (!ValidBG2MenuFile(menuFile)) return false;
 
             byte[] buf = null;
             try
@@ -652,7 +652,7 @@ namespace COM3D2.MeidoPhotoStudio.Plugin
 
         public static bool ParseModMenuFile(string modMenuFile, ModItem modItem)
         {
-            if (!validBG2MenuFile(modMenuFile)) return false;
+            if (!ValidBG2MenuFile(modMenuFile)) return false;
 
             byte[] buf = null;
             try
@@ -732,7 +732,12 @@ namespace COM3D2.MeidoPhotoStudio.Plugin
             return true;
         }
 
-        private static bool validBG2MenuFile(string menu)
+        public static bool ValidBG2MenuFile(ModItem modItem)
+        {
+            return accMpn.Contains(modItem.Category) && ValidBG2MenuFile(modItem.MenuFile);
+        }
+
+        public static bool ValidBG2MenuFile(string menu)
         {
             menu = Path.GetFileNameWithoutExtension(menu).ToLower();
             return !(menu.EndsWith("_del") || menu.Contains("zurashi") || menu.Contains("mekure")
@@ -754,7 +759,34 @@ namespace COM3D2.MeidoPhotoStudio.Plugin
             public float Priority { get; set; }
             public bool IsMod { get; set; }
             public bool IsOfficialMod { get; set; }
-            public string ModelFile { get; set; }
+
+            public static ModItem Deserialize(BinaryReader binaryReader)
+            {
+                return new ModItem()
+                {
+                    MenuFile = binaryReader.ReadNullableString(),
+                    BaseMenuFile = binaryReader.ReadNullableString(),
+                    IconFile = binaryReader.ReadNullableString(),
+                    Name = binaryReader.ReadNullableString(),
+                    Category = binaryReader.ReadNullableString(),
+                    Priority = float.Parse(binaryReader.ReadNullableString()),
+                    IsMod = binaryReader.ReadBoolean(),
+                    IsOfficialMod = binaryReader.ReadBoolean()
+                };
+            }
+
+            public void Serialize(BinaryWriter binaryWriter)
+            {
+                if (IsOfficialMod) return;
+                binaryWriter.WriteNullableString(MenuFile);
+                binaryWriter.WriteNullableString(BaseMenuFile);
+                binaryWriter.WriteNullableString(IconFile);
+                binaryWriter.WriteNullableString(Name);
+                binaryWriter.WriteNullableString(Category);
+                binaryWriter.WriteNullableString(Priority.ToString());
+                binaryWriter.Write(IsMod);
+                binaryWriter.Write(IsOfficialMod);
+            }
         }
 
         public class MyRoomItem : MenuItem