aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs')
-rw-r--r--src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs70
1 files changed, 66 insertions, 4 deletions
diff --git a/src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs b/src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs
index 7340873a..2c29660b 100644
--- a/src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs
+++ b/src/Ryujinx.Ava/UI/ViewModels/ModManagerViewModel.cs
@@ -8,8 +8,10 @@ using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.Models;
using Ryujinx.Common.Configuration;
+using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.HOS;
+using System;
using System.IO;
using System.Linq;
@@ -181,7 +183,30 @@ namespace Ryujinx.Ava.UI.ViewModels
public void Delete(ModModel model)
{
- Directory.Delete(model.Path, true);
+ var modsDir = ModLoader.GetApplicationDir(ModLoader.GetSdModsBasePath(), _applicationId.ToString("x16"));
+ var parentDir = String.Empty;
+
+ foreach (var dir in Directory.GetDirectories(modsDir, "*", SearchOption.TopDirectoryOnly))
+ {
+ if (Directory.GetDirectories(dir, "*", SearchOption.AllDirectories).Contains(model.Path))
+ {
+ parentDir = dir;
+ }
+ }
+
+ if (parentDir == String.Empty)
+ {
+ 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);
OnPropertyChanged(nameof(ModCount));
@@ -190,9 +215,43 @@ namespace Ryujinx.Ava.UI.ViewModels
private void AddMod(DirectoryInfo directory)
{
- var directories = Directory.GetDirectories(directory.ToString(), "*", SearchOption.AllDirectories);
+ string[] directories;
+
+ try
+ {
+ directories = Directory.GetDirectories(directory.ToString(), "*", SearchOption.AllDirectories);
+ }
+ catch (Exception exception)
+ {
+ Dispatcher.UIThread.Post(async () =>
+ {
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(
+ LocaleKeys.DialogLoadFileErrorMessage,
+ exception.ToString(),
+ directory));
+ });
+ return;
+ }
+
var destinationDir = ModLoader.GetApplicationDir(ModLoader.GetSdModsBasePath(), _applicationId.ToString("x16"));
+ // TODO: More robust checking for valid mod folders
+ var isDirectoryValid = true;
+
+ if (directories.Length == 0)
+ {
+ isDirectoryValid = false;
+ }
+
+ if (!isDirectoryValid)
+ {
+ Dispatcher.UIThread.Post(async () =>
+ {
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogModInvalidMessage]);
+ });
+ return;
+ }
+
foreach (var dir in directories)
{
string dirToCreate = dir.Replace(directory.Parent.ToString(), destinationDir);
@@ -202,7 +261,10 @@ namespace Ryujinx.Ava.UI.ViewModels
{
Dispatcher.UIThread.Post(async () =>
{
- await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogLoadFileErrorMessage, LocaleKeys.DialogModAlreadyExistsMessage, dirToCreate));
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(
+ LocaleKeys.DialogLoadFileErrorMessage,
+ LocaleManager.Instance[LocaleKeys.DialogModAlreadyExistsMessage],
+ dirToCreate));
});
return;
@@ -239,7 +301,7 @@ namespace Ryujinx.Ava.UI.ViewModels
{
foreach (var mod in Mods)
{
- Directory.Delete(mod.Path, true);
+ Delete(mod);
}
Mods.Clear();