From 76671d63d4f3ea18f8ad99e9ce9f0b2ec9a2599d Mon Sep 17 00:00:00 2001
From: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>
Date: Thu, 29 Dec 2022 14:24:05 +0000
Subject: Ava GUI: Restructure `Ryujinx.Ava` (#4165)
* Restructure `Ryujinx.Ava`
* Stylistic consistency
* Update Ryujinx.Ava/UI/Controls/UserEditor.axaml.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Controls/UserEditor.axaml.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Controls/UserSelector.axaml.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Controls/SaveManager.axaml.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Controls/SaveManager.axaml.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Helpers/EmbeddedWindow.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Helpers/EmbeddedWindow.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Helpers/EmbeddedWindow.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Helpers/EmbeddedWindow.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/ViewModels/UserProfileViewModel.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/ViewModels/UserProfileViewModel.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Update Ryujinx.Ava/UI/Helpers/EmbeddedWindow.cs
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
* Fix redundancies
* Remove redunancies
* Add back elses
Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
---
Ryujinx.Ava/App.axaml | 2 +-
Ryujinx.Ava/App.axaml.cs | 5 +-
Ryujinx.Ava/AppHost.cs | 7 +-
Ryujinx.Ava/Common/ApplicationHelper.cs | 5 +-
Ryujinx.Ava/Common/Locale/LocaleManager.cs | 2 +-
Ryujinx.Ava/Helper/MetalHelper.cs | 2 +-
Ryujinx.Ava/Modules/Updater/Updater.cs | 5 +-
Ryujinx.Ava/Program.cs | 2 +-
Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs | 198 +++
.../UI/Applet/AvaloniaDynamicTextInputHandler.cs | 164 +++
Ryujinx.Ava/UI/Applet/AvaloniaHostUiTheme.cs | 43 +
Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml | 52 +
Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs | 80 +
Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml | 64 +
Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml.cs | 177 +++
Ryujinx.Ava/UI/Controls/GameGridView.axaml | 195 +++
Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs | 83 ++
Ryujinx.Ava/UI/Controls/GameListView.axaml | 234 +++
Ryujinx.Ava/UI/Controls/GameListView.axaml.cs | 83 ++
Ryujinx.Ava/UI/Controls/InputDialog.axaml | 32 +
Ryujinx.Ava/UI/Controls/InputDialog.axaml.cs | 57 +
Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml | 16 +
.../UI/Controls/NavigationDialogHost.axaml.cs | 91 ++
.../UI/Controls/ProfileImageSelectionDialog.axaml | 57 +
.../Controls/ProfileImageSelectionDialog.axaml.cs | 105 ++
Ryujinx.Ava/UI/Controls/RendererHost.axaml | 11 +
Ryujinx.Ava/UI/Controls/RendererHost.axaml.cs | 127 ++
Ryujinx.Ava/UI/Controls/SaveManager.axaml | 175 +++
Ryujinx.Ava/UI/Controls/SaveManager.axaml.cs | 160 ++
Ryujinx.Ava/UI/Controls/UpdateWaitWindow.axaml | 42 +
Ryujinx.Ava/UI/Controls/UpdateWaitWindow.axaml.cs | 20 +
Ryujinx.Ava/UI/Controls/UserEditor.axaml | 86 ++
Ryujinx.Ava/UI/Controls/UserEditor.axaml.cs | 118 ++
Ryujinx.Ava/UI/Controls/UserRecoverer.axaml | 72 +
Ryujinx.Ava/UI/Controls/UserRecoverer.axaml.cs | 44 +
Ryujinx.Ava/UI/Controls/UserSelector.axaml | 145 ++
Ryujinx.Ava/UI/Controls/UserSelector.axaml.cs | 77 +
.../UI/Helpers/ApplicationOpenedEventArgs.cs | 16 +
Ryujinx.Ava/UI/Helpers/AvaloniaGlxContext.cs | 16 +
Ryujinx.Ava/UI/Helpers/AvaloniaWglContext.cs | 16 +
.../UI/Helpers/BitmapArrayValueConverter.cs | 35 +
Ryujinx.Ava/UI/Helpers/ButtonKeyAssigner.cs | 118 ++
Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs | 400 +++++
Ryujinx.Ava/UI/Helpers/EmbeddedWindow.cs | 233 +++
Ryujinx.Ava/UI/Helpers/Glyph.cs | 9 +
Ryujinx.Ava/UI/Helpers/GlyphValueConverter.cs | 49 +
Ryujinx.Ava/UI/Helpers/HotKeyControl.cs | 52 +
Ryujinx.Ava/UI/Helpers/IGlContextExtension.cs | 25 +
Ryujinx.Ava/UI/Helpers/KeyValueConverter.cs | 46 +
Ryujinx.Ava/UI/Helpers/MiniCommand.cs | 71 +
Ryujinx.Ava/UI/Helpers/OffscreenTextBox.cs | 40 +
Ryujinx.Ava/UI/Helpers/OpenGLEmbeddedWindow.cs | 82 ++
.../UI/Helpers/OpenToolkitBindingsContext.cs | 20 +
Ryujinx.Ava/UI/Helpers/SPBOpenGLContext.cs | 47 +
Ryujinx.Ava/UI/Helpers/UserErrorDialog.cs | 91 ++
Ryujinx.Ava/UI/Helpers/UserResult.cs | 12 +
Ryujinx.Ava/UI/Helpers/VulkanEmbeddedWindow.cs | 52 +
Ryujinx.Ava/UI/Helpers/Win32NativeInterop.cs | 107 ++
Ryujinx.Ava/UI/Models/Amiibo.cs | 72 +
Ryujinx.Ava/UI/Models/CheatModel.cs | 40 +
Ryujinx.Ava/UI/Models/CheatsList.cs | 51 +
Ryujinx.Ava/UI/Models/ControllerModel.cs | 6 +
Ryujinx.Ava/UI/Models/DeviceType.cs | 9 +
Ryujinx.Ava/UI/Models/DownloadableContentModel.cs | 32 +
.../UI/Models/Generic/LastPlayedSortComparer.cs | 33 +
Ryujinx.Ava/UI/Models/InputConfiguration.cs | 456 ++++++
Ryujinx.Ava/UI/Models/PlayerModel.cs | 6 +
Ryujinx.Ava/UI/Models/ProfileImageModel.cs | 14 +
Ryujinx.Ava/UI/Models/SaveModel.cs | 123 ++
Ryujinx.Ava/UI/Models/StatusUpdatedEventArgs.cs | 28 +
Ryujinx.Ava/UI/Models/TempProfile.cs | 58 +
Ryujinx.Ava/UI/Models/TimeZone.cs | 16 +
Ryujinx.Ava/UI/Models/TitleUpdateModel.cs | 25 +
Ryujinx.Ava/UI/Models/UserProfile.cs | 69 +
Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs | 452 ++++++
.../UI/ViewModels/AvatarProfileViewModel.cs | 363 +++++
Ryujinx.Ava/UI/ViewModels/BaseModel.cs | 15 +
.../UI/ViewModels/ControllerSettingsViewModel.cs | 901 ++++++++++++
Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs | 1540 ++++++++++++++++++++
Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs | 516 +++++++
Ryujinx.Ava/UI/ViewModels/UserProfileViewModel.cs | 215 +++
Ryujinx.Ava/UI/Windows/AboutWindow.axaml | 282 ++++
Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs | 78 +
Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml | 74 +
Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml.cs | 59 +
Ryujinx.Ava/UI/Windows/AvatarWindow.axaml | 54 +
Ryujinx.Ava/UI/Windows/AvatarWindow.axaml.cs | 77 +
Ryujinx.Ava/UI/Windows/CheatWindow.axaml | 106 ++
Ryujinx.Ava/UI/Windows/CheatWindow.axaml.cs | 119 ++
.../UI/Windows/ContentDialogOverlayWindow.axaml | 29 +
.../UI/Windows/ContentDialogOverlayWindow.axaml.cs | 25 +
.../UI/Windows/ControllerSettingsWindow.axaml | 1169 +++++++++++++++
.../UI/Windows/ControllerSettingsWindow.axaml.cs | 181 +++
.../Windows/DownloadableContentManagerWindow.axaml | 172 +++
.../DownloadableContentManagerWindow.axaml.cs | 314 ++++
Ryujinx.Ava/UI/Windows/IconColorPicker.cs | 192 +++
Ryujinx.Ava/UI/Windows/MainWindow.axaml | 770 ++++++++++
Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs | 721 +++++++++
Ryujinx.Ava/UI/Windows/MotionSettingsWindow.axaml | 141 ++
.../UI/Windows/MotionSettingsWindow.axaml.cs | 71 +
Ryujinx.Ava/UI/Windows/RumbleSettingsWindow.axaml | 57 +
.../UI/Windows/RumbleSettingsWindow.axaml.cs | 57 +
Ryujinx.Ava/UI/Windows/SettingsWindow.axaml | 980 +++++++++++++
Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs | 213 +++
Ryujinx.Ava/UI/Windows/StyleableWindow.cs | 39 +
Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml | 115 ++
Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml.cs | 271 ++++
Ryujinx.Ava/Ui/Applet/AvaHostUiHandler.cs | 197 ---
.../Ui/Applet/AvaloniaDynamicTextInputHandler.cs | 163 ---
Ryujinx.Ava/Ui/Applet/AvaloniaHostUiTheme.cs | 43 -
Ryujinx.Ava/Ui/Applet/ErrorAppletWindow.axaml | 53 -
Ryujinx.Ava/Ui/Applet/ErrorAppletWindow.axaml.cs | 80 -
Ryujinx.Ava/Ui/Applet/SwkbdAppletDialog.axaml | 65 -
Ryujinx.Ava/Ui/Applet/SwkbdAppletDialog.axaml.cs | 176 ---
.../Ui/Controls/ApplicationOpenedEventArgs.cs | 16 -
Ryujinx.Ava/Ui/Controls/AvaloniaGlxContext.cs | 16 -
Ryujinx.Ava/Ui/Controls/AvaloniaWglContext.cs | 16 -
.../Ui/Controls/BitmapArrayValueConverter.cs | 35 -
Ryujinx.Ava/Ui/Controls/ButtonKeyAssigner.cs | 118 --
Ryujinx.Ava/Ui/Controls/ContentDialogHelper.cs | 401 -----
Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs | 233 ---
Ryujinx.Ava/Ui/Controls/GameGridView.axaml | 195 ---
Ryujinx.Ava/Ui/Controls/GameGridView.axaml.cs | 82 --
Ryujinx.Ava/Ui/Controls/GameListView.axaml | 235 ---
Ryujinx.Ava/Ui/Controls/GameListView.axaml.cs | 82 --
Ryujinx.Ava/Ui/Controls/Glyph.cs | 9 -
Ryujinx.Ava/Ui/Controls/GlyphValueConverter.cs | 49 -
Ryujinx.Ava/Ui/Controls/HotKeyControl.cs | 52 -
Ryujinx.Ava/Ui/Controls/IGlContextExtension.cs | 25 -
Ryujinx.Ava/Ui/Controls/InputDialog.axaml | 32 -
Ryujinx.Ava/Ui/Controls/InputDialog.axaml.cs | 56 -
Ryujinx.Ava/Ui/Controls/KeyValueConverter.cs | 46 -
Ryujinx.Ava/Ui/Controls/MiniCommand.cs | 71 -
Ryujinx.Ava/Ui/Controls/NavigationDialogHost.axaml | 11 -
.../Ui/Controls/NavigationDialogHost.axaml.cs | 91 --
Ryujinx.Ava/Ui/Controls/OffscreenTextBox.cs | 40 -
Ryujinx.Ava/Ui/Controls/OpenGLEmbeddedWindow.cs | 85 --
.../Ui/Controls/OpenToolkitBindingsContext.cs | 20 -
.../Ui/Controls/ProfileImageSelectionDialog.axaml | 32 -
.../Controls/ProfileImageSelectionDialog.axaml.cs | 105 --
Ryujinx.Ava/Ui/Controls/RendererHost.axaml | 8 -
Ryujinx.Ava/Ui/Controls/RendererHost.axaml.cs | 126 --
Ryujinx.Ava/Ui/Controls/SPBOpenGLContext.cs | 47 -
Ryujinx.Ava/Ui/Controls/SaveManager.axaml | 103 --
Ryujinx.Ava/Ui/Controls/SaveManager.axaml.cs | 160 --
Ryujinx.Ava/Ui/Controls/UpdateWaitWindow.axaml | 43 -
Ryujinx.Ava/Ui/Controls/UpdateWaitWindow.axaml.cs | 20 -
Ryujinx.Ava/Ui/Controls/UserEditor.axaml | 89 --
Ryujinx.Ava/Ui/Controls/UserEditor.axaml.cs | 117 --
Ryujinx.Ava/Ui/Controls/UserErrorDialog.cs | 91 --
Ryujinx.Ava/Ui/Controls/UserRecoverer.axaml | 71 -
Ryujinx.Ava/Ui/Controls/UserRecoverer.axaml.cs | 44 -
Ryujinx.Ava/Ui/Controls/UserResult.cs | 12 -
Ryujinx.Ava/Ui/Controls/UserSelector.axaml | 146 --
Ryujinx.Ava/Ui/Controls/UserSelector.axaml.cs | 77 -
Ryujinx.Ava/Ui/Controls/VulkanEmbeddedWindow.cs | 53 -
Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs | 107 --
Ryujinx.Ava/Ui/Models/Amiibo.cs | 72 -
Ryujinx.Ava/Ui/Models/CheatModel.cs | 40 -
Ryujinx.Ava/Ui/Models/CheatsList.cs | 51 -
Ryujinx.Ava/Ui/Models/ControllerModel.cs | 6 -
Ryujinx.Ava/Ui/Models/DeviceType.cs | 9 -
Ryujinx.Ava/Ui/Models/DownloadableContentModel.cs | 32 -
.../Ui/Models/Generic/LastPlayedSortComparer.cs | 33 -
Ryujinx.Ava/Ui/Models/InputConfiguration.cs | 456 ------
Ryujinx.Ava/Ui/Models/PlayerModel.cs | 6 -
Ryujinx.Ava/Ui/Models/ProfileImageModel.cs | 14 -
Ryujinx.Ava/Ui/Models/SaveModel.cs | 122 --
Ryujinx.Ava/Ui/Models/StatusUpdatedEventArgs.cs | 28 -
Ryujinx.Ava/Ui/Models/TempProfile.cs | 58 -
Ryujinx.Ava/Ui/Models/TimeZone.cs | 16 -
Ryujinx.Ava/Ui/Models/TitleUpdateModel.cs | 25 -
Ryujinx.Ava/Ui/Models/UserProfile.cs | 69 -
Ryujinx.Ava/Ui/ViewModels/AmiiboWindowViewModel.cs | 451 ------
.../Ui/ViewModels/AvatarProfileViewModel.cs | 363 -----
Ryujinx.Ava/Ui/ViewModels/BaseModel.cs | 15 -
.../Ui/ViewModels/ControllerSettingsViewModel.cs | 900 ------------
Ryujinx.Ava/Ui/ViewModels/MainWindowViewModel.cs | 1539 -------------------
Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs | 520 -------
Ryujinx.Ava/Ui/ViewModels/UserProfileViewModel.cs | 213 ---
Ryujinx.Ava/Ui/Windows/AboutWindow.axaml | 282 ----
Ryujinx.Ava/Ui/Windows/AboutWindow.axaml.cs | 78 -
Ryujinx.Ava/Ui/Windows/AmiiboWindow.axaml | 69 -
Ryujinx.Ava/Ui/Windows/AmiiboWindow.axaml.cs | 59 -
Ryujinx.Ava/Ui/Windows/AvatarWindow.axaml | 53 -
Ryujinx.Ava/Ui/Windows/AvatarWindow.axaml.cs | 77 -
Ryujinx.Ava/Ui/Windows/CheatWindow.axaml | 106 --
Ryujinx.Ava/Ui/Windows/CheatWindow.axaml.cs | 119 --
.../Ui/Windows/ContentDialogOverlayWindow.axaml | 28 -
.../Ui/Windows/ContentDialogOverlayWindow.axaml.cs | 25 -
.../Ui/Windows/ControllerSettingsWindow.axaml | 1169 ---------------
.../Ui/Windows/ControllerSettingsWindow.axaml.cs | 180 ---
.../Windows/DownloadableContentManagerWindow.axaml | 172 ---
.../DownloadableContentManagerWindow.axaml.cs | 313 ----
Ryujinx.Ava/Ui/Windows/IconColorPicker.cs | 192 ---
Ryujinx.Ava/Ui/Windows/MainWindow.axaml | 770 ----------
Ryujinx.Ava/Ui/Windows/MainWindow.axaml.cs | 720 ---------
Ryujinx.Ava/Ui/Windows/MotionSettingsWindow.axaml | 141 --
.../Ui/Windows/MotionSettingsWindow.axaml.cs | 71 -
Ryujinx.Ava/Ui/Windows/RumbleSettingsWindow.axaml | 58 -
.../Ui/Windows/RumbleSettingsWindow.axaml.cs | 57 -
Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml | 980 -------------
Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs | 212 ---
Ryujinx.Ava/Ui/Windows/StyleableWindow.cs | 39 -
Ryujinx.Ava/Ui/Windows/TitleUpdateWindow.axaml | 115 --
Ryujinx.Ava/Ui/Windows/TitleUpdateWindow.axaml.cs | 270 ----
206 files changed, 15768 insertions(+), 15650 deletions(-)
create mode 100644 Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs
create mode 100644 Ryujinx.Ava/UI/Applet/AvaloniaDynamicTextInputHandler.cs
create mode 100644 Ryujinx.Ava/UI/Applet/AvaloniaHostUiTheme.cs
create mode 100644 Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml
create mode 100644 Ryujinx.Ava/UI/Applet/SwkbdAppletDialog.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/GameGridView.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/GameListView.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/GameListView.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/InputDialog.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/InputDialog.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/ProfileImageSelectionDialog.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/ProfileImageSelectionDialog.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/RendererHost.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/RendererHost.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/SaveManager.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/SaveManager.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/UpdateWaitWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/UpdateWaitWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/UserEditor.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/UserEditor.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/UserRecoverer.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/UserRecoverer.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Controls/UserSelector.axaml
create mode 100644 Ryujinx.Ava/UI/Controls/UserSelector.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/ApplicationOpenedEventArgs.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/AvaloniaGlxContext.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/AvaloniaWglContext.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/BitmapArrayValueConverter.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/ButtonKeyAssigner.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/EmbeddedWindow.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/Glyph.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/GlyphValueConverter.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/HotKeyControl.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/IGlContextExtension.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/KeyValueConverter.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/MiniCommand.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/OffscreenTextBox.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/OpenGLEmbeddedWindow.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/OpenToolkitBindingsContext.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/SPBOpenGLContext.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/UserErrorDialog.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/UserResult.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/VulkanEmbeddedWindow.cs
create mode 100644 Ryujinx.Ava/UI/Helpers/Win32NativeInterop.cs
create mode 100644 Ryujinx.Ava/UI/Models/Amiibo.cs
create mode 100644 Ryujinx.Ava/UI/Models/CheatModel.cs
create mode 100644 Ryujinx.Ava/UI/Models/CheatsList.cs
create mode 100644 Ryujinx.Ava/UI/Models/ControllerModel.cs
create mode 100644 Ryujinx.Ava/UI/Models/DeviceType.cs
create mode 100644 Ryujinx.Ava/UI/Models/DownloadableContentModel.cs
create mode 100644 Ryujinx.Ava/UI/Models/Generic/LastPlayedSortComparer.cs
create mode 100644 Ryujinx.Ava/UI/Models/InputConfiguration.cs
create mode 100644 Ryujinx.Ava/UI/Models/PlayerModel.cs
create mode 100644 Ryujinx.Ava/UI/Models/ProfileImageModel.cs
create mode 100644 Ryujinx.Ava/UI/Models/SaveModel.cs
create mode 100644 Ryujinx.Ava/UI/Models/StatusUpdatedEventArgs.cs
create mode 100644 Ryujinx.Ava/UI/Models/TempProfile.cs
create mode 100644 Ryujinx.Ava/UI/Models/TimeZone.cs
create mode 100644 Ryujinx.Ava/UI/Models/TitleUpdateModel.cs
create mode 100644 Ryujinx.Ava/UI/Models/UserProfile.cs
create mode 100644 Ryujinx.Ava/UI/ViewModels/AmiiboWindowViewModel.cs
create mode 100644 Ryujinx.Ava/UI/ViewModels/AvatarProfileViewModel.cs
create mode 100644 Ryujinx.Ava/UI/ViewModels/BaseModel.cs
create mode 100644 Ryujinx.Ava/UI/ViewModels/ControllerSettingsViewModel.cs
create mode 100644 Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
create mode 100644 Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs
create mode 100644 Ryujinx.Ava/UI/ViewModels/UserProfileViewModel.cs
create mode 100644 Ryujinx.Ava/UI/Windows/AboutWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/AmiiboWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/AvatarWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/AvatarWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/CheatWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/CheatWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/ContentDialogOverlayWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/ControllerSettingsWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/ControllerSettingsWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/IconColorPicker.cs
create mode 100644 Ryujinx.Ava/UI/Windows/MainWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/MotionSettingsWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/MotionSettingsWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/RumbleSettingsWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/RumbleSettingsWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/SettingsWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/SettingsWindow.axaml.cs
create mode 100644 Ryujinx.Ava/UI/Windows/StyleableWindow.cs
create mode 100644 Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml
create mode 100644 Ryujinx.Ava/UI/Windows/TitleUpdateWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Applet/AvaHostUiHandler.cs
delete mode 100644 Ryujinx.Ava/Ui/Applet/AvaloniaDynamicTextInputHandler.cs
delete mode 100644 Ryujinx.Ava/Ui/Applet/AvaloniaHostUiTheme.cs
delete mode 100644 Ryujinx.Ava/Ui/Applet/ErrorAppletWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Applet/ErrorAppletWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Applet/SwkbdAppletDialog.axaml
delete mode 100644 Ryujinx.Ava/Ui/Applet/SwkbdAppletDialog.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/ApplicationOpenedEventArgs.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/AvaloniaGlxContext.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/AvaloniaWglContext.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/BitmapArrayValueConverter.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/ButtonKeyAssigner.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/ContentDialogHelper.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/GameGridView.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/GameGridView.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/GameListView.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/GameListView.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/Glyph.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/GlyphValueConverter.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/HotKeyControl.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/IGlContextExtension.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/InputDialog.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/InputDialog.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/KeyValueConverter.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/MiniCommand.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/NavigationDialogHost.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/NavigationDialogHost.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/OffscreenTextBox.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/OpenGLEmbeddedWindow.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/OpenToolkitBindingsContext.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/ProfileImageSelectionDialog.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/ProfileImageSelectionDialog.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/RendererHost.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/RendererHost.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/SPBOpenGLContext.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/SaveManager.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/SaveManager.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/UpdateWaitWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/UpdateWaitWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserEditor.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserEditor.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserErrorDialog.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserRecoverer.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserRecoverer.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserResult.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserSelector.axaml
delete mode 100644 Ryujinx.Ava/Ui/Controls/UserSelector.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/VulkanEmbeddedWindow.cs
delete mode 100644 Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/Amiibo.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/CheatModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/CheatsList.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/ControllerModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/DeviceType.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/DownloadableContentModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/Generic/LastPlayedSortComparer.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/InputConfiguration.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/PlayerModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/ProfileImageModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/SaveModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/StatusUpdatedEventArgs.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/TempProfile.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/TimeZone.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/TitleUpdateModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Models/UserProfile.cs
delete mode 100644 Ryujinx.Ava/Ui/ViewModels/AmiiboWindowViewModel.cs
delete mode 100644 Ryujinx.Ava/Ui/ViewModels/AvatarProfileViewModel.cs
delete mode 100644 Ryujinx.Ava/Ui/ViewModels/BaseModel.cs
delete mode 100644 Ryujinx.Ava/Ui/ViewModels/ControllerSettingsViewModel.cs
delete mode 100644 Ryujinx.Ava/Ui/ViewModels/MainWindowViewModel.cs
delete mode 100644 Ryujinx.Ava/Ui/ViewModels/SettingsViewModel.cs
delete mode 100644 Ryujinx.Ava/Ui/ViewModels/UserProfileViewModel.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/AboutWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/AboutWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/AmiiboWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/AmiiboWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/AvatarWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/AvatarWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/CheatWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/CheatWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/ContentDialogOverlayWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/ContentDialogOverlayWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/ControllerSettingsWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/ControllerSettingsWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/DownloadableContentManagerWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/DownloadableContentManagerWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/IconColorPicker.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/MainWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/MainWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/MotionSettingsWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/MotionSettingsWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/RumbleSettingsWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/RumbleSettingsWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/SettingsWindow.axaml.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/StyleableWindow.cs
delete mode 100644 Ryujinx.Ava/Ui/Windows/TitleUpdateWindow.axaml
delete mode 100644 Ryujinx.Ava/Ui/Windows/TitleUpdateWindow.axaml.cs
diff --git a/Ryujinx.Ava/App.axaml b/Ryujinx.Ava/App.axaml
index eb9ffd86..72bc0dee 100644
--- a/Ryujinx.Ava/App.axaml
+++ b/Ryujinx.Ava/App.axaml
@@ -4,6 +4,6 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sty="using:FluentAvalonia.Styling">
-
+
\ No newline at end of file
diff --git a/Ryujinx.Ava/App.axaml.cs b/Ryujinx.Ava/App.axaml.cs
index 3c28c019..e59f9bd3 100644
--- a/Ryujinx.Ava/App.axaml.cs
+++ b/Ryujinx.Ava/App.axaml.cs
@@ -5,8 +5,9 @@ using Avalonia.Styling;
using Avalonia.Threading;
using FluentAvalonia.Styling;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.Ui.Controls;
-using Ryujinx.Ava.Ui.Windows;
+using Ryujinx.Ava.UI.Controls;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.Ui.Common.Configuration;
diff --git a/Ryujinx.Ava/AppHost.cs b/Ryujinx.Ava/AppHost.cs
index c1b3355a..f8bd032c 100644
--- a/Ryujinx.Ava/AppHost.cs
+++ b/Ryujinx.Ava/AppHost.cs
@@ -11,9 +11,10 @@ using Ryujinx.Audio.Integration;
using Ryujinx.Ava.Common;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Input;
-using Ryujinx.Ava.Ui.Controls;
-using Ryujinx.Ava.Ui.Models;
-using Ryujinx.Ava.Ui.Windows;
+using Ryujinx.Ava.UI.Controls;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Ava.UI.Models;
+using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
diff --git a/Ryujinx.Ava/Common/ApplicationHelper.cs b/Ryujinx.Ava/Common/ApplicationHelper.cs
index 7f766614..0c562dfe 100644
--- a/Ryujinx.Ava/Common/ApplicationHelper.cs
+++ b/Ryujinx.Ava/Common/ApplicationHelper.cs
@@ -12,8 +12,9 @@ using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.Ui.Controls;
-using Ryujinx.Ava.Ui.Windows;
+using Ryujinx.Ava.UI.Controls;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS;
diff --git a/Ryujinx.Ava/Common/Locale/LocaleManager.cs b/Ryujinx.Ava/Common/Locale/LocaleManager.cs
index 41b98136..acbbf2df 100644
--- a/Ryujinx.Ava/Common/Locale/LocaleManager.cs
+++ b/Ryujinx.Ava/Common/Locale/LocaleManager.cs
@@ -1,4 +1,4 @@
-using Ryujinx.Ava.Ui.ViewModels;
+using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Common;
using Ryujinx.Common.Utilities;
using Ryujinx.Ui.Common.Configuration;
diff --git a/Ryujinx.Ava/Helper/MetalHelper.cs b/Ryujinx.Ava/Helper/MetalHelper.cs
index 2d4d828b..ea3477eb 100644
--- a/Ryujinx.Ava/Helper/MetalHelper.cs
+++ b/Ryujinx.Ava/Helper/MetalHelper.cs
@@ -3,7 +3,7 @@ using System.Runtime.Versioning;
using System.Runtime.InteropServices;
using Avalonia;
-namespace Ryujinx.Ava.Ui.Helper
+namespace Ryujinx.Ava.UI.Helper
{
public delegate void UpdateBoundsCallbackDelegate(Rect rect);
diff --git a/Ryujinx.Ava/Modules/Updater/Updater.cs b/Ryujinx.Ava/Modules/Updater/Updater.cs
index b3a1ef30..d495131f 100644
--- a/Ryujinx.Ava/Modules/Updater/Updater.cs
+++ b/Ryujinx.Ava/Modules/Updater/Updater.cs
@@ -7,8 +7,9 @@ using ICSharpCode.SharpZipLib.Zip;
using Newtonsoft.Json.Linq;
using Ryujinx.Ava;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.Ui.Controls;
-using Ryujinx.Ava.Ui.Windows;
+using Ryujinx.Ava.UI.Controls;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.Ui.Common.Helper;
diff --git a/Ryujinx.Ava/Program.cs b/Ryujinx.Ava/Program.cs
index 023e31df..142d7820 100644
--- a/Ryujinx.Ava/Program.cs
+++ b/Ryujinx.Ava/Program.cs
@@ -1,7 +1,7 @@
using ARMeilleure.Translation.PTC;
using Avalonia;
using Avalonia.Threading;
-using Ryujinx.Ava.Ui.Windows;
+using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.GraphicsDriver;
diff --git a/Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs b/Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs
new file mode 100644
index 00000000..a8e76275
--- /dev/null
+++ b/Ryujinx.Ava/UI/Applet/AvaHostUiHandler.cs
@@ -0,0 +1,198 @@
+using Avalonia.Controls;
+using Avalonia.Threading;
+using FluentAvalonia.UI.Controls;
+using Ryujinx.Ava.Common.Locale;
+using Ryujinx.Ava.UI.Controls;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Ava.UI.Windows;
+using Ryujinx.HLE;
+using Ryujinx.HLE.HOS.Applets;
+using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types;
+using Ryujinx.HLE.Ui;
+using System;
+using System.Threading;
+
+namespace Ryujinx.Ava.UI.Applet
+{
+ internal class AvaHostUiHandler : IHostUiHandler
+ {
+ private readonly MainWindow _parent;
+
+ public IHostUiTheme HostUiTheme { get; }
+
+ public AvaHostUiHandler(MainWindow parent)
+ {
+ _parent = parent;
+
+ HostUiTheme = new AvaloniaHostUiTheme(parent);
+ }
+
+ public bool DisplayMessageDialog(ControllerAppletUiArgs args)
+ {
+ string playerCount = args.PlayerCountMin == args.PlayerCountMax
+ ? args.PlayerCountMin.ToString()
+ : $"{args.PlayerCountMin}-{args.PlayerCountMax}";
+
+ string key = args.PlayerCountMin == args.PlayerCountMax ? "DialogControllerAppletMessage" : "DialogControllerAppletMessagePlayerRange";
+
+ string message = string.Format(LocaleManager.Instance[key],
+ playerCount,
+ args.SupportedStyles,
+ string.Join(", ", args.SupportedPlayers),
+ args.IsDocked ? LocaleManager.Instance["DialogControllerAppletDockModeSet"] : "");
+
+ return DisplayMessageDialog(LocaleManager.Instance["DialogControllerAppletTitle"], message);
+ }
+
+ public bool DisplayMessageDialog(string title, string message)
+ {
+ ManualResetEvent dialogCloseEvent = new(false);
+
+ bool okPressed = false;
+
+ Dispatcher.UIThread.InvokeAsync(async () =>
+ {
+ try
+ {
+ ManualResetEvent deferEvent = new(false);
+
+ bool opened = false;
+
+ UserResult response = await ContentDialogHelper.ShowDeferredContentDialog(_parent,
+ title,
+ message,
+ "",
+ LocaleManager.Instance["DialogOpenSettingsWindowLabel"],
+ "",
+ LocaleManager.Instance["SettingsButtonClose"],
+ (int)Symbol.Important,
+ deferEvent,
+ async (window) =>
+ {
+ if (opened)
+ {
+ return;
+ }
+
+ opened = true;
+
+ _parent.SettingsWindow = new SettingsWindow(_parent.VirtualFileSystem, _parent.ContentManager);
+
+ await _parent.SettingsWindow.ShowDialog(window);
+
+ opened = false;
+ });
+
+ if (response == UserResult.Ok)
+ {
+ okPressed = true;
+ }
+
+ dialogCloseEvent.Set();
+ }
+ catch (Exception ex)
+ {
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogMessageDialogErrorExceptionMessage"], ex));
+
+ dialogCloseEvent.Set();
+ }
+ });
+
+ dialogCloseEvent.WaitOne();
+
+ return okPressed;
+ }
+
+ public bool DisplayInputDialog(SoftwareKeyboardUiArgs args, out string userText)
+ {
+ ManualResetEvent dialogCloseEvent = new(false);
+
+ bool okPressed = false;
+ bool error = false;
+ string inputText = args.InitialText ?? "";
+
+ Dispatcher.UIThread.Post(async () =>
+ {
+ try
+ {
+ var response = await SwkbdAppletDialog.ShowInputDialog(_parent, LocaleManager.Instance["SoftwareKeyboard"], args);
+
+ if (response.Result == UserResult.Ok)
+ {
+ inputText = response.Input;
+ okPressed = true;
+ }
+ }
+ catch (Exception ex)
+ {
+ error = true;
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogSoftwareKeyboardErrorExceptionMessage"], ex));
+ }
+ finally
+ {
+ dialogCloseEvent.Set();
+ }
+ });
+
+ dialogCloseEvent.WaitOne();
+
+ userText = error ? null : inputText;
+
+ return error || okPressed;
+ }
+
+ public void ExecuteProgram(Switch device, ProgramSpecifyKind kind, ulong value)
+ {
+ device.Configuration.UserChannelPersistence.ExecuteProgram(kind, value);
+ if (_parent.AppHost != null)
+ {
+ _parent.AppHost.Stop();
+ }
+ }
+
+ public bool DisplayErrorAppletDialog(string title, string message, string[] buttons)
+ {
+ ManualResetEvent dialogCloseEvent = new(false);
+
+ bool showDetails = false;
+
+ Dispatcher.UIThread.Post(async () =>
+ {
+ try
+ {
+ ErrorAppletWindow msgDialog = new(_parent, buttons, message)
+ {
+ Title = title,
+ WindowStartupLocation = WindowStartupLocation.CenterScreen,
+ Width = 400
+ };
+
+ object response = await msgDialog.Run();
+
+ if (response != null && buttons != null && buttons.Length > 1 && (int)response != buttons.Length - 1)
+ {
+ showDetails = true;
+ }
+
+ dialogCloseEvent.Set();
+
+ msgDialog.Close();
+ }
+ catch (Exception ex)
+ {
+ dialogCloseEvent.Set();
+ await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance["DialogErrorAppletErrorExceptionMessage"], ex));
+ }
+ });
+
+ dialogCloseEvent.WaitOne();
+
+ return showDetails;
+ }
+
+ public IDynamicTextInputHandler CreateDynamicTextInputHandler()
+ {
+ return new AvaloniaDynamicTextInputHandler(_parent);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Applet/AvaloniaDynamicTextInputHandler.cs b/Ryujinx.Ava/UI/Applet/AvaloniaDynamicTextInputHandler.cs
new file mode 100644
index 00000000..314746e7
--- /dev/null
+++ b/Ryujinx.Ava/UI/Applet/AvaloniaDynamicTextInputHandler.cs
@@ -0,0 +1,164 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.Threading;
+using Ryujinx.Ava.Input;
+using Ryujinx.Ava.UI.Controls;
+using Ryujinx.Ava.UI.Helpers;
+using Ryujinx.Ava.UI.Windows;
+using Ryujinx.HLE.Ui;
+using System;
+using System.Threading;
+
+using HidKey = Ryujinx.Common.Configuration.Hid.Key;
+
+namespace Ryujinx.Ava.UI.Applet
+{
+ class AvaloniaDynamicTextInputHandler : IDynamicTextInputHandler
+ {
+ private MainWindow _parent;
+ private OffscreenTextBox _hiddenTextBox;
+ private bool _canProcessInput;
+ private IDisposable _textChangedSubscription;
+ private IDisposable _selectionStartChangedSubscription;
+ private IDisposable _selectionEndtextChangedSubscription;
+
+ public AvaloniaDynamicTextInputHandler(MainWindow parent)
+ {
+ _parent = parent;
+
+ (_parent.InputManager.KeyboardDriver as AvaloniaKeyboardDriver).KeyPressed += AvaloniaDynamicTextInputHandler_KeyPressed;
+ (_parent.InputManager.KeyboardDriver as AvaloniaKeyboardDriver).KeyRelease += AvaloniaDynamicTextInputHandler_KeyRelease;
+ (_parent.InputManager.KeyboardDriver as AvaloniaKeyboardDriver).TextInput += AvaloniaDynamicTextInputHandler_TextInput;
+
+ _hiddenTextBox = _parent.HiddenTextBox;
+
+ Dispatcher.UIThread.Post(() =>
+ {
+ _textChangedSubscription = _hiddenTextBox.GetObservable(TextBox.TextProperty).Subscribe(TextChanged);
+ _selectionStartChangedSubscription = _hiddenTextBox.GetObservable(TextBox.SelectionStartProperty).Subscribe(SelectionChanged);
+ _selectionEndtextChangedSubscription = _hiddenTextBox.GetObservable(TextBox.SelectionEndProperty).Subscribe(SelectionChanged);
+ });
+ }
+
+ private void TextChanged(string text)
+ {
+ TextChangedEvent?.Invoke(text ?? string.Empty, _hiddenTextBox.SelectionStart, _hiddenTextBox.SelectionEnd, true);
+ }
+
+ private void SelectionChanged(int selection)
+ {
+ if (_hiddenTextBox.SelectionEnd < _hiddenTextBox.SelectionStart)
+ {
+ _hiddenTextBox.SelectionStart = _hiddenTextBox.SelectionEnd;
+ }
+
+ TextChangedEvent?.Invoke(_hiddenTextBox.Text ?? string.Empty, _hiddenTextBox.SelectionStart, _hiddenTextBox.SelectionEnd, true);
+ }
+
+ private void AvaloniaDynamicTextInputHandler_TextInput(object sender, string text)
+ {
+ Dispatcher.UIThread.InvokeAsync(() =>
+ {
+ if (_canProcessInput)
+ {
+ _hiddenTextBox.SendText(text);
+ }
+ });
+ }
+
+ private void AvaloniaDynamicTextInputHandler_KeyRelease(object sender, KeyEventArgs e)
+ {
+ var key = (HidKey)AvaloniaKeyboardMappingHelper.ToInputKey(e.Key);
+
+ if (!(KeyReleasedEvent?.Invoke(key)).GetValueOrDefault(true))
+ {
+ return;
+ }
+
+ e.RoutedEvent = _hiddenTextBox.GetKeyUpRoutedEvent();
+
+ Dispatcher.UIThread.InvokeAsync(() =>
+ {
+ if (_canProcessInput)
+ {
+ _hiddenTextBox.SendKeyUpEvent(e);
+ }
+ });
+ }
+
+ private void AvaloniaDynamicTextInputHandler_KeyPressed(object sender, KeyEventArgs e)
+ {
+ var key = (HidKey)AvaloniaKeyboardMappingHelper.ToInputKey(e.Key);
+
+ if (!(KeyPressedEvent?.Invoke(key)).GetValueOrDefault(true))
+ {
+ return;
+ }
+
+ e.RoutedEvent = _hiddenTextBox.GetKeyUpRoutedEvent();
+
+ Dispatcher.UIThread.InvokeAsync(() =>
+ {
+ if (_canProcessInput)
+ {
+ _hiddenTextBox.SendKeyDownEvent(e);
+ }
+ });
+ }
+
+ public bool TextProcessingEnabled
+ {
+ get
+ {
+ return Volatile.Read(ref _canProcessInput);
+ }
+ set
+ {
+ Volatile.Write(ref _canProcessInput, value);
+ }
+ }
+
+ public event DynamicTextChangedHandler TextChangedEvent;
+ public event KeyPressedHandler KeyPressedEvent;
+ public event KeyReleasedHandler KeyReleasedEvent;
+
+ public void Dispose()
+ {
+ (_parent.InputManager.KeyboardDriver as AvaloniaKeyboardDriver).KeyPressed -= AvaloniaDynamicTextInputHandler_KeyPressed;
+ (_parent.InputManager.KeyboardDriver as AvaloniaKeyboardDriver).KeyRelease -= AvaloniaDynamicTextInputHandler_KeyRelease;
+ (_parent.InputManager.KeyboardDriver as AvaloniaKeyboardDriver).TextInput -= AvaloniaDynamicTextInputHandler_TextInput;
+
+ _textChangedSubscription?.Dispose();
+ _selectionStartChangedSubscription?.Dispose();
+ _selectionEndtextChangedSubscription?.Dispose();
+
+ Dispatcher.UIThread.Post(() =>
+ {
+ _hiddenTextBox.Clear();
+ _parent.RendererControl.Focus();
+
+ _parent = null;
+ });
+ }
+
+ public void SetText(string text, int cursorBegin)
+ {
+ Dispatcher.UIThread.Post(() =>
+ {
+ _hiddenTextBox.Text = text;
+ _hiddenTextBox.CaretIndex = cursorBegin;
+ });
+ }
+
+ public void SetText(string text, int cursorBegin, int cursorEnd)
+ {
+ Dispatcher.UIThread.Post(() =>
+ {
+ _hiddenTextBox.Text = text;
+ _hiddenTextBox.SelectionStart = cursorBegin;
+ _hiddenTextBox.SelectionEnd = cursorEnd;
+ });
+ }
+ }
+}
diff --git a/Ryujinx.Ava/UI/Applet/AvaloniaHostUiTheme.cs b/Ryujinx.Ava/UI/Applet/AvaloniaHostUiTheme.cs
new file mode 100644
index 00000000..fe5e2721
--- /dev/null
+++ b/Ryujinx.Ava/UI/Applet/AvaloniaHostUiTheme.cs
@@ -0,0 +1,43 @@
+using Avalonia.Media;
+using Ryujinx.Ava.UI.Windows;
+using Ryujinx.HLE.Ui;
+using System;
+
+namespace Ryujinx.Ava.UI.Applet
+{
+ class AvaloniaHostUiTheme : IHostUiTheme
+ {
+ public AvaloniaHostUiTheme(MainWindow parent)
+ {
+ FontFamily = OperatingSystem.IsWindows() && OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000, 0) ? "Segoe UI Variable" : parent.FontFamily.Name;
+ DefaultBackgroundColor = BrushToThemeColor(parent.Background);
+ DefaultForegroundColor = BrushToThemeColor(parent.Foreground);
+ DefaultBorderColor = BrushToThemeColor(parent.BorderBrush);
+ SelectionBackgroundColor = BrushToThemeColor(parent.SearchBox.SelectionBrush);
+ SelectionForegroundColor = BrushToThemeColor(parent.SearchBox.SelectionForegroundBrush);
+ }
+
+ public string FontFamily { get; }
+
+ public ThemeColor DefaultBackgroundColor { get; }
+ public ThemeColor DefaultForegroundColor { get; }
+ public ThemeColor DefaultBorderColor { get; }
+ public ThemeColor SelectionBackgroundColor { get; }
+ public ThemeColor SelectionForegroundColor { get; }
+
+ private ThemeColor BrushToThemeColor(IBrush brush)
+ {
+ if (brush is SolidColorBrush solidColor)
+ {
+ return new ThemeColor((float)solidColor.Color.A / 255,
+ (float)solidColor.Color.R / 255,
+ (float)solidColor.Color.G / 255,
+ (float)solidColor.Color.B / 255);
+ }
+ else
+ {
+ return new ThemeColor();
+ }
+ }
+ }
+}
diff --git a/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml b/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml
new file mode 100644
index 00000000..211b4725
--- /dev/null
+++ b/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs b/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs
new file mode 100644
index 00000000..a17826f8
--- /dev/null
+++ b/Ryujinx.Ava/UI/Applet/ErrorAppletWindow.axaml.cs
@@ -0,0 +1,80 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Interactivity;
+using Avalonia.Threading;
+using Ryujinx.Ava.Common.Locale;
+using Ryujinx.Ava.UI.Windows;
+using System.Threading.Tasks;
+
+namespace Ryujinx.Ava.UI.Applet
+{
+ internal partial class ErrorAppletWindow : StyleableWindow
+ {
+ private readonly Window _owner;
+ private object _buttonResponse;
+
+ public ErrorAppletWindow(Window owner, string[] buttons, string message)
+ {
+ _owner = owner;
+ Message = message;
+ DataContext = this;
+ InitializeComponent();
+#if DEBUG
+ this.AttachDevTools();
+#endif
+ int responseId = 0;
+
+ if (buttons != null)
+ {
+ foreach (string buttonText in buttons)
+ {
+ AddButton(buttonText, responseId);
+ responseId++;
+ }
+ }
+ else
+ {
+ AddButton(LocaleManager.Instance["InputDialogOk"], 0);
+ }
+ }
+
+ public ErrorAppletWindow()
+ {
+ DataContext = this;
+ InitializeComponent();
+#if DEBUG
+ this.AttachDevTools();
+#endif
+ }
+
+ public string Message { get; set; }
+
+ private void AddButton(string label, object tag)
+ {
+ Dispatcher.UIThread.InvokeAsync(() =>
+ {
+ Button button = new() { Content = label, Tag = tag };
+
+ button.Click += Button_Click;
+ ButtonStack.Children.Add(button);
+ });
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (sender is Button button)
+ {
+ _buttonResponse = button.Tag;
+ }
+
+ Close();
+ }
+
+ public async Task