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 c75e532ec..c03c4c45f 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -75,31 +75,32 @@ namespace Ryujinx.Ava.UI.Applet bool opened = false; UserResult response = await ContentDialogHelper.ShowDeferredContentDialog(_parent, - title, - message, - string.Empty, - LocaleManager.Instance[LocaleKeys.DialogOpenSettingsWindowLabel], - string.Empty, - LocaleManager.Instance[LocaleKeys.SettingsButtonClose], - (int)Symbol.Important, - deferEvent, - async window => - { - if (opened) - { - return; - } + title, + message, + string.Empty, + LocaleManager.Instance[LocaleKeys.DialogOpenSettingsWindowLabel], + string.Empty, + LocaleManager.Instance[LocaleKeys.SettingsButtonClose], + (int)Symbol.Important, + deferEvent, + async window => + { + if (opened) + { + return; + } - opened = true; + opened = true; - _parent.SettingsWindow = new SettingsWindow(_parent.VirtualFileSystem, _parent.ContentManager); + _parent.SettingsWindow = + new SettingsWindow(_parent.VirtualFileSystem, _parent.ContentManager); - await _parent.SettingsWindow.ShowDialog(window); + await _parent.SettingsWindow.ShowDialog(window); - _parent.SettingsWindow = null; + _parent.SettingsWindow = null; - opened = false; - }); + opened = false; + }); if (response == UserResult.Ok) { @@ -110,7 +111,9 @@ namespace Ryujinx.Ava.UI.Applet } catch (Exception ex) { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogMessageDialogErrorExceptionMessage, ex)); + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogMessageDialogErrorExceptionMessage, ex)); dialogCloseEvent.Set(); } @@ -134,7 +137,9 @@ namespace Ryujinx.Ava.UI.Applet try { _parent.ViewModel.AppHost.NpadManager.BlockInputUpdates(); - (UserResult result, string userInput) = await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.SoftwareKeyboard], args); + (UserResult result, string userInput) = + await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.SoftwareKeyboard], + args); if (result == UserResult.Ok) { @@ -146,7 +151,9 @@ namespace Ryujinx.Ava.UI.Applet { error = true; - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogSoftwareKeyboardErrorExceptionMessage, ex)); + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogSoftwareKeyboardErrorExceptionMessage, ex)); } finally { @@ -177,7 +184,8 @@ namespace Ryujinx.Ava.UI.Applet args.InitialText = "Ryujinx"; args.StringLengthMin = 1; args.StringLengthMax = 25; - (UserResult result, string userInput) = await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.CabinetDialog], args); + (UserResult result, string userInput) = + await SwkbdAppletDialog.ShowInputDialog(LocaleManager.Instance[LocaleKeys.CabinetDialog], args); if (result == UserResult.Ok) { inputText = userInput; @@ -201,11 +209,13 @@ namespace Ryujinx.Ava.UI.Applet Dispatcher.UIThread.InvokeAsync(async () => { dialogCloseEvent.Set(); - await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.CabinetScanDialog], - string.Empty, - LocaleManager.Instance[LocaleKeys.InputDialogOk], - string.Empty, - LocaleManager.Instance[LocaleKeys.CabinetTitle]); + await ContentDialogHelper.CreateInfoDialog( + LocaleManager.Instance[LocaleKeys.CabinetScanDialog], + string.Empty, + LocaleManager.Instance[LocaleKeys.InputDialogOk], + string.Empty, + LocaleManager.Instance[LocaleKeys.CabinetTitle] + ); }); dialogCloseEvent.WaitOne(); } @@ -217,7 +227,8 @@ 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); @@ -229,9 +240,7 @@ namespace Ryujinx.Ava.UI.Applet { ErrorAppletWindow msgDialog = new(_parent, buttons, message) { - Title = title, - WindowStartupLocation = WindowStartupLocation.CenterScreen, - Width = 400 + Title = title, WindowStartupLocation = WindowStartupLocation.CenterScreen, Width = 400 }; object response = await msgDialog.Run(); @@ -249,7 +258,9 @@ namespace Ryujinx.Ava.UI.Applet { dialogCloseEvent.Set(); - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogErrorAppletErrorExceptionMessage, ex)); + await ContentDialogHelper.CreateErrorDialog( + LocaleManager.Instance.UpdateAndGetDynamicValue( + LocaleKeys.DialogErrorAppletErrorExceptionMessage, ex)); } }); @@ -259,38 +270,36 @@ namespace Ryujinx.Ava.UI.Applet } public IDynamicTextInputHandler CreateDynamicTextInputHandler() => new AvaloniaDynamicTextInputHandler(_parent); - + public UserProfile ShowPlayerSelectDialog() { UserId selected = UserId.Null; byte[] defaultGuestImage = EmbeddedResources.Read("Ryujinx.HLE/HOS/Services/Account/Acc/GuestUserImage.jpg"); UserProfile guest = new(new UserId("00000000000000000000000000000080"), "Guest", defaultGuestImage); - + ManualResetEvent dialogCloseEvent = new(false); - + Dispatcher.UIThread.InvokeAsync(async () => { ObservableCollection profiles = []; NavigationDialogHost nav = new(); - + _parent.AccountManager.GetAllUsers() .OrderBy(x => x.Name) .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 + Profiles = profiles, SelectedUserId = _parent.AccountManager.LastOpenedUser.UserId }; - UserSelectorDialog content = new(viewModel); - (selected, _) = await UserSelectorDialog.ShowInputDialog(content); - + (selected, _) = await ProfileSelectorDialog.ShowInputDialog(viewModel); + dialogCloseEvent.Set(); }); - + dialogCloseEvent.WaitOne(); - + UserProfile profile = _parent.AccountManager.LastOpenedUser; if (selected == guest.UserId) { @@ -311,6 +320,7 @@ namespace Ryujinx.Ava.UI.Applet } } } + return profile; } } 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 85% rename from src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs rename to src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs index 95081913e..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(UserSelectorDialog content) + public static async Task<(UserId Id, bool Result)> ShowInputDialog(ProfileSelectorDialogViewModel 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 ProfileSelectorDialog(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); } } } 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], 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; 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 @@ -