From e8e1dc661923ac65a07ce6f9b88a9890aee2b4cf Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 11 Feb 2025 20:30:46 -0600 Subject: [PATCH 1/6] misc: chore: this isn't even bound to a XAML element, why was this an async void --- src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs index e8869c475..e550c4ae0 100644 --- a/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AmiiboWindowViewModel.cs @@ -264,7 +264,7 @@ namespace Ryujinx.Ava.UI.ViewModels Logger.Error?.Print(LogClass.Application, $"Couldn't get valid amiibo data: {exception}"); // Neither local or remote files are valid JSON, close window. - ShowInfoDialog(); + await ShowInfoDialog(); Close(); } else if (!remoteIsValid) @@ -273,7 +273,7 @@ namespace Ryujinx.Ava.UI.ViewModels // Only the local file is valid, the local one should be used // but the user should be warned. - ShowInfoDialog(); + await ShowInfoDialog(); } } @@ -525,7 +525,7 @@ namespace Ryujinx.Ava.UI.ViewModels AmiiboImage = bitmap; } - private static async void ShowInfoDialog() + private static async Task ShowInfoDialog() { await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogAmiiboApiTitle], LocaleManager.Instance[LocaleKeys.DialogAmiiboApiConnectErrorMessage], From 06d34a5992fcd2613502e5abc5791e7de3cfb168 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 11 Feb 2025 20:36:11 -0600 Subject: [PATCH 2/6] misc: chore: optimize UserSelectorDialog closed handler --- src/Ryujinx/UI/Applet/AvaHostUIHandler.cs | 3 +-- .../UI/Applet/UserSelectorDialog.axaml.cs | 23 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index c75e532ec..06b18df11 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -283,8 +283,7 @@ namespace Ryujinx.Ava.UI.Applet Profiles = profiles, SelectedUserId = _parent.AccountManager.LastOpenedUser.UserId }; - UserSelectorDialog content = new(viewModel); - (selected, _) = await UserSelectorDialog.ShowInputDialog(content); + (selected, _) = await UserSelectorDialog.ShowInputDialog(viewModel); dialogCloseEvent.Set(); }); diff --git a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs index 95081913e..660094c59 100644 --- a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs +++ b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs @@ -79,7 +79,7 @@ namespace Ryujinx.Ava.UI.Applet } } - public static async Task<(UserId Id, bool Result)> ShowInputDialog(UserSelectorDialog content) + public static async Task<(UserId Id, bool Result)> ShowInputDialog(UserSelectorDialogViewModel viewModel) { ContentDialog contentDialog = new() { @@ -87,22 +87,25 @@ namespace Ryujinx.Ava.UI.Applet PrimaryButtonText = LocaleManager.Instance[LocaleKeys.Continue], SecondaryButtonText = string.Empty, CloseButtonText = LocaleManager.Instance[LocaleKeys.Cancel], - Content = content, + Content = new UserSelectorDialog(viewModel), Padding = new Thickness(0) }; UserId result = UserId.Null; bool input = false; + + contentDialog.Closed += Handler; + await ContentDialogHelper.ShowAsync(contentDialog); + + return (result, input); + void Handler(ContentDialog sender, ContentDialogClosedEventArgs eventArgs) { if (eventArgs.Result == ContentDialogResult.Primary) { - if (contentDialog.Content is UserSelectorDialog view) - { - result = view.ViewModel.SelectedUserId; - input = true; - } + result = viewModel.SelectedUserId; + input = true; } else { @@ -110,12 +113,6 @@ namespace Ryujinx.Ava.UI.Applet input = false; } } - - contentDialog.Closed += Handler; - - await ContentDialogHelper.ShowAsync(contentDialog); - - return (result, input); } } } From d3f84a1305e1d49d1e2b953ba5298352907c2d6a Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 11 Feb 2025 20:50:06 -0600 Subject: [PATCH 3/6] misc: chore: Rename UserSelectorDialog to ProfileSelectorDialog --- src/Ryujinx/UI/Applet/AvaHostUIHandler.cs | 4 ++-- ...rDialog.axaml => ProfileSelectorDialog.axaml} | 6 +++--- ...g.axaml.cs => ProfileSelectorDialog.axaml.cs} | 16 ++++++++-------- ...odel.cs => ProfileSelectorDialogViewModel.cs} | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) rename src/Ryujinx/UI/Applet/{UserSelectorDialog.axaml => ProfileSelectorDialog.axaml} (96%) rename src/Ryujinx/UI/Applet/{UserSelectorDialog.axaml.cs => ProfileSelectorDialog.axaml.cs} (89%) rename src/Ryujinx/UI/ViewModels/{UserSelectorDialogViewModel.cs => ProfileSelectorDialogViewModel.cs} (82%) diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index 06b18df11..ddd0fee8c 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -278,12 +278,12 @@ namespace Ryujinx.Ava.UI.Applet .ForEach(profile => profiles.Add(new Models.UserProfile(profile, nav))); profiles.Add(new Models.UserProfile(guest, nav)); - UserSelectorDialogViewModel viewModel = new() + ProfileSelectorDialogViewModel viewModel = new() { Profiles = profiles, SelectedUserId = _parent.AccountManager.LastOpenedUser.UserId }; - (selected, _) = await UserSelectorDialog.ShowInputDialog(viewModel); + (selected, _) = await ProfileSelectorDialog.ShowInputDialog(viewModel); dialogCloseEvent.Set(); }); diff --git a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml similarity index 96% rename from src/Ryujinx/UI/Applet/UserSelectorDialog.axaml rename to src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml index 2816afbce..d929cc501 100644 --- a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml +++ b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml @@ -1,5 +1,5 @@ + x:DataType="viewModels:ProfileSelectorDialogViewModel"> - + diff --git a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs similarity index 89% rename from src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs rename to src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs index 660094c59..b2c396b69 100644 --- a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs +++ b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs @@ -16,15 +16,15 @@ using UserProfileSft = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; namespace Ryujinx.Ava.UI.Applet { - public partial class UserSelectorDialog : UserControl, INotifyPropertyChanged + public partial class ProfileSelectorDialog : UserControl { - public UserSelectorDialogViewModel ViewModel { get; set; } + public ProfileSelectorDialogViewModel ViewModel { get; set; } - public UserSelectorDialog(UserSelectorDialogViewModel viewModel) + public ProfileSelectorDialog(ProfileSelectorDialogViewModel viewModel) { + DataContext = ViewModel = viewModel; + InitializeComponent(); - ViewModel = viewModel; - DataContext = ViewModel; } private void Grid_PointerEntered(object sender, PointerEventArgs e) @@ -54,7 +54,7 @@ namespace Ryujinx.Ava.UI.Applet if (ViewModel.Profiles[selectedIndex] is UserProfile userProfile) { ViewModel.SelectedUserId = userProfile.UserId; - Logger.Info?.Print(LogClass.UI, $"Selected user: {userProfile.UserId}"); + Logger.Info?.Print(LogClass.UI, $"Selected: {userProfile.UserId}", "ProfileSelector"); ObservableCollection newProfiles = []; @@ -79,7 +79,7 @@ namespace Ryujinx.Ava.UI.Applet } } - public static async Task<(UserId Id, bool Result)> ShowInputDialog(UserSelectorDialogViewModel viewModel) + public static async Task<(UserId Id, bool Result)> ShowInputDialog(ProfileSelectorDialogViewModel viewModel) { ContentDialog contentDialog = new() { @@ -87,7 +87,7 @@ namespace Ryujinx.Ava.UI.Applet PrimaryButtonText = LocaleManager.Instance[LocaleKeys.Continue], SecondaryButtonText = string.Empty, CloseButtonText = LocaleManager.Instance[LocaleKeys.Cancel], - Content = new UserSelectorDialog(viewModel), + Content = new ProfileSelectorDialog(viewModel), Padding = new Thickness(0) }; diff --git a/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs b/src/Ryujinx/UI/ViewModels/ProfileSelectorDialogViewModel.cs similarity index 82% rename from src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs rename to src/Ryujinx/UI/ViewModels/ProfileSelectorDialogViewModel.cs index 094aed5cf..979e1616a 100644 --- a/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/ProfileSelectorDialogViewModel.cs @@ -4,7 +4,7 @@ using System.Collections.ObjectModel; namespace Ryujinx.Ava.UI.ViewModels { - public partial class UserSelectorDialogViewModel : BaseModel + public partial class ProfileSelectorDialogViewModel : BaseModel { [ObservableProperty] private UserId _selectedUserId; From f6822f73587c473763c5230ab9aa4437312f2110 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 11 Feb 2025 21:09:55 -0600 Subject: [PATCH 4/6] misc: chore: add direct error code tuple to DisplayErrorAppletDialog for use when i find the list of error codes -> causes --- src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs | 6 ++++-- src/Ryujinx.HLE/UI/IHostUIHandler.cs | 4 +++- src/Ryujinx/Headless/Windows/WindowBase.cs | 4 ++-- src/Ryujinx/UI/Applet/AvaHostUIHandler.cs | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs b/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs index 2faff6e61..47bfadc4c 100644 --- a/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs +++ b/src/Ryujinx.HLE/HOS/Applets/Error/ErrorApplet.cs @@ -158,13 +158,15 @@ namespace Ryujinx.HLE.HOS.Applets.Error string[] buttons = GetButtonsText(module, description, "DlgBtn"); - bool showDetails = _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Code: {module}-{description:0000}", "\n" + message, buttons); + (uint Module, uint Description) errorCodeTuple = (module, uint.Parse(description.ToString("0000"))); + + bool showDetails = _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Error Code: {module}-{description:0000}", "\n" + message, buttons, errorCodeTuple); if (showDetails) { message = GetMessageText(module, description, "FlvMsg"); buttons = GetButtonsText(module, description, "FlvBtn"); - _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Details: {module}-{description:0000}", "\n" + message, buttons); + _horizon.Device.UIHandler.DisplayErrorAppletDialog($"Details: {module}-{description:0000}", "\n" + message, buttons, errorCodeTuple); } } diff --git a/src/Ryujinx.HLE/UI/IHostUIHandler.cs b/src/Ryujinx.HLE/UI/IHostUIHandler.cs index 8ccb5cf89..3748eef39 100644 --- a/src/Ryujinx.HLE/UI/IHostUIHandler.cs +++ b/src/Ryujinx.HLE/UI/IHostUIHandler.cs @@ -45,10 +45,12 @@ namespace Ryujinx.HLE.UI /// The value associated to the . void ExecuteProgram(Switch device, ProgramSpecifyKind kind, ulong value); + /// /// Displays a Message Dialog box specific to Error Applet and blocks until it is closed. /// /// False when OK is pressed, True when another button (Details) is pressed. - bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText); + // ReSharper disable once UnusedParameter.Global + bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText, (uint Module, uint Description)? errorCode = null); /// /// Creates a handler to process keyboard inputs into text strings. diff --git a/src/Ryujinx/Headless/Windows/WindowBase.cs b/src/Ryujinx/Headless/Windows/WindowBase.cs index c9d672af4..081998a00 100644 --- a/src/Ryujinx/Headless/Windows/WindowBase.cs +++ b/src/Ryujinx/Headless/Windows/WindowBase.cs @@ -513,7 +513,7 @@ namespace Ryujinx.Headless Exit(); } - public bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText) + public bool DisplayErrorAppletDialog(string title, string message, string[] buttonsText, (uint Module, uint Description)? errorCode = null) { SDL_MessageBoxData data = new() { @@ -521,7 +521,7 @@ namespace Ryujinx.Headless message = message, buttons = new SDL_MessageBoxButtonData[buttonsText.Length], numbuttons = buttonsText.Length, - window = WindowHandle, + window = WindowHandle }; for (int i = 0; i < buttonsText.Length; i++) diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index ddd0fee8c..7e4c55e4d 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -217,7 +217,7 @@ namespace Ryujinx.Ava.UI.Applet _parent.ViewModel.AppHost?.Stop(); } - public bool DisplayErrorAppletDialog(string title, string message, string[] buttons) + public bool DisplayErrorAppletDialog(string title, string message, string[] buttons, (uint Module, uint Description)? errorCode = null) { ManualResetEvent dialogCloseEvent = new(false); From e23d610f4915f3275624e13c2fdd7d206e5bb280 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Tue, 11 Feb 2025 21:18:05 -0600 Subject: [PATCH 5/6] UI: Change Update Available button text color to white --- src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml index 7265086c4..02cc1fc7b 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml @@ -290,12 +290,12 @@ -