Jelajahi Sumber

Ava UI: Mod Manager Fixes (Again) (#6187)

* Fix typo + Fix deleting from old dir

* Avoid double enumeration

* Break when parentDir is found

* Fix deleting non subdirectory mods

* Typo
Isaac Marovitz 2 tahun lalu
induk
melakukan
bb4a28b525

+ 3 - 1
src/Ryujinx.Ava/UI/Models/ModModel.cs

@@ -17,14 +17,16 @@ namespace Ryujinx.Ava.UI.Models
             }
             }
         }
         }
 
 
+        public bool InSd { get; }
         public string Path { get; }
         public string Path { get; }
         public string Name { get; }
         public string Name { get; }
 
 
-        public ModModel(string path, string name, bool enabled)
+        public ModModel(string path, string name, bool enabled, bool inSd)
         {
         {
             Path = path;
             Path = path;
             Name = name;
             Name = name;
             Enabled = enabled;
             Enabled = enabled;
+            InSd = inSd;
         }
         }
     }
     }
 }
 }

+ 34 - 20
src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs

@@ -102,13 +102,14 @@ namespace Ryujinx.Ava.UI.ViewModels
 
 
             foreach (var path in modsBasePaths)
             foreach (var path in modsBasePaths)
             {
             {
+                var inSd = path == ModLoader.GetSdModsBasePath();
                 var modCache = new ModLoader.ModCache();
                 var modCache = new ModLoader.ModCache();
 
 
                 ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId);
                 ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId);
 
 
                 foreach (var mod in modCache.RomfsDirs)
                 foreach (var mod in modCache.RomfsDirs)
                 {
                 {
-                    var modModel = new ModModel(mod.Path.Parent.FullName, mod.Name, mod.Enabled);
+                    var modModel = new ModModel(mod.Path.Parent.FullName, mod.Name, mod.Enabled, inSd);
                     if (Mods.All(x => x.Path != mod.Path.Parent.FullName))
                     if (Mods.All(x => x.Path != mod.Path.Parent.FullName))
                     {
                     {
                         Mods.Add(modModel);
                         Mods.Add(modModel);
@@ -117,12 +118,12 @@ namespace Ryujinx.Ava.UI.ViewModels
 
 
                 foreach (var mod in modCache.RomfsContainers)
                 foreach (var mod in modCache.RomfsContainers)
                 {
                 {
-                    Mods.Add(new ModModel(mod.Path.FullName, mod.Name, mod.Enabled));
+                    Mods.Add(new ModModel(mod.Path.FullName, mod.Name, mod.Enabled, inSd));
                 }
                 }
 
 
                 foreach (var mod in modCache.ExefsDirs)
                 foreach (var mod in modCache.ExefsDirs)
                 {
                 {
-                    var modModel = new ModModel(mod.Path.Parent.FullName, mod.Name, mod.Enabled);
+                    var modModel = new ModModel(mod.Path.Parent.FullName, mod.Name, mod.Enabled, inSd);
                     if (Mods.All(x => x.Path != mod.Path.Parent.FullName))
                     if (Mods.All(x => x.Path != mod.Path.Parent.FullName))
                     {
                     {
                         Mods.Add(modModel);
                         Mods.Add(modModel);
@@ -131,7 +132,7 @@ namespace Ryujinx.Ava.UI.ViewModels
 
 
                 foreach (var mod in modCache.ExefsContainers)
                 foreach (var mod in modCache.ExefsContainers)
                 {
                 {
-                    Mods.Add(new ModModel(mod.Path.FullName, mod.Name, mod.Enabled));
+                    Mods.Add(new ModModel(mod.Path.FullName, mod.Name, mod.Enabled, inSd));
                 }
                 }
             }
             }
 
 
@@ -183,30 +184,43 @@ namespace Ryujinx.Ava.UI.ViewModels
 
 
         public void Delete(ModModel model)
         public void Delete(ModModel model)
         {
         {
-            var modsDir = ModLoader.GetApplicationDir(ModLoader.GetSdModsBasePath(), _applicationId.ToString("x16"));
-            var parentDir = String.Empty;
+            var isSubdir = true;
+            var pathToDelete = model.Path;
+            var basePath = model.InSd ? ModLoader.GetSdModsBasePath() : ModLoader.GetModsBasePath();
+            var modsDir = ModLoader.GetApplicationDir(basePath, _applicationId.ToString("x16"));
 
 
-            foreach (var dir in Directory.GetDirectories(modsDir, "*", SearchOption.TopDirectoryOnly))
+            if (new DirectoryInfo(model.Path).Parent?.FullName == modsDir)
             {
             {
-                if (Directory.GetDirectories(dir, "*", SearchOption.AllDirectories).Contains(model.Path))
-                {
-                    parentDir = dir;
-                }
+                isSubdir = false;
             }
             }
 
 
-            if (parentDir == String.Empty)
+            if (isSubdir)
             {
             {
-                Dispatcher.UIThread.Post(async () =>
+                var parentDir = String.Empty;
+
+                foreach (var dir in Directory.GetDirectories(modsDir, "*", SearchOption.TopDirectoryOnly))
                 {
                 {
-                    await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(
-                        LocaleKeys.DialogModDeleteNoParentMessage,
-                        parentDir));
-                });
-                return;
+                    if (Directory.GetDirectories(dir, "*", SearchOption.AllDirectories).Contains(model.Path))
+                    {
+                        parentDir = dir;
+                        break;
+                    }
+                }
+
+                if (parentDir == String.Empty)
+                {
+                    Dispatcher.UIThread.Post(async () =>
+                    {
+                        await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(
+                            LocaleKeys.DialogModDeleteNoParentMessage,
+                            model.Path));
+                    });
+                    return;
+                }
             }
             }
 
 
-            Logger.Info?.Print(LogClass.Application, $"Deleting mod at \"{model.Path}\"");
-            Directory.Delete(parentDir, true);
+            Logger.Info?.Print(LogClass.Application, $"Deleting mod at \"{pathToDelete}\"");
+            Directory.Delete(pathToDelete, true);
 
 
             Mods.Remove(model);
             Mods.Remove(model);
             OnPropertyChanged(nameof(ModCount));
             OnPropertyChanged(nameof(ModCount));