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
This commit is contained in:
Isaac Marovitz 2024-01-29 22:14:19 +00:00 committed by GitHub
parent a8fbcdae9f
commit bb4a28b525
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 39 additions and 23 deletions

View file

@ -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;
} }
} }
} }

View file

@ -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 isSubdir = true;
var parentDir = String.Empty; 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)) isSubdir = false;
}
if (isSubdir)
{
var parentDir = String.Empty;
foreach (var dir in Directory.GetDirectories(modsDir, "*", SearchOption.TopDirectoryOnly))
{ {
parentDir = dir; 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;
} }
} }
if (parentDir == String.Empty) Logger.Info?.Print(LogClass.Application, $"Deleting mod at \"{pathToDelete}\"");
{ Directory.Delete(pathToDelete, true);
Dispatcher.UIThread.Post(async () =>
{
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(
LocaleKeys.DialogModDeleteNoParentMessage,
parentDir));
});
return;
}
Logger.Info?.Print(LogClass.Application, $"Deleting mod at \"{model.Path}\"");
Directory.Delete(parentDir, true);
Mods.Remove(model); Mods.Remove(model);
OnPropertyChanged(nameof(ModCount)); OnPropertyChanged(nameof(ModCount));