aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Ava/Ui/ViewModels
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Ava/Ui/ViewModels')
-rw-r--r--Ryujinx.Ava/Ui/ViewModels/AmiiboWindowViewModel.cs4
-rw-r--r--Ryujinx.Ava/Ui/ViewModels/ControllerSettingsViewModel.cs13
-rw-r--r--Ryujinx.Ava/Ui/ViewModels/MainWindowViewModel.cs38
-rw-r--r--Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs3
-rw-r--r--Ryujinx.Ava/Ui/ViewModels/UserProfileViewModel.cs95
5 files changed, 58 insertions, 95 deletions
diff --git a/Ryujinx.Ava/Ui/ViewModels/AmiiboWindowViewModel.cs b/Ryujinx.Ava/Ui/ViewModels/AmiiboWindowViewModel.cs
index 9f411ba2..7015df44 100644
--- a/Ryujinx.Ava/Ui/ViewModels/AmiiboWindowViewModel.cs
+++ b/Ryujinx.Ava/Ui/ViewModels/AmiiboWindowViewModel.cs
@@ -390,7 +390,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
return amiiboJsonString;
}
- await ContentDialogHelper.CreateInfoDialog(_owner, LocaleManager.Instance["DialogAmiiboApiTitle"],
+ await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance["DialogAmiiboApiTitle"],
LocaleManager.Instance["DialogAmiiboApiFailFetchMessage"],
LocaleManager.Instance["InputDialogOk"],
"",
@@ -440,7 +440,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
private async void ShowInfoDialog()
{
- await ContentDialogHelper.CreateInfoDialog(_owner, LocaleManager.Instance["DialogAmiiboApiTitle"],
+ await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance["DialogAmiiboApiTitle"],
LocaleManager.Instance["DialogAmiiboApiConnectErrorMessage"],
LocaleManager.Instance["InputDialogOk"],
"",
diff --git a/Ryujinx.Ava/Ui/ViewModels/ControllerSettingsViewModel.cs b/Ryujinx.Ava/Ui/ViewModels/ControllerSettingsViewModel.cs
index c570aa8d..a3abdd3b 100644
--- a/Ryujinx.Ava/Ui/ViewModels/ControllerSettingsViewModel.cs
+++ b/Ryujinx.Ava/Ui/ViewModels/ControllerSettingsViewModel.cs
@@ -327,12 +327,12 @@ namespace Ryujinx.Ava.Ui.ViewModels
public async void ShowMotionConfig()
{
- await MotionSettingsWindow.Show(this, _owner.GetVisualRoot() as StyleableWindow);
+ await MotionSettingsWindow.Show(this);
}
public async void ShowRumbleConfig()
{
- await RumbleSettingsWindow.Show(this, _owner.GetVisualRoot() as StyleableWindow);
+ await RumbleSettingsWindow.Show(this);
}
private void LoadInputDriver()
@@ -701,8 +701,8 @@ namespace Ryujinx.Ava.Ui.ViewModels
catch (InvalidOperationException)
{
Logger.Error?.Print(LogClass.Configuration, $"Profile {ProfileName} is incompatible with the current input configuration system.");
- await ContentDialogHelper.CreateErrorDialog(_owner.GetVisualRoot() as StyleableWindow,
- String.Format(LocaleManager.Instance["DialogProfileInvalidProfileErrorMessage"], ProfileName));
+
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogProfileInvalidProfileErrorMessage"], ProfileName));
return;
}
@@ -736,7 +736,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
if (ProfileName == LocaleManager.Instance["ControllerSettingsProfileDefault"])
{
- await ContentDialogHelper.CreateErrorDialog(_owner.GetVisualRoot() as StyleableWindow, LocaleManager.Instance["DialogProfileDefaultProfileOverwriteErrorMessage"]);
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogProfileDefaultProfileOverwriteErrorMessage"]);
return;
}
@@ -769,7 +769,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
else
{
- await ContentDialogHelper.CreateErrorDialog(_owner.GetVisualRoot() as StyleableWindow, LocaleManager.Instance["DialogProfileInvalidProfileNameErrorMessage"]);
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogProfileInvalidProfileNameErrorMessage"]);
}
}
}
@@ -782,7 +782,6 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
- _owner.GetVisualRoot() as StyleableWindow,
LocaleManager.Instance["DialogProfileDeleteProfileTitle"],
LocaleManager.Instance["DialogProfileDeleteProfileMessage"],
LocaleManager.Instance["InputDialogYes"],
diff --git a/Ryujinx.Ava/Ui/ViewModels/MainWindowViewModel.cs b/Ryujinx.Ava/Ui/ViewModels/MainWindowViewModel.cs
index 9c027773..7e6452f9 100644
--- a/Ryujinx.Ava/Ui/ViewModels/MainWindowViewModel.cs
+++ b/Ryujinx.Ava/Ui/ViewModels/MainWindowViewModel.cs
@@ -708,7 +708,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
{
return;
}
-
+
if (_owner.AppHost.Device.System.SearchingForAmiibo(out int deviceId))
{
string titleId = _owner.AppHost.Device.Application.TitleIdText.ToUpper();
@@ -975,9 +975,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
public async void ManageProfiles()
{
- UserProfileWindow window = new(_owner.AccountManager, _owner.ContentManager, _owner.VirtualFileSystem);
-
- await window.ShowDialog(_owner);
+ await NavigationDialogHost.Show(_owner.AccountManager, _owner.ContentManager, _owner.VirtualFileSystem);
}
public async void OpenAboutWindow()
@@ -1054,8 +1052,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
{
Dispatcher.UIThread.Post(async () =>
{
- await ContentDialogHelper.CreateErrorDialog(_owner,
- LocaleManager.Instance["DialogRyujinxErrorMessage"], LocaleManager.Instance["DialogInvalidTitleIdErrorMessage"]);
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogRyujinxErrorMessage"], LocaleManager.Instance["DialogInvalidTitleIdErrorMessage"]);
});
return;
@@ -1138,7 +1135,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
DirectoryInfo backupDir = new(Path.Combine(AppDataManager.GamesDirPath, selection.TitleId, "cache", "cpu", "1"));
// FIXME: Found a way to reproduce the bold effect on the title name (fork?).
- UserResult result = await ContentDialogHelper.CreateConfirmationDialog(_owner, LocaleManager.Instance["DialogWarning"],
+ UserResult result = await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance["DialogWarning"],
string.Format(LocaleManager.Instance["DialogPPTCDeletionMessage"], selection.TitleName), LocaleManager.Instance["InputDialogYes"], LocaleManager.Instance["InputDialogNo"], LocaleManager.Instance["RyujinxConfirm"]);
List<FileInfo> cacheFiles = new();
@@ -1163,7 +1160,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
catch (Exception e)
{
- await ContentDialogHelper.CreateErrorDialog(_owner, string.Format(LocaleManager.Instance["DialogPPTCDeletionErrorMessage"], file.Name, e));
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogPPTCDeletionErrorMessage"], file.Name, e));
}
}
}
@@ -1201,7 +1198,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
DirectoryInfo shaderCacheDir = new(Path.Combine(AppDataManager.GamesDirPath, selection.TitleId, "cache", "shader"));
// FIXME: Found a way to reproduce the bold effect on the title name (fork?).
- UserResult result = await ContentDialogHelper.CreateConfirmationDialog(_owner, LocaleManager.Instance["DialogWarning"],
+ UserResult result = await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance["DialogWarning"],
string.Format(LocaleManager.Instance["DialogShaderDeletionMessage"], selection.TitleName), LocaleManager.Instance["InputDialogYes"], LocaleManager.Instance["InputDialogNo"], LocaleManager.Instance["RyujinxConfirm"]);
List<DirectoryInfo> oldCacheDirectories = new List<DirectoryInfo>();
@@ -1224,7 +1221,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
catch (Exception e)
{
- await ContentDialogHelper.CreateErrorDialog(_owner, string.Format(LocaleManager.Instance["DialogPPTCDeletionErrorMessage"], directory.Name, e));
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogPPTCDeletionErrorMessage"], directory.Name, e));
}
}
}
@@ -1237,7 +1234,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
catch (Exception e)
{
- await ContentDialogHelper.CreateErrorDialog(_owner, string.Format(LocaleManager.Instance["ShaderCachePurgeError"], file.Name, e));
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["ShaderCachePurgeError"], file.Name, e));
}
}
}
@@ -1316,12 +1313,11 @@ namespace Ryujinx.Ava.Ui.ViewModels
Task.Run(() =>
{
if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
- out ulong titleIdNumber))
+ out ulong titleIdNumber))
{
Dispatcher.UIThread.Post(async () =>
{
- await ContentDialogHelper.CreateErrorDialog(_owner,
- LocaleManager.Instance["DialogRyujinxErrorMessage"], LocaleManager.Instance["DialogInvalidTitleIdErrorMessage"]);
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogRyujinxErrorMessage"], LocaleManager.Instance["DialogInvalidTitleIdErrorMessage"]);
});
return;
@@ -1342,12 +1338,11 @@ namespace Ryujinx.Ava.Ui.ViewModels
Task.Run(() =>
{
if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
- out ulong titleIdNumber))
+ out ulong titleIdNumber))
{
Dispatcher.UIThread.Post(async () =>
{
- await ContentDialogHelper.CreateErrorDialog(_owner,
- LocaleManager.Instance["DialogRyujinxErrorMessage"], LocaleManager.Instance["DialogInvalidTitleIdErrorMessage"]);
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogRyujinxErrorMessage"], LocaleManager.Instance["DialogInvalidTitleIdErrorMessage"]);
});
return;
@@ -1406,7 +1401,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
if (firmwareVersion == null)
{
- await ContentDialogHelper.CreateErrorDialog(_owner, string.Format(LocaleManager.Instance["DialogFirmwareInstallerFirmwareNotFoundErrorMessage"], filename));
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogFirmwareInstallerFirmwareNotFoundErrorMessage"], filename));
return;
}
@@ -1426,7 +1421,6 @@ namespace Ryujinx.Ava.Ui.ViewModels
dialogMessage += LocaleManager.Instance["DialogFirmwareInstallerFirmwareInstallConfirmMessage"];
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
- _owner,
dialogTitle,
dialogMessage,
LocaleManager.Instance["InputDialogYes"],
@@ -1456,7 +1450,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
string message = string.Format(LocaleManager.Instance["DialogFirmwareInstallerFirmwareInstallSuccessMessage"], firmwareVersion.VersionString);
- await ContentDialogHelper.CreateInfoDialog(_owner, dialogTitle, message, LocaleManager.Instance["InputDialogOk"], "", LocaleManager.Instance["RyujinxInfo"]);
+ await ContentDialogHelper.CreateInfoDialog(dialogTitle, message, LocaleManager.Instance["InputDialogOk"], "", LocaleManager.Instance["RyujinxInfo"]);
Logger.Info?.Print(LogClass.Application, message);
// Purge Applet Cache.
@@ -1475,7 +1469,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
{
waitingDialog.Close();
- await ContentDialogHelper.CreateErrorDialog(_owner, ex.Message);
+ await ContentDialogHelper.CreateErrorDialog(ex.Message);
});
}
finally
@@ -1496,7 +1490,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
catch (Exception ex)
{
- await ContentDialogHelper.CreateErrorDialog(_owner, ex.Message);
+ await ContentDialogHelper.CreateErrorDialog(ex.Message);
}
}
diff --git a/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs b/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs
index ef7a53e6..7b175f08 100644
--- a/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs
+++ b/Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs
@@ -63,8 +63,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
{
Dispatcher.UIThread.Post(async () =>
{
- await ContentDialogHelper.CreateInfoDialog(_owner,
- LocaleManager.Instance["DialogSettingsBackendThreadingWarningMessage"],
+ await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance["DialogSettingsBackendThreadingWarningMessage"],
"",
"",
LocaleManager.Instance["InputDialogOk"],
diff --git a/Ryujinx.Ava/Ui/ViewModels/UserProfileViewModel.cs b/Ryujinx.Ava/Ui/ViewModels/UserProfileViewModel.cs
index 66fa7e34..f7a50077 100644
--- a/Ryujinx.Ava/Ui/ViewModels/UserProfileViewModel.cs
+++ b/Ryujinx.Ava/Ui/ViewModels/UserProfileViewModel.cs
@@ -1,31 +1,27 @@
using Avalonia.Threading;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Ui.Controls;
-using Ryujinx.Ava.Ui.Windows;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using System;
using System.Collections.ObjectModel;
using System.Linq;
-using System.Threading.Tasks;
using UserProfile = Ryujinx.Ava.Ui.Models.UserProfile;
namespace Ryujinx.Ava.Ui.ViewModels
{
public class UserProfileViewModel : BaseModel, IDisposable
{
- private const uint MaxProfileNameLength = 0x20;
-
- private readonly UserProfileWindow _owner;
+ private readonly NavigationDialogHost _owner;
private UserProfile _selectedProfile;
- private string _tempUserName;
+ private UserProfile _highlightedProfile;
public UserProfileViewModel()
{
Profiles = new ObservableCollection<UserProfile>();
}
- public UserProfileViewModel(UserProfileWindow owner) : this()
+ public UserProfileViewModel(NavigationDialogHost owner) : this()
{
_owner = owner;
@@ -42,12 +38,29 @@ namespace Ryujinx.Ava.Ui.ViewModels
_selectedProfile = value;
OnPropertyChanged(nameof(SelectedProfile));
- OnPropertyChanged(nameof(IsSelectedProfileDeletable));
+ OnPropertyChanged(nameof(IsHighlightedProfileDeletable));
+ OnPropertyChanged(nameof(IsHighlightedProfileEditable));
}
}
- public bool IsSelectedProfileDeletable =>
- _selectedProfile != null && _selectedProfile.UserId != AccountManager.DefaultUserId;
+ public bool IsHighlightedProfileEditable =>
+ _highlightedProfile != null;
+
+ public bool IsHighlightedProfileDeletable =>
+ _highlightedProfile != null && _highlightedProfile.UserId != AccountManager.DefaultUserId;
+
+ public UserProfile HighlightedProfile
+ {
+ get => _highlightedProfile;
+ set
+ {
+ _highlightedProfile = value;
+
+ OnPropertyChanged(nameof(HighlightedProfile));
+ OnPropertyChanged(nameof(IsHighlightedProfileDeletable));
+ OnPropertyChanged(nameof(IsHighlightedProfileEditable));
+ }
+ }
public void Dispose()
{
@@ -78,64 +91,24 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
}
- public async void ChooseProfileImage()
+ public void AddUser()
{
- await SelectProfileImage();
+ UserProfile userProfile = null;
+ _owner.Navigate(typeof(UserEditor), (this._owner, userProfile, true));
}
- public async Task SelectProfileImage(bool isNewUser = false)
+ public void EditUser()
{
- ProfileImageSelectionDialog selectionDialog = new(_owner.ContentManager);
-
- await selectionDialog.ShowDialog(_owner);
-
- if (selectionDialog.BufferImageProfile != null)
- {
- if (isNewUser)
- {
- if (!string.IsNullOrWhiteSpace(_tempUserName))
- {
- _owner.AccountManager.AddUser(_tempUserName, selectionDialog.BufferImageProfile);
- }
- }
- else if (SelectedProfile != null)
- {
- _owner.AccountManager.SetUserImage(SelectedProfile.UserId, selectionDialog.BufferImageProfile);
- SelectedProfile.Image = selectionDialog.BufferImageProfile;
-
- SelectedProfile = null;
- }
-
- LoadProfiles();
- }
- }
-
- public async void AddUser()
- {
- var dlgTitle = LocaleManager.Instance["InputDialogAddNewProfileTitle"];
- var dlgMainText = LocaleManager.Instance["InputDialogAddNewProfileHeader"];
- var dlgSubText = string.Format(LocaleManager.Instance["InputDialogAddNewProfileSubtext"],
- MaxProfileNameLength);
-
- _tempUserName =
- await ContentDialogHelper.CreateInputDialog(dlgTitle, dlgMainText, dlgSubText, _owner,
- MaxProfileNameLength);
-
- if (!string.IsNullOrWhiteSpace(_tempUserName))
- {
- await SelectProfileImage(true);
- }
-
- _tempUserName = String.Empty;
+ _owner.Navigate(typeof(UserEditor), (this._owner, _highlightedProfile ?? SelectedProfile, false));
}
public async void DeleteUser()
{
- if (_selectedProfile != null)
+ if (_highlightedProfile != null)
{
var lastUserId = _owner.AccountManager.LastOpenedUser.UserId;
- if (_selectedProfile.UserId == lastUserId)
+ if (_highlightedProfile.UserId == lastUserId)
{
// If we are deleting the currently open profile, then we must open something else before deleting.
var profile = Profiles.FirstOrDefault(x => x.UserId != lastUserId);
@@ -144,8 +117,7 @@ namespace Ryujinx.Ava.Ui.ViewModels
{
Dispatcher.UIThread.Post(async () =>
{
- await ContentDialogHelper.CreateErrorDialog(_owner,
- LocaleManager.Instance["DialogUserProfileDeletionWarningMessage"]);
+ await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance["DialogUserProfileDeletionWarningMessage"]);
});
return;
@@ -155,13 +127,12 @@ namespace Ryujinx.Ava.Ui.ViewModels
}
var result =
- await ContentDialogHelper.CreateConfirmationDialog(_owner,
- LocaleManager.Instance["DialogUserProfileDeletionConfirmMessage"], "",
+ await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance["DialogUserProfileDeletionConfirmMessage"], "",
LocaleManager.Instance["InputDialogYes"], LocaleManager.Instance["InputDialogNo"], "");
if (result == UserResult.Yes)
{
- _owner.AccountManager.DeleteUser(_selectedProfile.UserId);
+ _owner.AccountManager.DeleteUser(_highlightedProfile.UserId);
}
}