diff --git a/src/Ryujinx.Common/Configuration/DirtyHack.cs b/src/Ryujinx.Common/Configuration/DirtyHack.cs index 3959c0a99..71ac88f56 100644 --- a/src/Ryujinx.Common/Configuration/DirtyHack.cs +++ b/src/Ryujinx.Common/Configuration/DirtyHack.cs @@ -9,7 +9,8 @@ namespace Ryujinx.Common.Configuration public enum DirtyHack : byte { Xc2MenuSoftlockFix = 1, - ShaderTranslationDelay = 2 + // ShaderTranslationDelay = 2 + NifmServiceDisableIsAnyInternetRequestAccepted = 3 } public readonly struct EnabledDirtyHack(DirtyHack hack, int value) diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs index 82be1572f..76a8a7126 100644 --- a/src/Ryujinx.Common/TitleIDs.cs +++ b/src/Ryujinx.Common/TitleIDs.cs @@ -1,7 +1,4 @@ using Gommon; -using Ryujinx.Common.Configuration; -using Ryujinx.Common.Helper; -using System; using System.Linq; namespace Ryujinx.Common diff --git a/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs b/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs index 96e71cd07..d669caba1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs @@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm // CreateGeneralServiceOld() -> object public ResultCode CreateGeneralServiceOld(ServiceCtx context) { - MakeObject(context, new IGeneralService()); + MakeObject(context, new IGeneralService(context)); return ResultCode.Success; } @@ -22,7 +22,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm // CreateGeneralService(u64, pid) -> object public ResultCode CreateGeneralService(ServiceCtx context) { - MakeObject(context, new IGeneralService()); + MakeObject(context, new IGeneralService(context)); return ResultCode.Success; } diff --git a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs index a5a822db3..dd4efce6e 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs @@ -1,4 +1,5 @@ using Ryujinx.Common; +using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService; @@ -17,12 +18,12 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService private UnicastIPAddressInformation _targetAddressInfoCache = null; private string _cacheChosenInterface = null; - public IGeneralService() + public IGeneralService(ServiceCtx context) { _generalServiceDetail = new GeneralServiceDetail { ClientId = GeneralServiceManager.Count, - IsAnyInternetRequestAccepted = true, // NOTE: Why not accept any internet request? + IsAnyInternetRequestAccepted = !context.Device.DirtyHacks.IsEnabled(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted), // NOTE: Why not accept any internet request? }; NetworkChange.NetworkAddressChanged += LocalInterfaceCacheHandler; diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs index b442cf802..660803714 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs @@ -1,6 +1,5 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy; -using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml index eb40e853c..112815fb5 100644 --- a/src/Ryujinx/Assets/Styles/Styles.xaml +++ b/src/Ryujinx/Assets/Styles/Styles.xaml @@ -440,7 +440,7 @@ 13 26 28 - 900 + 700 756 diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index d69c3ee9b..28e0af060 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -3823,28 +3823,53 @@ } }, { - "ID": "SettingsTabGeneralShowTitleBar", + "ID": "SettingsTabGeneralShowOldUI", "Translations": { "ar_SA": "", "de_DE": "", "el_GR": "", - "en_US": "Show Title Bar (Requires restart)", - "es_ES": "Mostrar Barra de Título (Requiere reinicio)", - "fr_FR": "Afficher Barre de Titre (Nécessite redémarrage)", + "en_US": "Show Original UI Style (Requires restart)", + "es_ES": "", + "fr_FR": "", "he_IL": "", - "it_IT": "Mostra barra del titolo (Richiede il riavvio)", + "it_IT": "", "ja_JP": "", - "ko_KR": "제목 표시줄 표시(다시 시작해야 함)", - "no_NO": "Vis tittellinje (krever omstart)", + "ko_KR": "", + "no_NO": "Vis original UI-stil (krever omstart)", "pl_PL": "", - "pt_BR": "Mostrar Barra de Título (Requer reinicialização)", - "ru_RU": "Показать строку заголовка (требуется перезапуск)", - "sv_SE": "Visa titelrad (kräver omstart)", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", "th_TH": "", "tr_TR": "", - "uk_UA": "Показувати рядок заголовка (Потрібен перезапуск)", - "zh_CN": "显示标题栏 (需要重启)", - "zh_TW": "顯示「標題列」 (需要重新開啟Ryujinx)" + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "SettingsTabGeneralShowOldUIToolTip", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Show the older Avalonia Ryujinx UI reminiscent of Ryujinx 1.1.1403. This is enabled by default on platforms that are not Windows.\nThe classic-style title bar is back and major window layout reworkings are reversed; such as the settings navigation placement above this tooltip.", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" } }, { @@ -23822,6 +23847,31 @@ "zh_TW": "上次更新時間: {0}" } }, + { + "ID": "CompatibilityListTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Compatibility List - {0} entries", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "CompatibilityListWarning", "Translations": { @@ -23872,6 +23922,31 @@ "zh_TW": "搜尋相容性列表紀錄..." } }, + { + "ID": "CompatibilityListSearchBoxWatermarkWithCount", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Search {0} compatibility entries...", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Søk i {0} kompatibilitetsoppføringer...", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "CompatibilityListOpen", "Translations": { diff --git a/src/Ryujinx/Common/ApplicationHelper.cs b/src/Ryujinx/Common/ApplicationHelper.cs index 86e5ee310..0b81e8cff 100644 --- a/src/Ryujinx/Common/ApplicationHelper.cs +++ b/src/Ryujinx/Common/ApplicationHelper.cs @@ -16,7 +16,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem; @@ -216,11 +216,7 @@ namespace Ryujinx.Ava.Common return; } - IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks - ? IntegrityCheckLevel.ErrorOnInvalid - : IntegrityCheckLevel.None; - - (Nca updatePatchNca, _) = mainNca.GetUpdateData(_virtualFileSystem, checkLevel, programIndex, out _); + (Nca updatePatchNca, _) = mainNca.GetUpdateData(_virtualFileSystem, ConfigurationState.Instance.System.IntegrityCheckLevel, programIndex, out _); if (updatePatchNca is not null) { patchNca = updatePatchNca; diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index f60cff49b..d116fe709 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -1,6 +1,7 @@ using Gommon; +using Ryujinx.Ava.Systems; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.Common.Utilities; using System; @@ -25,7 +26,21 @@ namespace Ryujinx.Ava.Common.Locale public LocaleManager() { _localeStrings = new Dictionary(); - _dynamicValues = new ConcurrentDictionary(); + _dynamicValues = new ConcurrentDictionary(new Dictionary + { + { LocaleKeys.DialogConfirmationTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogUpdaterTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogErrorTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogWarningTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogExitTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.DialogStopEmulationTitle, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxInfo, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxConfirm, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxUpdater, [RyujinxApp.FullAppName] }, + { LocaleKeys.RyujinxRebooter, [RyujinxApp.FullAppName] }, + { LocaleKeys.CompatibilityListSearchBoxWatermarkWithCount, [CompatibilityDatabase.Entries.Length] }, + { LocaleKeys.CompatibilityListTitle, [CompatibilityDatabase.Entries.Length] } + }); Load(); } @@ -44,17 +59,6 @@ namespace Ryujinx.Ava.Common.Locale ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); } - - SetDynamicValues(LocaleKeys.DialogConfirmationTitle, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.DialogUpdaterTitle, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.DialogErrorTitle, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.DialogWarningTitle, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.DialogExitTitle, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.DialogStopEmulationTitle, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.RyujinxInfo, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.RyujinxConfirm, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.RyujinxUpdater, RyujinxApp.FullAppName); - SetDynamicValues(LocaleKeys.RyujinxRebooter, RyujinxApp.FullAppName); } public string this[LocaleKeys key] diff --git a/src/Ryujinx/Common/Markup/MarkupExtensions.cs b/src/Ryujinx/Common/Markup/MarkupExtensions.cs index 9e8ff00ef..2c8290847 100644 --- a/src/Ryujinx/Common/Markup/MarkupExtensions.cs +++ b/src/Ryujinx/Common/Markup/MarkupExtensions.cs @@ -24,4 +24,17 @@ namespace Ryujinx.Ava.Common.Markup protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) => bindingExtension.Source = LocaleManager.Instance; } + + internal class WindowTitleExtension(LocaleKeys key, bool includeVersion) : BasicMarkupExtension + { + public WindowTitleExtension(LocaleKeys key) : this(key, true) + { + } + + public override string Name => "WindowTitleTranslation"; + protected override string Value => RyujinxApp.FormatTitle(key, includeVersion); + + protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) + => bindingExtension.Source = LocaleManager.Instance; + } } diff --git a/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs index da59a5d52..cddc5de22 100644 --- a/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs +++ b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs @@ -1,4 +1,4 @@ -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; diff --git a/src/Ryujinx/Common/XCITrimmerLog.cs b/src/Ryujinx/Common/XCITrimmerLog.cs index b661d918d..751831a66 100644 --- a/src/Ryujinx/Common/XCITrimmerLog.cs +++ b/src/Ryujinx/Common/XCITrimmerLog.cs @@ -26,9 +26,9 @@ namespace Ryujinx.Ava.Common internal class TrimmerWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog { - private readonly XCITrimmerViewModel _viewModel; + private readonly XciTrimmerViewModel _viewModel; - public TrimmerWindow(XCITrimmerViewModel viewModel) + public TrimmerWindow(XciTrimmerViewModel viewModel) { _viewModel = viewModel; } diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs index d6a2ed789..751a86571 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs @@ -2,7 +2,8 @@ using DiscordRPC; using LibHac.Tools.FsSystem; using Ryujinx.Audio.Backends.SDL2; using Ryujinx.Ava; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; @@ -11,7 +12,6 @@ using Ryujinx.Common.Configuration.Hid.Keyboard; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.Graphics.GAL; -using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.OpenGL; using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE; diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs index 9a69c56dd..f346f1f63 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -1,7 +1,7 @@ using CommandLine; using Gommon; using Ryujinx.Ava; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; diff --git a/src/Ryujinx/Headless/Options.cs b/src/Ryujinx/Headless/Options.cs index 6658ba3ad..8305cd311 100644 --- a/src/Ryujinx/Headless/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -1,6 +1,7 @@ using CommandLine; using Gommon; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.HLE; @@ -37,7 +38,7 @@ namespace Ryujinx.Headless EnableInternetAccess = configurationState.System.EnableInternetAccess; if (NeedsOverride(nameof(DisableFsIntegrityChecks))) - DisableFsIntegrityChecks = configurationState.System.EnableFsIntegrityChecks; + DisableFsIntegrityChecks = !configurationState.System.EnableFsIntegrityChecks; if (NeedsOverride(nameof(FsGlobalAccessLogMode))) FsGlobalAccessLogMode = configurationState.System.FsGlobalAccessLogMode; @@ -58,10 +59,10 @@ namespace Ryujinx.Headless DisableDockedMode = !configurationState.System.EnableDockedMode; if (NeedsOverride(nameof(SystemLanguage))) - SystemLanguage = (SystemLanguage)(int)configurationState.System.Language.Value; + SystemLanguage = configurationState.System.Language.Value.ToHLE(); if (NeedsOverride(nameof(SystemRegion))) - SystemRegion = (RegionCode)(int)configurationState.System.Region.Value; + SystemRegion = configurationState.System.Region.Value.ToHLE(); if (NeedsOverride(nameof(SystemTimeZone))) SystemTimeZone = configurationState.System.TimeZone; diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index edd46a7db..016cc348a 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -5,10 +5,12 @@ using Gommon; using Projektanker.Icons.Avalonia; using Projektanker.Icons.Avalonia.FontAwesome; using Projektanker.Icons.Avalonia.MaterialDesign; +using Ryujinx.Ava.Systems; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; using Ryujinx.Ava.Utilities.SystemInfo; using Ryujinx.Common; using Ryujinx.Common.Configuration; @@ -282,16 +284,16 @@ namespace Ryujinx.Ava // Check if region was overridden. if (CommandLineState.OverrideSystemRegion is not null) - if (Enum.TryParse(CommandLineState.OverrideSystemRegion, true, out Ryujinx.HLE.HOS.SystemState.RegionCode result)) + if (Enum.TryParse(CommandLineState.OverrideSystemRegion, true, out HLE.HOS.SystemState.RegionCode result)) { - ConfigurationState.Instance.System.Region.Value = (Utilities.Configuration.System.Region)result; + ConfigurationState.Instance.System.Region.Value = result.ToUI(); } //Check if language was overridden. if (CommandLineState.OverrideSystemLanguage is not null) - if (Enum.TryParse(CommandLineState.OverrideSystemLanguage, true, out Ryujinx.HLE.HOS.SystemState.SystemLanguage result)) + if (Enum.TryParse(CommandLineState.OverrideSystemLanguage, true, out HLE.HOS.SystemState.SystemLanguage result)) { - ConfigurationState.Instance.System.Language.Value = (Utilities.Configuration.System.Language)result; + ConfigurationState.Instance.System.Language.Value = result.ToUI(); } // Check if hardware-acceleration was overridden. diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 698b392ee..1f9642466 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -91,10 +91,12 @@ Always THIRDPARTY.md + False Always LICENSE.txt + False diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/Systems/AppHost.cs similarity index 99% rename from src/Ryujinx/AppHost.cs rename to src/Ryujinx/Systems/AppHost.cs index 40c54b6f7..455afaf45 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/Systems/AppHost.cs @@ -6,7 +6,6 @@ using Avalonia.Threading; using DiscordRPC; using LibHac.Common; using LibHac.Ns; -using LibHac.Tools.FsSystem; using Ryujinx.Audio.Backends.Dummy; using Ryujinx.Audio.Backends.OpenAL; using Ryujinx.Audio.Backends.SDL2; @@ -21,8 +20,8 @@ using Ryujinx.Ava.UI.Renderer; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; @@ -35,11 +34,9 @@ using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.OpenGL; using Ryujinx.Graphics.Vulkan; -using Ryujinx.HLE; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Services.Account.Acc; -using Ryujinx.HLE.HOS.SystemState; using Ryujinx.Input; using Ryujinx.Input.HLE; using SkiaSharp; @@ -62,7 +59,7 @@ using Size = Avalonia.Size; using Switch = Ryujinx.HLE.Switch; using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; -namespace Ryujinx.Ava +namespace Ryujinx.Ava.Systems { internal class AppHost { @@ -470,7 +467,7 @@ namespace Ryujinx.Ava Dispatcher.UIThread.InvokeAsync(() => { - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI); }); _viewModel.SetUiProgressHandlers(Device); @@ -872,7 +869,7 @@ namespace Ryujinx.Ava Device?.System.TogglePauseEmulation(false); _viewModel.IsPaused = false; - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI); Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed"); } @@ -881,7 +878,7 @@ namespace Ryujinx.Ava Device?.System.TogglePauseEmulation(true); _viewModel.IsPaused = true; - _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar, LocaleManager.Instance[LocaleKeys.Paused]); + _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI, LocaleManager.Instance[LocaleKeys.Paused]); Logger.Info?.Print(LogClass.Emulation, "Emulation was paused"); } diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationCountUpdatedEventArgs.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs similarity index 81% rename from src/Ryujinx/Utilities/AppLibrary/ApplicationCountUpdatedEventArgs.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs index 9bbaef0e3..7866ffa3a 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationCountUpdatedEventArgs.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationCountUpdatedEventArgs : EventArgs { diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs similarity index 97% rename from src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationData.cs index 16e7dec06..0819b86b8 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs @@ -9,8 +9,8 @@ using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.Utilities.Compat; -using Ryujinx.Ava.Utilities.PlayReport; +using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Systems.PlayReport; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.Loaders.Processes.Extensions; @@ -18,7 +18,7 @@ using System; using System.IO; using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationData { @@ -36,7 +36,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary { _id = value; - Compatibility = CompatibilityCsv.Find(value); + Compatibility = CompatibilityDatabase.Find(value); RichPresenceSpec = PlayReports.Analyzer.TryGetSpec(IdString, out GameSpec gameSpec) ? gameSpec : default(Optional); diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationJsonSerializerContext.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs similarity index 85% rename from src/Ryujinx/Utilities/AppLibrary/ApplicationJsonSerializerContext.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs index d443ab66e..3fd24a6ba 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationJsonSerializerContext.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(ApplicationMetadata))] diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs similarity index 99% rename from src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs index c85053723..b7321d6c1 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs @@ -12,8 +12,9 @@ using LibHac.Tools.Fs; using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem.NcaUtils; using Ryujinx.Ava.Common.Models; -using Ryujinx.Ava.Utilities.Configuration; -using Ryujinx.Ava.Utilities.Configuration.System; +using Ryujinx.Ava.Utilities; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; @@ -38,7 +39,7 @@ using MissingKeyException = LibHac.Common.Keys.MissingKeyException; using Path = System.IO.Path; using TimeSpan = System.TimeSpan; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationLibrary { @@ -617,15 +618,11 @@ namespace Ryujinx.Ava.Utilities.AppLibrary case ".xci": case ".nsp": { - IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks - ? IntegrityCheckLevel.ErrorOnInvalid - : IntegrityCheckLevel.None; - using IFileSystem pfs = PartitionFileSystemUtils.OpenApplicationFileSystem(filePath, _virtualFileSystem); Dictionary updates = - pfs.GetContentData(ContentMetaType.Patch, _virtualFileSystem, checkLevel); + pfs.GetContentData(ContentMetaType.Patch, _virtualFileSystem, ConfigurationState.Instance.System.IntegrityCheckLevel); if (updates.Count == 0) { diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationMetadata.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs similarity index 97% rename from src/Ryujinx/Utilities/AppLibrary/ApplicationMetadata.cs rename to src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs index d823c7482..9d8488aeb 100644 --- a/src/Ryujinx/Utilities/AppLibrary/ApplicationMetadata.cs +++ b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs @@ -1,7 +1,7 @@ using System; using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { public class ApplicationMetadata { diff --git a/src/Ryujinx/Utilities/AppLibrary/LdnGameData.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs similarity index 97% rename from src/Ryujinx/Utilities/AppLibrary/LdnGameData.cs rename to src/Ryujinx/Systems/AppLibrary/LdnGameData.cs index 252c0ecdc..6750983d6 100644 --- a/src/Ryujinx/Utilities/AppLibrary/LdnGameData.cs +++ b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { public struct LdnGameData { diff --git a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataReceivedEventArgs.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs similarity index 82% rename from src/Ryujinx/Utilities/AppLibrary/LdnGameDataReceivedEventArgs.cs rename to src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs index 0eaa6ecb3..21d24ff2d 100644 --- a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataReceivedEventArgs.cs +++ b/src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs @@ -1,7 +1,6 @@ using System; -using System.Collections.Generic; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { public class LdnGameDataReceivedEventArgs : EventArgs { diff --git a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataSerializerContext.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs similarity index 83% rename from src/Ryujinx/Utilities/AppLibrary/LdnGameDataSerializerContext.cs rename to src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs index 90d1894c7..ff7718ed5 100644 --- a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataSerializerContext.cs +++ b/src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.AppLibrary +namespace Ryujinx.Ava.Systems.AppLibrary { [JsonSerializable(typeof(IEnumerable))] internal partial class LdnGameDataSerializerContext : JsonSerializerContext; diff --git a/src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs b/src/Ryujinx/Systems/CompatibilityDatabase.cs similarity index 82% rename from src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs rename to src/Ryujinx/Systems/CompatibilityDatabase.cs index b58c05299..bfc7ba903 100644 --- a/src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs +++ b/src/Ryujinx/Systems/CompatibilityDatabase.cs @@ -9,26 +9,11 @@ using System.Linq; using System.Reflection; using System.Text; -namespace Ryujinx.Ava.Utilities.Compat +namespace Ryujinx.Ava.Systems { - public struct ColumnIndices(Func, int> getIndex) + public class CompatibilityDatabase { - public const string TitleIdCol = "\"title_id\""; - public const string GameNameCol = "\"game_name\""; - public const string LabelsCol = "\"labels\""; - public const string StatusCol = "\"status\""; - public const string LastUpdatedCol = "\"last_updated\""; - - public readonly int TitleId = getIndex(TitleIdCol); - public readonly int GameName = getIndex(GameNameCol); - public readonly int Labels = getIndex(LabelsCol); - public readonly int Status = getIndex(StatusCol); - public readonly int LastUpdated = getIndex(LastUpdatedCol); - } - - public class CompatibilityCsv - { - static CompatibilityCsv() => Load(); + static CompatibilityDatabase() => Load(); public static void Load() { @@ -65,16 +50,6 @@ namespace Ryujinx.Ava.Utilities.Compat public static CompatibilityEntry Find(ulong titleId) => Find(titleId.ToString("X16")); - - public static LocaleKeys? GetStatus(string titleId) - => Find(titleId)?.Status; - - public static LocaleKeys? GetStatus(ulong titleId) => GetStatus(titleId.ToString("X16")); - - public static string GetLabels(string titleId) - => Find(titleId)?.FormattedIssueLabels; - - public static string GetLabels(ulong titleId) => GetLabels(titleId.ToString("X16")); } public class CompatibilityEntry @@ -135,6 +110,7 @@ namespace Ryujinx.Ava.Utilities.Compat public string FormattedIssueLabels => Labels .Select(FormatLabelName) + .Where(x => x != null) .JoinToString(", "); public override string ToString() => @@ -158,7 +134,6 @@ namespace Ryujinx.Ava.Utilities.Compat "gui" => "GUI", "help wanted" => "Help Wanted", "horizon" => "Horizon", - "infra" => "Project Infra", "invalid" => "Invalid", "kernel" => "Kernel", "ldn" => "LDN", @@ -172,9 +147,9 @@ namespace Ryujinx.Ava.Utilities.Compat "ldn-untested" => "LDN Untested", "ldn-broken" => "LDN Broken", "ldn-partial" => "Partial LDN", - "nvdec" => "NVDEC", - "services" => "NX Services", - "services-horizon" => "Horizon OS Services", + "nvdec" => "GPU Video Decoding", + "services" => "HLE Services", + "services-horizon" => "New HLE Services", "slow" => "Runs Slow", "crash" => "Crashes", "deadlock" => "Deadlock", @@ -182,7 +157,7 @@ namespace Ryujinx.Ava.Utilities.Compat "opengl" => "OpenGL", "opengl-backend-bug" => "OpenGL Backend Bug", "vulkan-backend-bug" => "Vulkan Backend Bug", - "mac-bug" => "Mac-specific Bug(s)", + "mac-bug" => "Mac-specific Problems", "amd-vendor-bug" => "AMD GPU Bug", "intel-vendor-bug" => "Intel GPU Bug", "loader-allocator" => "Loader Allocator", @@ -191,18 +166,22 @@ namespace Ryujinx.Ava.Utilities.Compat "UE4" => "Unreal Engine 4", "homebrew" => "Homebrew Content", "online-broken" => "Online Broken", - _ => Capitalize(labelName) + _ => null }; + } + + public struct ColumnIndices(Func, int> getIndex) + { + private const string TitleIdCol = "\"title_id\""; + private const string GameNameCol = "\"game_name\""; + private const string LabelsCol = "\"labels\""; + private const string StatusCol = "\"status\""; + private const string LastUpdatedCol = "\"last_updated\""; - public static string Capitalize(string value) - { - if (value == string.Empty) - return string.Empty; - - char firstChar = value[0]; - string rest = value[1..]; - - return $"{char.ToUpper(firstChar)}{rest}"; - } + public readonly int TitleId = getIndex(TitleIdCol); + public readonly int GameName = getIndex(GameNameCol); + public readonly int Labels = getIndex(LabelsCol); + public readonly int Status = getIndex(StatusCol); + public readonly int LastUpdated = getIndex(LastUpdatedCol); } } diff --git a/src/Ryujinx/Utilities/Configuration/AudioBackend.cs b/src/Ryujinx/Systems/Configuration/AudioBackend.cs similarity index 84% rename from src/Ryujinx/Utilities/Configuration/AudioBackend.cs rename to src/Ryujinx/Systems/Configuration/AudioBackend.cs index 8394bb282..a0aa30f38 100644 --- a/src/Ryujinx/Utilities/Configuration/AudioBackend.cs +++ b/src/Ryujinx/Systems/Configuration/AudioBackend.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { [JsonConverter(typeof(TypedStringEnumConverter))] public enum AudioBackend diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs similarity index 98% rename from src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs index 814a48e53..c5315ab12 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs @@ -1,5 +1,5 @@ -using Ryujinx.Ava.Utilities.Configuration.System; -using Ryujinx.Ava.Utilities.Configuration.UI; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Multiplayer; @@ -8,14 +8,14 @@ using Ryujinx.Common.Utilities; using Ryujinx.HLE; using System.Collections.Generic; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public class ConfigurationFileFormat { /// /// The current version of the file format /// - public const int CurrentVersion = 67; + public const int CurrentVersion = 68; /// /// Version of the configuration file format diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs similarity index 83% rename from src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs index 175d4dee8..1d0350dd3 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs @@ -1,6 +1,6 @@ using Ryujinx.Common.Utilities; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { internal static class ConfigurationFileFormatSettings { diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs b/src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs similarity index 84% rename from src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs index a81e00f4a..8574b3a93 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(ConfigurationFileFormat))] diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs similarity index 97% rename from src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs index 8a0ddb560..b10cc3926 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs @@ -1,7 +1,7 @@ using Avalonia.Media; using Gommon; -using Ryujinx.Ava.Utilities.Configuration.System; -using Ryujinx.Ava.Utilities.Configuration.UI; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Controller; @@ -14,7 +14,7 @@ using System.Collections.Generic; using System.Linq; using RyuLogger = Ryujinx.Common.Logging.Logger; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public partial class ConfigurationState { @@ -46,12 +46,11 @@ namespace Ryujinx.Ava.Utilities.Configuration EnableDiscordIntegration.Value = cff.EnableDiscordIntegration; - CheckUpdatesOnStart.Value = shouldLoadFromFile ? cff.CheckUpdatesOnStart : CheckUpdatesOnStart.Value; // Get from global config only UpdateCheckerType.Value = shouldLoadFromFile ? cff.UpdateCheckerType : UpdateCheckerType.Value; // Get from global config only FocusLostActionType.Value = cff.FocusLostActionType; ShowConfirmExit.Value = shouldLoadFromFile ? cff.ShowConfirmExit : ShowConfirmExit.Value; // Get from global config only RememberWindowState.Value = shouldLoadFromFile ? cff.RememberWindowState : RememberWindowState.Value; // Get from global config only - ShowTitleBar.Value = shouldLoadFromFile ? cff.ShowTitleBar : ShowTitleBar.Value; // Get from global config only + ShowOldUI.Value = shouldLoadFromFile ? cff.ShowTitleBar : ShowOldUI.Value; // Get from global config only EnableHardwareAcceleration.Value = shouldLoadFromFile ? cff.EnableHardwareAcceleration : EnableHardwareAcceleration.Value; // Get from global config only HideCursor.Value = cff.HideCursor; @@ -161,9 +160,7 @@ namespace Ryujinx.Ava.Utilities.Configuration DirtyHacks hacks = new (cff.DirtyHacks ?? []); Hacks.Xc2MenuSoftlockFix.Value = hacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix); - - Hacks.EnableShaderTranslationDelay.Value = hacks.IsEnabled(DirtyHack.ShaderTranslationDelay); - Hacks.ShaderTranslationDelay.Value = hacks[DirtyHack.ShaderTranslationDelay].CoerceAtLeast(0); + } if (configurationFileUpdated) @@ -442,6 +439,8 @@ namespace Ryujinx.Ava.Utilities.Configuration (65, static cff => cff.UpdateCheckerType = cff.CheckUpdatesOnStart ? UpdaterType.PromptAtStartup : UpdaterType.Off), (66, static cff => cff.DisableInputWhenOutOfFocus = false), (67, static cff => cff.FocusLostActionType = cff.DisableInputWhenOutOfFocus ? FocusLostType.BlockInput : FocusLostType.DoNothing) + // 68 was the version that added per-game configs; the file structure did not change + // the version was increased so external tools could know that your Ryujinx version has per-game config capabilities. ); } } diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs similarity index 96% rename from src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs index 2ebf5725b..b52c624e3 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs @@ -1,8 +1,8 @@ using ARMeilleure; using Gommon; using LibHac.Tools.FsSystem; -using Ryujinx.Ava.Utilities.Configuration.System; -using Ryujinx.Ava.Utilities.Configuration.UI; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; @@ -11,12 +11,11 @@ using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; using Ryujinx.HLE; -using Ryujinx.HLE.HOS.SystemState; using System.Collections.Generic; using System.Linq; using RyuLogger = Ryujinx.Common.Logging.Logger; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public partial class ConfigurationState { @@ -352,6 +351,10 @@ namespace Ryujinx.Ava.Utilities.Configuration /// public ReactiveObject EnableFsIntegrityChecks { get; private set; } + public IntegrityCheckLevel IntegrityCheckLevel => EnableFsIntegrityChecks + ? IntegrityCheckLevel.ErrorOnInvalid + : IntegrityCheckLevel.None; + /// /// Enables FS access log output to the console. Possible modes are 0-3 /// @@ -680,18 +683,15 @@ namespace Ryujinx.Ava.Utilities.Configuration public ReactiveObject Xc2MenuSoftlockFix { get; private set; } - public ReactiveObject EnableShaderTranslationDelay { get; private set; } - - public ReactiveObject ShaderTranslationDelay { get; private set; } + public ReactiveObject DisableNifmIsAnyInternetRequestAccepted { get; private set; } public HacksSection() { ShowDirtyHacks = new ReactiveObject(); Xc2MenuSoftlockFix = new ReactiveObject(); Xc2MenuSoftlockFix.Event += HackChanged; - EnableShaderTranslationDelay = new ReactiveObject(); - EnableShaderTranslationDelay.Event += HackChanged; - ShaderTranslationDelay = new ReactiveObject(); + DisableNifmIsAnyInternetRequestAccepted = new ReactiveObject(); + DisableNifmIsAnyInternetRequestAccepted.Event += HackChanged; } private void HackChanged(object sender, ReactiveEventArgs rxe) @@ -722,8 +722,8 @@ namespace Ryujinx.Ava.Utilities.Configuration if (Xc2MenuSoftlockFix) Apply(DirtyHack.Xc2MenuSoftlockFix); - if (EnableShaderTranslationDelay) - Apply(DirtyHack.ShaderTranslationDelay, ShaderTranslationDelay); + if (DisableNifmIsAnyInternetRequestAccepted) + Apply(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted); return enabledHacks.ToArray(); @@ -779,11 +779,6 @@ namespace Ryujinx.Ava.Utilities.Configuration /// Enables or disables Discord Rich Presence /// public ReactiveObject EnableDiscordIntegration { get; private set; } - - /// - /// Checks for updates when Ryujinx starts when enabled - /// - public ReactiveObject CheckUpdatesOnStart { get; private set; } /// /// Checks for updates when Ryujinx starts when enabled, either prompting when an update is found or just showing a notification. @@ -806,9 +801,9 @@ namespace Ryujinx.Ava.Utilities.Configuration public ReactiveObject RememberWindowState { get; private set; } /// - /// Enables or disables the redesigned title bar + /// Disable the new title bar layout & window layout changes. /// - public ReactiveObject ShowTitleBar { get; private set; } + public ReactiveObject ShowOldUI { get; private set; } /// /// Enables hardware-accelerated rendering for Avalonia @@ -829,22 +824,21 @@ namespace Ryujinx.Ava.Utilities.Configuration Hid = new HidSection(); Multiplayer = new MultiplayerSection(); Hacks = new HacksSection(); - EnableDiscordIntegration = new ReactiveObject(); - CheckUpdatesOnStart = new ReactiveObject(); UpdateCheckerType = new ReactiveObject(); FocusLostActionType = new ReactiveObject(); + HideCursor = new ReactiveObject(); + EnableDiscordIntegration = new ReactiveObject(); ShowConfirmExit = new ReactiveObject(); RememberWindowState = new ReactiveObject(); - ShowTitleBar = new ReactiveObject(); + ShowOldUI = new ReactiveObject(); EnableHardwareAcceleration = new ReactiveObject(); - HideCursor = new ReactiveObject(); } public HleConfiguration CreateHleConfiguration() => new( System.DramSize, - (SystemLanguage)System.Language.Value, - (RegionCode)System.Region.Value, + System.Language.Value.ToHLE(), + System.Region.Value.ToHLE(), Graphics.VSyncMode, System.EnableDockedMode, System.EnablePtc, diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs similarity index 98% rename from src/Ryujinx/Utilities/Configuration/ConfigurationState.cs rename to src/Ryujinx/Systems/Configuration/ConfigurationState.cs index 5fb313cad..6fe35c744 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs @@ -1,5 +1,5 @@ -using Ryujinx.Ava.Utilities.Configuration.System; -using Ryujinx.Ava.Utilities.Configuration.UI; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Hid.Keyboard; @@ -9,7 +9,7 @@ using Ryujinx.HLE; using System; using System.Linq; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public partial class ConfigurationState { @@ -56,12 +56,11 @@ namespace Ryujinx.Ava.Utilities.Configuration MatchSystemTime = System.MatchSystemTime, DockedMode = System.EnableDockedMode, EnableDiscordIntegration = EnableDiscordIntegration, - CheckUpdatesOnStart = CheckUpdatesOnStart, UpdateCheckerType = UpdateCheckerType, FocusLostActionType = FocusLostActionType, ShowConfirmExit = ShowConfirmExit, RememberWindowState = RememberWindowState, - ShowTitleBar = ShowTitleBar, + ShowTitleBar = ShowOldUI, EnableHardwareAcceleration = EnableHardwareAcceleration, HideCursor = HideCursor, VSyncMode = Graphics.VSyncMode, @@ -183,7 +182,7 @@ namespace Ryujinx.Ava.Utilities.Configuration FocusLostActionType.Value = FocusLostType.DoNothing; ShowConfirmExit.Value = true; RememberWindowState.Value = true; - ShowTitleBar.Value = !OperatingSystem.IsWindows(); + ShowOldUI.Value = !OperatingSystem.IsWindows(); EnableHardwareAcceleration.Value = true; HideCursor.Value = HideCursorMode.OnIdle; Graphics.VSyncMode.Value = VSyncMode.Switch; diff --git a/src/Ryujinx/Utilities/Configuration/FileTypes.cs b/src/Ryujinx/Systems/Configuration/FileTypes.cs similarity index 90% rename from src/Ryujinx/Utilities/Configuration/FileTypes.cs rename to src/Ryujinx/Systems/Configuration/FileTypes.cs index c4550b5a6..70517683b 100644 --- a/src/Ryujinx/Utilities/Configuration/FileTypes.cs +++ b/src/Ryujinx/Systems/Configuration/FileTypes.cs @@ -1,8 +1,8 @@ using System; -using static Ryujinx.Ava.Utilities.Configuration.ConfigurationState.UISection; +using static Ryujinx.Ava.Systems.Configuration.ConfigurationState.UISection; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public enum FileTypes { diff --git a/src/Ryujinx/Utilities/Configuration/LoggerModule.cs b/src/Ryujinx/Systems/Configuration/LoggerModule.cs similarity index 98% rename from src/Ryujinx/Utilities/Configuration/LoggerModule.cs rename to src/Ryujinx/Systems/Configuration/LoggerModule.cs index f6c1be082..941556c43 100644 --- a/src/Ryujinx/Utilities/Configuration/LoggerModule.cs +++ b/src/Ryujinx/Systems/Configuration/LoggerModule.cs @@ -4,7 +4,7 @@ using Ryujinx.Common.Logging.Targets; using System; using System.IO; -namespace Ryujinx.Ava.Utilities.Configuration +namespace Ryujinx.Ava.Systems.Configuration { public static class LoggerModule { diff --git a/src/Ryujinx/Utilities/Configuration/System/Language.cs b/src/Ryujinx/Systems/Configuration/System/Language.cs similarity index 58% rename from src/Ryujinx/Utilities/Configuration/System/Language.cs rename to src/Ryujinx/Systems/Configuration/System/Language.cs index 81a9bd192..ff1476b73 100644 --- a/src/Ryujinx/Utilities/Configuration/System/Language.cs +++ b/src/Ryujinx/Systems/Configuration/System/Language.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.Configuration.System +namespace Ryujinx.Ava.Systems.Configuration.System { [JsonConverter(typeof(TypedStringEnumConverter))] public enum Language @@ -25,4 +25,13 @@ namespace Ryujinx.Ava.Utilities.Configuration.System TraditionalChinese, BrazilianPortuguese, } + + public static class LanguageEnumHelper + { + public static Language ToUI(this HLE.HOS.SystemState.SystemLanguage hleLanguage) + => (Language)hleLanguage; + + public static HLE.HOS.SystemState.SystemLanguage ToHLE(this Language uiLanguage) + => (HLE.HOS.SystemState.SystemLanguage)uiLanguage; + } } diff --git a/src/Ryujinx/Systems/Configuration/System/Region.cs b/src/Ryujinx/Systems/Configuration/System/Region.cs new file mode 100644 index 000000000..0089f073c --- /dev/null +++ b/src/Ryujinx/Systems/Configuration/System/Region.cs @@ -0,0 +1,26 @@ +using Ryujinx.Common.Utilities; +using System.Text.Json.Serialization; + +namespace Ryujinx.Ava.Systems.Configuration.System +{ + [JsonConverter(typeof(TypedStringEnumConverter))] + public enum Region + { + Japan, + USA, + Europe, + Australia, + China, + Korea, + Taiwan, + } + + public static class RegionEnumHelper + { + public static Region ToUI(this HLE.HOS.SystemState.RegionCode hleRegion) + => (Region)hleRegion; + + public static HLE.HOS.SystemState.RegionCode ToHLE(this Region uiRegion) + => (HLE.HOS.SystemState.RegionCode)uiRegion; + } +} diff --git a/src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs b/src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs similarity index 73% rename from src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs rename to src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs index e74ca0ec5..e5f54c799 100644 --- a/src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs +++ b/src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Ava.Utilities.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct ColumnSort { diff --git a/src/Ryujinx/Utilities/Configuration/UI/FocusLostType.cs b/src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs similarity index 86% rename from src/Ryujinx/Utilities/Configuration/UI/FocusLostType.cs rename to src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs index eea588539..2d0341022 100644 --- a/src/Ryujinx/Utilities/Configuration/UI/FocusLostType.cs +++ b/src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { [JsonConverter(typeof(TypedStringEnumConverter))] public enum FocusLostType diff --git a/src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs b/src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs similarity index 91% rename from src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs rename to src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs index 0ab9885fe..a0021be96 100644 --- a/src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs +++ b/src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Ava.Utilities.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct GuiColumns { diff --git a/src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs b/src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs similarity index 85% rename from src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs rename to src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs index 9541b4885..bc32bd153 100644 --- a/src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs +++ b/src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Ava.Utilities.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct ShownFileTypes { diff --git a/src/Ryujinx/Utilities/Configuration/UI/UpdaterType.cs b/src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs similarity index 83% rename from src/Ryujinx/Utilities/Configuration/UI/UpdaterType.cs rename to src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs index 2ab17a497..06cf35d10 100644 --- a/src/Ryujinx/Utilities/Configuration/UI/UpdaterType.cs +++ b/src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Utilities; using System.Text.Json.Serialization; -namespace Ryujinx.Ava.Utilities.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { [JsonConverter(typeof(TypedStringEnumConverter))] public enum UpdaterType diff --git a/src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs b/src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs similarity index 85% rename from src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs rename to src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs index 6c5e36879..be93ef4b6 100644 --- a/src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs +++ b/src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Ava.Utilities.Configuration.UI +namespace Ryujinx.Ava.Systems.Configuration.UI { public struct WindowStartup { diff --git a/src/Ryujinx/DiscordIntegrationModule.cs b/src/Ryujinx/Systems/DiscordIntegrationModule.cs similarity index 96% rename from src/Ryujinx/DiscordIntegrationModule.cs rename to src/Ryujinx/Systems/DiscordIntegrationModule.cs index 8d232b4fb..8a3b42ac8 100644 --- a/src/Ryujinx/DiscordIntegrationModule.cs +++ b/src/Ryujinx/Systems/DiscordIntegrationModule.cs @@ -1,18 +1,17 @@ using DiscordRPC; using Gommon; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.Configuration; -using Ryujinx.Ava.Utilities.PlayReport; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.PlayReport; using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.HLE; using Ryujinx.HLE.Loaders.Processes; using Ryujinx.Horizon; -using Ryujinx.Horizon.Prepo.Types; using System.Text; -namespace Ryujinx.Ava +namespace Ryujinx.Ava.Systems { public static class DiscordIntegrationModule { @@ -124,7 +123,7 @@ namespace Ryujinx.Ava _currentApp = null; } - private static void HandlePlayReport(PlayReport playReport) + private static void HandlePlayReport(Horizon.Prepo.Types.PlayReport playReport) { if (_discordClient is null) return; if (!TitleIDs.CurrentApplication.Value.HasValue) return; diff --git a/src/Ryujinx/Utilities/PlayReport/Analyzer.cs b/src/Ryujinx/Systems/PlayReport/Analyzer.cs similarity index 98% rename from src/Ryujinx/Utilities/PlayReport/Analyzer.cs rename to src/Ryujinx/Systems/PlayReport/Analyzer.cs index 8faf4fb31..d4198cdcf 100644 --- a/src/Ryujinx/Utilities/PlayReport/Analyzer.cs +++ b/src/Ryujinx/Systems/PlayReport/Analyzer.cs @@ -1,5 +1,5 @@ using Gommon; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Logging; using System; using System.Collections.Generic; @@ -7,7 +7,7 @@ using System.Collections.ObjectModel; using System.Globalization; using System.Linq; -namespace Ryujinx.Ava.Utilities.PlayReport +namespace Ryujinx.Ava.Systems.PlayReport { /// /// The entrypoint for the Play Report analysis system. diff --git a/src/Ryujinx/Utilities/PlayReport/Delegates.cs b/src/Ryujinx/Systems/PlayReport/Delegates.cs similarity index 97% rename from src/Ryujinx/Utilities/PlayReport/Delegates.cs rename to src/Ryujinx/Systems/PlayReport/Delegates.cs index 92569d32e..b3496ec4d 100644 --- a/src/Ryujinx/Utilities/PlayReport/Delegates.cs +++ b/src/Ryujinx/Systems/PlayReport/Delegates.cs @@ -1,4 +1,4 @@ -namespace Ryujinx.Ava.Utilities.PlayReport +namespace Ryujinx.Ava.Systems.PlayReport { /// /// The delegate type that powers single value formatters.
diff --git a/src/Ryujinx/Utilities/PlayReport/MatchedValues.cs b/src/Ryujinx/Systems/PlayReport/MatchedValues.cs similarity index 96% rename from src/Ryujinx/Utilities/PlayReport/MatchedValues.cs rename to src/Ryujinx/Systems/PlayReport/MatchedValues.cs index 46cae678a..025130758 100644 --- a/src/Ryujinx/Utilities/PlayReport/MatchedValues.cs +++ b/src/Ryujinx/Systems/PlayReport/MatchedValues.cs @@ -1,8 +1,8 @@ using MsgPack; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System.Collections.Generic; -namespace Ryujinx.Ava.Utilities.PlayReport +namespace Ryujinx.Ava.Systems.PlayReport { public abstract class MatchedValue { diff --git a/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs b/src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs similarity index 99% rename from src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs rename to src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs index b5215c693..5c5fb40f4 100644 --- a/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs +++ b/src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs @@ -5,7 +5,7 @@ using System.Buffers.Binary; using System.Collections.Generic; using System.Linq; -namespace Ryujinx.Ava.Utilities.PlayReport +namespace Ryujinx.Ava.Systems.PlayReport { public partial class PlayReports { diff --git a/src/Ryujinx/Utilities/PlayReport/PlayReports.cs b/src/Ryujinx/Systems/PlayReport/PlayReports.cs similarity index 99% rename from src/Ryujinx/Utilities/PlayReport/PlayReports.cs rename to src/Ryujinx/Systems/PlayReport/PlayReports.cs index c46ae2be5..e42ca185c 100644 --- a/src/Ryujinx/Utilities/PlayReport/PlayReports.cs +++ b/src/Ryujinx/Systems/PlayReport/PlayReports.cs @@ -1,6 +1,6 @@ using System; -namespace Ryujinx.Ava.Utilities.PlayReport +namespace Ryujinx.Ava.Systems.PlayReport { public static partial class PlayReports { diff --git a/src/Ryujinx/Utilities/PlayReport/Specs.cs b/src/Ryujinx/Systems/PlayReport/Specs.cs similarity index 97% rename from src/Ryujinx/Utilities/PlayReport/Specs.cs rename to src/Ryujinx/Systems/PlayReport/Specs.cs index c162d4c2c..2dd1c02ac 100644 --- a/src/Ryujinx/Utilities/PlayReport/Specs.cs +++ b/src/Ryujinx/Systems/PlayReport/Specs.cs @@ -1,10 +1,10 @@ using MsgPack; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Collections.Generic; using System.Linq; -namespace Ryujinx.Ava.Utilities.PlayReport +namespace Ryujinx.Ava.Systems.PlayReport { /// /// A mapping of title IDs to value formatter specs. @@ -103,7 +103,7 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs. ///

/// The 'Sparse' multi-value formatters do not require every key to be present. - /// If you need this requirement, use . + /// If you need this requirement, use . ///
/// The key names to match. /// The function which can format the values. @@ -118,7 +118,7 @@ namespace Ryujinx.Ava.Utilities.PlayReport /// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs. ///

/// The 'Sparse' multi-value formatters do not require every key to be present. - /// If you need this requirement, use . + /// If you need this requirement, use . ///
/// The resolution priority of this value formatter. Higher resolves sooner. /// The key names to match. diff --git a/src/Ryujinx/Utilities/PlayReport/Value.cs b/src/Ryujinx/Systems/PlayReport/Value.cs similarity index 99% rename from src/Ryujinx/Utilities/PlayReport/Value.cs rename to src/Ryujinx/Systems/PlayReport/Value.cs index b3108a41e..1c738c213 100644 --- a/src/Ryujinx/Utilities/PlayReport/Value.cs +++ b/src/Ryujinx/Systems/PlayReport/Value.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; -namespace Ryujinx.Ava.Utilities.PlayReport +namespace Ryujinx.Ava.Systems.PlayReport { /// /// The base input data to a ValueFormatter delegate, diff --git a/src/Ryujinx/Rebooter.cs b/src/Ryujinx/Systems/Rebooter.cs similarity index 96% rename from src/Ryujinx/Rebooter.cs rename to src/Ryujinx/Systems/Rebooter.cs index 8c7755a4c..4b149e9e3 100644 --- a/src/Ryujinx/Rebooter.cs +++ b/src/Ryujinx/Systems/Rebooter.cs @@ -1,8 +1,6 @@ using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Utilities; -using SkiaSharp; using System; using System.Collections.Generic; using System.Diagnostics; @@ -10,7 +8,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; -namespace Ryujinx.Ava +namespace Ryujinx.Ava.Systems { internal static class Rebooter { diff --git a/src/Ryujinx/Updater.cs b/src/Ryujinx/Systems/Updater.cs similarity index 99% rename from src/Ryujinx/Updater.cs rename to src/Ryujinx/Systems/Updater.cs index 7ca5e885a..850bacc60 100644 --- a/src/Ryujinx/Updater.cs +++ b/src/Ryujinx/Systems/Updater.cs @@ -27,7 +27,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Ryujinx.Ava +namespace Ryujinx.Ava.Systems { internal static class Updater { diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs index a8a6f24c6..18252f337 100644 --- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs +++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs @@ -7,7 +7,7 @@ using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.HLE; using Ryujinx.HLE.HOS.Applets; diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs index cd6700aea..64377ba51 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs @@ -9,11 +9,10 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.UI.Views.Misc; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.Compat; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Views.Dialog; using Ryujinx.Common.Configuration; using Ryujinx.Common.Helper; using Ryujinx.HLE.HOS; @@ -81,13 +80,13 @@ namespace Ryujinx.Ava.UI.Controls public async void OpenTitleUpdateManager_Click(object sender, RoutedEventArgs args) { if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await TitleUpdateWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication); + await TitleUpdateManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication); } public async void OpenDownloadableContentManager_Click(object sender, RoutedEventArgs args) { if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await DownloadableContentManagerWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication); + await DownloadableContentManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication); } public async void OpenCheatManager_Click(object sender, RoutedEventArgs args) @@ -128,7 +127,7 @@ namespace Ryujinx.Ava.UI.Controls public async void OpenModManager_Click(object sender, RoutedEventArgs args) { if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await ModManagerWindow.Show( + await ModManagerView.Show( viewModel.SelectedApplication.Id, viewModel.SelectedApplication.IdBase, viewModel.ApplicationLibrary, @@ -408,7 +407,7 @@ namespace Ryujinx.Ava.UI.Controls public async void OpenApplicationCompatibility_Click(object sender, RoutedEventArgs args) { if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await CompatibilityList.Show(viewModel.SelectedApplication.IdString); + await CompatibilityListWindow.Show(viewModel.SelectedApplication.IdString); } public async void OpenApplicationData_Click(object sender, RoutedEventArgs args) diff --git a/src/Ryujinx/UI/Controls/RyujinxLogo.cs b/src/Ryujinx/UI/Controls/RyujinxLogo.cs new file mode 100644 index 000000000..89b89f311 --- /dev/null +++ b/src/Ryujinx/UI/Controls/RyujinxLogo.cs @@ -0,0 +1,28 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Media.Imaging; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.ViewModels; +using System.Reflection; + +namespace Ryujinx.Ava.UI.Controls +{ + public class RyujinxLogo : Image + { + // The UI specifically uses a thicker bordered variant of the icon to avoid crunching out the border at lower resolutions. + // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left. + // The border gets reduced to colored pixels in the 4 corners. + public static readonly Bitmap Bitmap = + new(Assembly.GetAssembly(typeof(MainWindowViewModel))! + .GetManifestResourceStream("Ryujinx.Assets.UIImages.Logo_Ryujinx_AntiAlias.png")!); + + public RyujinxLogo() + { + Margin = new Thickness(7, 7, 7, 0); + Height = 25; + Width = 25; + Source = Bitmap; + IsVisible = !ConfigurationState.Instance.ShowOldUI; + } + } +} diff --git a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs index 0ceaa6c4c..93f6b4c3c 100644 --- a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs +++ b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs @@ -1,5 +1,5 @@ using Avalonia.Interactivity; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; namespace Ryujinx.Ava.UI.Helpers { diff --git a/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs b/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs index 7694e8883..1dca0d164 100644 --- a/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs +++ b/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs @@ -2,7 +2,7 @@ using Avalonia.Data.Converters; using Avalonia.Markup.Xaml; using Gommon; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Globalization; using System.Text; diff --git a/src/Ryujinx/UI/Windows/IconColorPicker.cs b/src/Ryujinx/UI/Helpers/IconColorPicker.cs similarity index 98% rename from src/Ryujinx/UI/Windows/IconColorPicker.cs rename to src/Ryujinx/UI/Helpers/IconColorPicker.cs index ca9ac2c05..b6ee8bbbf 100644 --- a/src/Ryujinx/UI/Windows/IconColorPicker.cs +++ b/src/Ryujinx/UI/Helpers/IconColorPicker.cs @@ -2,9 +2,9 @@ using SkiaSharp; using System; using System.Collections.Generic; -namespace Ryujinx.Ava.UI.Windows +namespace Ryujinx.Ava.UI.Helpers { - static class IconColorPicker + public static class IconColorPicker { private const int ColorsPerLine = 64; private const int TotalColors = ColorsPerLine * ColorsPerLine; diff --git a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs index ba317e74a..902d3966f 100644 --- a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs +++ b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs @@ -1,7 +1,7 @@ using Avalonia.Logging; using Avalonia.Utilities; using Gommon; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Logging; using System; using System.Text; diff --git a/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs b/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs index f2d27f2df..3808ae6a2 100644 --- a/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs +++ b/src/Ryujinx/UI/Models/Generic/LastPlayedSortComparer.cs @@ -1,4 +1,4 @@ -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Collections.Generic; diff --git a/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs b/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs index d7ae51e96..321bde09b 100644 --- a/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs +++ b/src/Ryujinx/UI/Models/Generic/TimePlayedSortComparer.cs @@ -1,4 +1,4 @@ -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System; using System.Collections.Generic; diff --git a/src/Ryujinx/UI/Models/SaveModel.cs b/src/Ryujinx/UI/Models/SaveModel.cs index d50aabc4e..1a4718ddf 100644 --- a/src/Ryujinx/UI/Models/SaveModel.cs +++ b/src/Ryujinx/UI/Models/SaveModel.cs @@ -3,7 +3,7 @@ using LibHac.Fs; using LibHac.Ncm; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.HLE.FileSystem; using System.IO; using System.Linq; diff --git a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs index 21c39967f..7b642bb9d 100644 --- a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs +++ b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs @@ -1,7 +1,7 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Platform; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Helper; using SPB.Graphics; diff --git a/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs b/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs index 81a94d6c4..e788272f6 100644 --- a/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs +++ b/src/Ryujinx/UI/Renderer/EmbeddedWindowOpenGL.cs @@ -1,5 +1,5 @@ using OpenTK.Graphics.OpenGL; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; diff --git a/src/Ryujinx/UI/Renderer/RendererHost.cs b/src/Ryujinx/UI/Renderer/RendererHost.cs index 7352dbdb5..fd7124f2b 100644 --- a/src/Ryujinx/UI/Renderer/RendererHost.cs +++ b/src/Ryujinx/UI/Renderer/RendererHost.cs @@ -1,7 +1,7 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Media; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common.Configuration; using System; diff --git a/src/Ryujinx/RyujinxApp.axaml b/src/Ryujinx/UI/RyujinxApp.axaml similarity index 84% rename from src/Ryujinx/RyujinxApp.axaml rename to src/Ryujinx/UI/RyujinxApp.axaml index aca69645a..bffb5cece 100644 --- a/src/Ryujinx/RyujinxApp.axaml +++ b/src/Ryujinx/UI/RyujinxApp.axaml @@ -17,4 +17,9 @@ + + + + + diff --git a/src/Ryujinx/RyujinxApp.axaml.cs b/src/Ryujinx/UI/RyujinxApp.axaml.cs similarity index 96% rename from src/Ryujinx/RyujinxApp.axaml.cs rename to src/Ryujinx/UI/RyujinxApp.axaml.cs index 90552cd16..2f460f2b3 100644 --- a/src/Ryujinx/RyujinxApp.axaml.cs +++ b/src/Ryujinx/UI/RyujinxApp.axaml.cs @@ -7,12 +7,12 @@ using Avalonia.Styling; using Avalonia.Threading; using FluentAvalonia.UI.Windowing; using Gommon; -using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.Views.Dialog; using Ryujinx.Common; using Ryujinx.Common.Logging; using System; @@ -147,5 +147,10 @@ namespace Ryujinx.Ava Current is RyujinxApp { PlatformSettings: not null } app ? ConvertThemeVariant(app.PlatformSettings.GetColorValues().ThemeVariant) : ThemeVariant.Default; + + private async void AboutRyujinx_OnClick(object sender, EventArgs e) + { + await AboutView.Show(); + } } } diff --git a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs index 7a63c3391..6e1bd7ce3 100644 --- a/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/AboutWindowViewModel.cs @@ -3,9 +3,8 @@ using Avalonia.Styling; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using Gommon; -using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using System; namespace Ryujinx.Ava.UI.ViewModels diff --git a/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs index 9c37368de..c8d648b99 100644 --- a/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs +++ b/src/Ryujinx/UI/ViewModels/AppListFavoriteComparable.cs @@ -1,4 +1,4 @@ -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System; namespace Ryujinx.Ava.UI.ViewModels diff --git a/src/Ryujinx/UI/ViewModels/ApplicationDataViewModel.cs b/src/Ryujinx/UI/ViewModels/ApplicationDataViewModel.cs index 33c75bc62..4bffcb7d3 100644 --- a/src/Ryujinx/UI/ViewModels/ApplicationDataViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/ApplicationDataViewModel.cs @@ -1,7 +1,7 @@ using Gommon; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.PlayReport; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.PlayReport; namespace Ryujinx.Ava.UI.ViewModels { diff --git a/src/Ryujinx/Utilities/Compat/CompatibilityViewModel.cs b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs similarity index 63% rename from src/Ryujinx/Utilities/Compat/CompatibilityViewModel.cs rename to src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs index 721a36194..1965fee69 100644 --- a/src/Ryujinx/Utilities/Compat/CompatibilityViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs @@ -1,16 +1,17 @@ using Gommon; -using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems; +using Ryujinx.Ava.Systems.AppLibrary; +using System; using System.Collections.Generic; using System.Linq; -namespace Ryujinx.Ava.Utilities.Compat +namespace Ryujinx.Ava.UI.ViewModels { - public class CompatibilityViewModel : BaseModel + public class CompatibilityViewModel : BaseModel, IDisposable { - private bool _onlyShowOwnedGames = true; + private readonly ApplicationLibrary _appLibrary; - private IEnumerable _currentEntries = CompatibilityCsv.Entries; + private IEnumerable _currentEntries = CompatibilityDatabase.Entries; private string[] _ownedGameTitleIds = []; public IEnumerable CurrentEntries => OnlyShowOwnedGames @@ -19,15 +20,27 @@ namespace Ryujinx.Ava.Utilities.Compat : _currentEntries; public CompatibilityViewModel() {} + + private void AppCountUpdated(object _, ApplicationCountUpdatedEventArgs __) + => _ownedGameTitleIds = _appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray(); public CompatibilityViewModel(ApplicationLibrary appLibrary) { - appLibrary.ApplicationCountUpdated += (_, _) - => _ownedGameTitleIds = appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray(); + _appLibrary = appLibrary; - _ownedGameTitleIds = appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray(); + AppCountUpdated(null, null); + + _appLibrary.ApplicationCountUpdated += AppCountUpdated; } + void IDisposable.Dispose() + { + GC.SuppressFinalize(this); + _appLibrary.ApplicationCountUpdated -= AppCountUpdated; + } + + private bool _onlyShowOwnedGames = true; + public bool OnlyShowOwnedGames { get => _onlyShowOwnedGames; @@ -45,11 +58,11 @@ namespace Ryujinx.Ava.Utilities.Compat { if (string.IsNullOrEmpty(searchTerm)) { - SetEntries(CompatibilityCsv.Entries); + SetEntries(CompatibilityDatabase.Entries); return; } - SetEntries(CompatibilityCsv.Entries.Where(x => + SetEntries(CompatibilityDatabase.Entries.Where(x => x.GameName.ContainsIgnoreCase(searchTerm) || x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm)))); } diff --git a/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs b/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs index b486aa766..e236ac737 100644 --- a/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/DlcSelectViewModel.cs @@ -1,6 +1,6 @@ using CommunityToolkit.Mvvm.ComponentModel; using Ryujinx.Ava.Common.Models; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System.Linq; namespace Ryujinx.Ava.UI.ViewModels diff --git a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs index a16a06ff5..dc1e928f1 100644 --- a/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/DownloadableContentManagerViewModel.cs @@ -7,7 +7,7 @@ using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; diff --git a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs index 96da58b5d..f8be4b2ce 100644 --- a/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/ControllerInputViewModel.cs @@ -1,9 +1,5 @@ using Avalonia.Svg.Skia; using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using FluentAvalonia.UI.Controls; -using Ryujinx.Ava.Input; -using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Views.Input; using Ryujinx.Common.Utilities; diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index b324d39e8..693c99ff1 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -10,7 +10,7 @@ using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Windows; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; diff --git a/src/Ryujinx/UI/ViewModels/Input/LedInputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/LedInputViewModel.cs index 521b13859..effd07904 100644 --- a/src/Ryujinx/UI/ViewModels/Input/LedInputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/LedInputViewModel.cs @@ -3,7 +3,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Humanizer; using Ryujinx.Ava.UI.Helpers; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using System.Globalization; namespace Ryujinx.Ava.UI.ViewModels.Input diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 2c42a1a1d..b0cd6a556 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -3,7 +3,6 @@ using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Input; using Avalonia.Media; -using Avalonia.Media.Imaging; using Avalonia.Platform.Storage; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; @@ -17,14 +16,15 @@ using LibHac.Ns; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Input; +using Ryujinx.Ava.Systems; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.Models.Generic; using Ryujinx.Ava.UI.Renderer; using Ryujinx.Ava.UI.Windows; -using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Helper; @@ -46,7 +46,6 @@ using System.Collections.ObjectModel; using System.Globalization; using System.IO; using System.Linq; -using System.Reflection; using System.Threading; using System.Threading.Tasks; using Key = Ryujinx.Input.Key; @@ -137,13 +136,6 @@ namespace Ryujinx.Ava.UI.ViewModels // Key is Title ID public SafeDictionary LdnData = []; - // The UI specifically uses a thicker bordered variant of the icon to avoid crunching out the border at lower resolutions. - // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left. - // The border gets reduced to colored pixels in the 4 corners. - public static readonly Bitmap IconBitmap = - new(Assembly.GetAssembly(typeof(MainWindowViewModel))! - .GetManifestResourceStream("Ryujinx.Assets.UIImages.Logo_Ryujinx_AntiAlias.png")!); - public MainWindow Window { get; init; } internal AppHost AppHost { get; set; } @@ -1794,7 +1786,7 @@ namespace Ryujinx.Ava.UI.ViewModels if (WindowState is not WindowState.Normal) { WindowState = WindowState.Normal; - Window.TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar; + Window.TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowOldUI; if (IsGameRunning) { diff --git a/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs b/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs index cda7e34cf..081ca0912 100644 --- a/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/ModManagerViewModel.cs @@ -7,7 +7,7 @@ using Gommon; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.Utilities; diff --git a/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs index 167b8a857..022b7481e 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs @@ -1,6 +1,6 @@ using CommunityToolkit.Mvvm.ComponentModel; using Gommon; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; namespace Ryujinx.Ava.UI.ViewModels { @@ -16,11 +16,12 @@ namespace Ryujinx.Ava.UI.ViewModels } [ObservableProperty] private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix; + [ObservableProperty] private bool _nifmDisableIsAnyInternetRequestAccepted = ConfigurationState.Instance.Hacks.DisableNifmIsAnyInternetRequestAccepted; public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb => { sb.AppendLine( - "This fix applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.") + "This hack applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.") .AppendLine(); sb.AppendLine("From the issue on GitHub:").AppendLine(); @@ -29,5 +30,14 @@ namespace Ryujinx.Ava.UI.ViewModels "there is a low chance that the game will softlock, " + "the submenu won't show up, while background music is still there."); }); + + public static string NifmDisableIsAnyInternetRequestAcceptedTooltip { get; } = Lambda.String(sb => + { + sb.AppendLine( + "This hack simply sets 'IsAnyInternetRequestAccepted' to 'false' when initializing the Nifm IGeneralService.") + .AppendLine(); + + sb.Append("Lets DOOM 2016 go in game."); + }); } } diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index d0a6c6d8a..a092e97f2 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -12,9 +12,9 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models.Input; using Ryujinx.Ava.UI.Windows; -using Ryujinx.Ava.Utilities.Configuration; -using Ryujinx.Ava.Utilities.Configuration.System; -using Ryujinx.Ava.Utilities.Configuration.UI; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.System; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.GraphicsDriver; @@ -130,11 +130,10 @@ namespace Ryujinx.Ava.UI.ViewModels public bool IsOpenGLAvailable => !OperatingSystem.IsMacOS(); public bool EnableDiscordIntegration { get; set; } - public bool CheckUpdatesOnStart { get; set; } public bool ShowConfirmExit { get; set; } public bool IgnoreApplet { get; set; } public bool RememberWindowState { get; set; } - public bool ShowTitleBar { get; set; } + public bool ShowOldUI { get; set; } public int HideCursor { get; set; } public int UpdateCheckerType { get; set; } public bool EnableDockedMode { get; set; } @@ -537,10 +536,9 @@ namespace Ryujinx.Ava.UI.ViewModels // User Interface EnableDiscordIntegration = config.EnableDiscordIntegration; - CheckUpdatesOnStart = config.CheckUpdatesOnStart; ShowConfirmExit = config.ShowConfirmExit; RememberWindowState = config.RememberWindowState; - ShowTitleBar = config.ShowTitleBar; + ShowOldUI = config.ShowOldUI; HideCursor = (int)config.HideCursor.Value; UpdateCheckerType = (int)config.UpdateCheckerType.Value; FocusLostActionType = (int)config.FocusLostActionType.Value; @@ -646,10 +644,9 @@ namespace Ryujinx.Ava.UI.ViewModels // User Interface config.EnableDiscordIntegration.Value = EnableDiscordIntegration; - config.CheckUpdatesOnStart.Value = CheckUpdatesOnStart; config.ShowConfirmExit.Value = ShowConfirmExit; config.RememberWindowState.Value = RememberWindowState; - config.ShowTitleBar.Value = ShowTitleBar; + config.ShowOldUI.Value = ShowOldUI; config.HideCursor.Value = (HideCursorMode)HideCursor; config.UpdateCheckerType.Value = (UpdaterType)UpdateCheckerType; config.FocusLostActionType.Value = (FocusLostType)FocusLostActionType; @@ -760,6 +757,8 @@ namespace Ryujinx.Ava.UI.ViewModels // Dirty Hacks config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFix; + config.Hacks.DisableNifmIsAnyInternetRequestAccepted.Value = + DirtyHacks.NifmDisableIsAnyInternetRequestAccepted; config.ToFileFormat().SaveConfig(Program.ConfigurationPath); diff --git a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs index 2b88aceed..7ecfc1c87 100644 --- a/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/TitleUpdateViewModel.cs @@ -6,7 +6,7 @@ using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs similarity index 98% rename from src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs rename to src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs index 560f852db..2085ffe26 100644 --- a/src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/XciTrimmerViewModel.cs @@ -6,7 +6,7 @@ using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; using Ryujinx.Ava.UI.Helpers; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using Ryujinx.Common.Utilities; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -16,7 +16,7 @@ using static Ryujinx.Common.Utilities.XCIFileTrimmer; namespace Ryujinx.Ava.UI.ViewModels { - public class XCITrimmerViewModel : BaseModel + public class XciTrimmerViewModel : BaseModel { private const long _bytesPerMB = 1024 * 1024; private enum ProcessingMode @@ -46,7 +46,7 @@ namespace Ryujinx.Ava.UI.ViewModels private SortField _sortField = SortField.Name; private bool _sortAscending = true; - public XCITrimmerViewModel(MainWindowViewModel mainWindowViewModel) + public XciTrimmerViewModel(MainWindowViewModel mainWindowViewModel) { _logger = new XCITrimmerLog.TrimmerWindow(this); _mainWindowViewModel = mainWindowViewModel; @@ -254,9 +254,9 @@ namespace Ryujinx.Ava.UI.ViewModels private class CompareXCITrimmerFiles : IComparer { - private XCITrimmerViewModel _viewModel; + private XciTrimmerViewModel _viewModel; - public CompareXCITrimmerFiles(XCITrimmerViewModel ViewModel) + public CompareXCITrimmerFiles(XciTrimmerViewModel ViewModel) { _viewModel = ViewModel; } diff --git a/src/Ryujinx/UI/Windows/AboutWindow.axaml b/src/Ryujinx/UI/Views/Dialog/AboutView.axaml similarity index 99% rename from src/Ryujinx/UI/Windows/AboutWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/AboutView.axaml index e215cf27e..4c3da21e4 100644 --- a/src/Ryujinx/UI/Windows/AboutWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/AboutView.axaml @@ -1,5 +1,5 @@ + public partial class AboutView : RyujinxControl { - public AboutWindow() + public AboutView() { InitializeComponent(); @@ -34,7 +32,7 @@ namespace Ryujinx.Ava.UI.Windows PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose], - Content = new AboutWindow { ViewModel = viewModel } + Content = new AboutView { ViewModel = viewModel } }; await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles()); diff --git a/src/Ryujinx/UI/Views/Misc/ApplicationDataView.axaml b/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml similarity index 99% rename from src/Ryujinx/UI/Views/Misc/ApplicationDataView.axaml rename to src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml index a36b637ec..7ba4ad784 100644 --- a/src/Ryujinx/UI/Views/Misc/ApplicationDataView.axaml +++ b/src/Ryujinx/UI/Views/Dialog/ApplicationDataView.axaml @@ -7,7 +7,7 @@ xmlns:ui="using:FluentAvalonia.UI.Controls" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Ryujinx.Ava.UI.Views.Misc.ApplicationDataView" + x:Class="Ryujinx.Ava.UI.Views.Dialog.ApplicationDataView" x:DataType="viewModels:ApplicationDataViewModel"> { @@ -46,21 +44,18 @@ namespace Ryujinx.Ava.UI.Views.Misc if (RyujinxApp.AppLifetime.Windows.TryGetFirst(x => x is ContentDialogOverlayWindow, out Window window)) window.Close(ContentDialogResult.None); - await CompatibilityList.Show((string)playabilityLabel.Tag); + await CompatibilityListWindow.Show((string)playabilityLabel.Tag); } private async void IdString_OnClick(object sender, RoutedEventArgs e) { - if (DataContext is not MainWindowViewModel mwvm) - return; - if (sender is not Button { Content: TextBlock idText }) return; if (!RyujinxApp.IsClipboardAvailable(out IClipboard clipboard)) return; - ApplicationData appData = mwvm.Applications.FirstOrDefault(it => it.IdString == idText.Text); + ApplicationData appData = RyujinxApp.MainWindow.ViewModel.Applications.FirstOrDefault(it => it.IdString == idText.Text); if (appData is null) return; diff --git a/src/Ryujinx/UI/Views/Misc/DlcSelectView.axaml b/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml similarity index 98% rename from src/Ryujinx/UI/Views/Misc/DlcSelectView.axaml rename to src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml index f44bc3261..05d1f7ae5 100644 --- a/src/Ryujinx/UI/Views/Misc/DlcSelectView.axaml +++ b/src/Ryujinx/UI/Views/Dialog/DlcSelectView.axaml @@ -7,7 +7,7 @@ xmlns:models="using:Ryujinx.Ava.Common.Models" xmlns:viewModels="using:Ryujinx.Ava.UI.ViewModels" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Ryujinx.Ava.UI.Views.Misc.DlcSelectView" + x:Class="Ryujinx.Ava.UI.Views.Dialog.DlcSelectView" x:DataType="viewModels:DlcSelectViewModel"> { diff --git a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml b/src/Ryujinx/UI/Views/Dialog/DownloadableContentManagerView.axaml similarity index 99% rename from src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/DownloadableContentManagerView.axaml index e2c4fe16e..8b97a4822 100644 --- a/src/Ryujinx/UI/Windows/DownloadableContentManagerWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/DownloadableContentManagerView.axaml @@ -1,5 +1,5 @@ { - public DownloadableContentManagerViewModel ViewModel; - - public DownloadableContentManagerWindow() + public DownloadableContentManagerView() { - DataContext = this; - - InitializeComponent(); - } - - public DownloadableContentManagerWindow(ApplicationLibrary applicationLibrary, ApplicationData applicationData) - { - DataContext = ViewModel = new DownloadableContentManagerViewModel(applicationLibrary, applicationData); - InitializeComponent(); } @@ -36,8 +26,11 @@ namespace Ryujinx.Ava.UI.Windows PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new DownloadableContentManagerWindow(applicationLibrary, applicationData), Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], applicationData.Name, applicationData.IdBaseString), + Content = new DownloadableContentManagerView + { + ViewModel = new DownloadableContentManagerViewModel(applicationLibrary, applicationData) + } }; Style bottomBorder = new(x => x.OfType().Name("DialogSpace").Child().OfType()); diff --git a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml b/src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml similarity index 99% rename from src/Ryujinx/UI/Windows/ModManagerWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml index 40ce6d6b5..ee913b56d 100644 --- a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml @@ -10,7 +10,7 @@ Width="500" Height="380" mc:Ignorable="d" - x:Class="Ryujinx.Ava.UI.Windows.ModManagerWindow" + x:Class="Ryujinx.Ava.UI.Views.Dialog.ModManagerView" x:CompileBindings="True" x:DataType="viewModels:ModManagerViewModel" Focusable="True"> diff --git a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml.cs b/src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml.cs similarity index 87% rename from src/Ryujinx/UI/Windows/ModManagerWindow.axaml.cs rename to src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml.cs index cb483b404..8735e2911 100644 --- a/src/Ryujinx/UI/Windows/ModManagerWindow.axaml.cs +++ b/src/Ryujinx/UI/Views/Dialog/ModManagerView.axaml.cs @@ -6,28 +6,18 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Common.Helper; using System.Threading.Tasks; using Button = Avalonia.Controls.Button; -namespace Ryujinx.Ava.UI.Windows +namespace Ryujinx.Ava.UI.Views.Dialog { - public partial class ModManagerWindow : UserControl + public partial class ModManagerView : RyujinxControl { - public readonly ModManagerViewModel ViewModel; - - public ModManagerWindow() + public ModManagerView() { - DataContext = this; - - InitializeComponent(); - } - - public ModManagerWindow(ulong titleId, ulong titleIdBase, ApplicationLibrary applicationLibrary) - { - DataContext = ViewModel = new ModManagerViewModel(titleId, titleIdBase, applicationLibrary); - InitializeComponent(); } @@ -38,7 +28,10 @@ namespace Ryujinx.Ava.UI.Windows PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new ModManagerWindow(titleId, titleIdBase, appLibrary), + Content = new ModManagerView + { + ViewModel = new ModManagerViewModel(titleId, titleIdBase, appLibrary) + }, Title = string.Format(LocaleManager.Instance[LocaleKeys.ModWindowTitle], titleName, titleId.ToString("X16")), }; diff --git a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml b/src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml similarity index 99% rename from src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml index 4da727db5..ba3e85e8b 100644 --- a/src/Ryujinx/UI/Windows/TitleUpdateWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/TitleUpdateManagerView.axaml @@ -1,5 +1,5 @@ { - public readonly TitleUpdateViewModel ViewModel; - - public TitleUpdateWindow() + public TitleUpdateManagerView() { - DataContext = this; - - InitializeComponent(); - } - - public TitleUpdateWindow(ApplicationLibrary applicationLibrary, ApplicationData applicationData) - { - DataContext = ViewModel = new TitleUpdateViewModel(applicationLibrary, applicationData); - InitializeComponent(); } @@ -36,8 +26,11 @@ namespace Ryujinx.Ava.UI.Windows PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new TitleUpdateWindow(applicationLibrary, applicationData), Title = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.GameUpdateWindowHeading, applicationData.Name, applicationData.IdBaseString), + Content = new TitleUpdateManagerView + { + ViewModel = new TitleUpdateViewModel(applicationLibrary, applicationData) + } }; Style bottomBorder = new(x => x.OfType().Name("DialogSpace").Child().OfType()); diff --git a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml similarity index 98% rename from src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml rename to src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml index e3bdabbf5..d149d246c 100644 --- a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml +++ b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml @@ -1,5 +1,5 @@ @@ -151,7 +151,7 @@ HorizontalAlignment="Stretch" VerticalAlignment="Center" CornerRadius="5" - IsVisible="{Binding $parent[UserControl].((viewModels:XCITrimmerViewModel)DataContext).Processing}" + IsVisible="{Binding $parent[UserControl].((viewModels:XciTrimmerViewModel)DataContext).Processing}" Maximum="100" Minimum="0" Value="{Binding PercentageProgress}" /> diff --git a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml.cs similarity index 81% rename from src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs rename to src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml.cs index e02ff6279..8fb8c151c 100644 --- a/src/Ryujinx/UI/Windows/XCITrimmerWindow.axaml.cs +++ b/src/Ryujinx/UI/Views/Dialog/XciTrimmerView.axaml.cs @@ -4,27 +4,17 @@ using Avalonia.Styling; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; using System; using System.Threading.Tasks; -namespace Ryujinx.Ava.UI.Windows +namespace Ryujinx.Ava.UI.Views.Dialog { - public partial class XCITrimmerWindow : UserControl + public partial class XciTrimmerView : RyujinxControl { - public XCITrimmerViewModel ViewModel; - - public XCITrimmerWindow() + public XciTrimmerView() { - DataContext = this; - - InitializeComponent(); - } - - public XCITrimmerWindow(MainWindowViewModel mainWindowViewModel) - { - DataContext = ViewModel = new XCITrimmerViewModel(mainWindowViewModel); - InitializeComponent(); } @@ -35,7 +25,10 @@ namespace Ryujinx.Ava.UI.Windows PrimaryButtonText = string.Empty, SecondaryButtonText = string.Empty, CloseButtonText = string.Empty, - Content = new XCITrimmerWindow(RyujinxApp.MainWindow.ViewModel), + Content = new XciTrimmerView + { + ViewModel = new XciTrimmerViewModel(RyujinxApp.MainWindow.ViewModel) + }, Title = LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle] }; @@ -70,7 +63,7 @@ namespace Ryujinx.Ava.UI.Windows public void Sort_Checked(object sender, RoutedEventArgs args) { if (sender is RadioButton { Tag: string sortField }) - ViewModel.SortingField = Enum.Parse(sortField); + ViewModel.SortingField = Enum.Parse(sortField); } public void Order_Checked(object sender, RoutedEventArgs args) diff --git a/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs b/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs index 3252ee7e2..916ada37e 100644 --- a/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs +++ b/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia; -using Avalonia.Controls; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; diff --git a/src/Ryujinx/UI/Views/Input/MotionInputView.axaml.cs b/src/Ryujinx/UI/Views/Input/MotionInputView.axaml.cs index 329b9128e..2a83d1008 100644 --- a/src/Ryujinx/UI/Views/Input/MotionInputView.axaml.cs +++ b/src/Ryujinx/UI/Views/Input/MotionInputView.axaml.cs @@ -1,4 +1,3 @@ -using Avalonia.Controls; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; diff --git a/src/Ryujinx/UI/Views/Input/RumbleInputView.axaml.cs b/src/Ryujinx/UI/Views/Input/RumbleInputView.axaml.cs index 2745ceac7..347d011d5 100644 --- a/src/Ryujinx/UI/Views/Input/RumbleInputView.axaml.cs +++ b/src/Ryujinx/UI/Views/Input/RumbleInputView.axaml.cs @@ -1,4 +1,3 @@ -using Avalonia.Controls; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 1da91c388..61f5c1e50 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -6,18 +6,16 @@ xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" mc:Ignorable="d" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" + xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" x:DataType="viewModels:MainWindowViewModel" x:Class="Ryujinx.Ava.UI.Views.Main.MainMenuBarView"> - + CompatibilityList.Show()); + XciTrimmerMenuItem.Command = Commands.Create(XciTrimmerView.Show); + AboutWindowMenuItem.Command = Commands.Create(AboutView.Show); + CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show()); UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand; @@ -226,7 +223,7 @@ namespace Ryujinx.Ava.UI.Views.Main // Correctly size window when 'TitleBar' is enabled (Nov. 14, 2024) double barsHeight = ((Window.StatusBarHeight + Window.MenuBarHeight) + - (ConfigurationState.Instance.ShowTitleBar ? (int)Window.TitleBar.Height : 0)); + (ConfigurationState.Instance.ShowOldUI ? (int)Window.TitleBar.Height : 0)); double windowWidthScaled = (resolutionWidth * Program.WindowScaleFactor); double windowHeightScaled = ((resolutionHeight + barsHeight) * Program.WindowScaleFactor); diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs index 5a023910c..8341dd92a 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia; -using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Threading; @@ -7,7 +6,7 @@ using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; -using Ryujinx.Ava.Utilities.Configuration; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; diff --git a/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml.cs b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml.cs index bb7d62c8f..c1cf7a66b 100644 --- a/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml.cs +++ b/src/Ryujinx/UI/Views/Misc/ApplicationGridView.axaml.cs @@ -4,7 +4,7 @@ using Avalonia.Interactivity; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.Utilities.AppLibrary; +using Ryujinx.Ava.Systems.AppLibrary; using System; namespace Ryujinx.Ava.UI.Views.Misc diff --git a/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs index e393d0836..aa87a8c9a 100644 --- a/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs +++ b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs @@ -5,8 +5,8 @@ using Avalonia.Interactivity; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.Compat; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Windows; using System; using System.Linq; @@ -36,7 +36,7 @@ namespace Ryujinx.Ava.UI.Views.Misc if (sender is not Button { Content: TextBlock playabilityLabel }) return; - await CompatibilityList.Show((string)playabilityLabel.Tag); + await CompatibilityListWindow.Show((string)playabilityLabel.Tag); } private async void IdString_OnClick(object sender, RoutedEventArgs e) diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml index 4cf96366a..229f9e866 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml @@ -29,7 +29,7 @@ + Text="Highly specific hacks & tricks to alleviate performance issues, crashing, or freezing. Can cause issues." /> + + + + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs index d3d1537e0..46693374a 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml.cs @@ -3,7 +3,9 @@ using Avalonia.Controls.Primitives; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.LogicalTree; +using Avalonia.Threading; using Ryujinx.Ava.Input; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Input; @@ -13,7 +15,7 @@ using Key = Ryujinx.Common.Configuration.Hid.Key; namespace Ryujinx.Ava.UI.Views.Settings { - public partial class SettingsHotkeysView : UserControl + public partial class SettingsHotkeysView : RyujinxControl { private ButtonKeyAssigner _currentAssigner; private readonly IGamepadDriver _avaloniaKeyboardDriver; @@ -78,45 +80,49 @@ namespace Ryujinx.Ava.UI.Views.Settings { if (e.ButtonValue.HasValue) { - SettingsViewModel viewModel = (DataContext) as SettingsViewModel; Button buttonValue = e.ButtonValue.Value; - switch (button.Name) + Dispatcher.UIThread.Post(() => { - case "ToggleVSyncMode": - viewModel.KeyboardHotkey.ToggleVSyncMode = buttonValue.AsHidType(); - break; - case "Screenshot": - viewModel.KeyboardHotkey.Screenshot = buttonValue.AsHidType(); - break; - case "ShowUI": - viewModel.KeyboardHotkey.ShowUI = buttonValue.AsHidType(); - break; - case "Pause": - viewModel.KeyboardHotkey.Pause = buttonValue.AsHidType(); - break; - case "ToggleMute": - viewModel.KeyboardHotkey.ToggleMute = buttonValue.AsHidType(); - break; - case "ResScaleUp": - viewModel.KeyboardHotkey.ResScaleUp = buttonValue.AsHidType(); - break; - case "ResScaleDown": - viewModel.KeyboardHotkey.ResScaleDown = buttonValue.AsHidType(); - break; - case "VolumeUp": - viewModel.KeyboardHotkey.VolumeUp = buttonValue.AsHidType(); - break; - case "VolumeDown": - viewModel.KeyboardHotkey.VolumeDown = buttonValue.AsHidType(); - break; - case "CustomVSyncIntervalIncrement": - viewModel.KeyboardHotkey.CustomVSyncIntervalIncrement = buttonValue.AsHidType(); - break; - case "CustomVSyncIntervalDecrement": - viewModel.KeyboardHotkey.CustomVSyncIntervalDecrement = buttonValue.AsHidType(); - break; - } + switch (button.Name) + { + case "ToggleVSyncMode": + ViewModel.KeyboardHotkey.ToggleVSyncMode = buttonValue.AsHidType(); + break; + case "Screenshot": + ViewModel.KeyboardHotkey.Screenshot = buttonValue.AsHidType(); + break; + case "ShowUI": + ViewModel.KeyboardHotkey.ShowUI = buttonValue.AsHidType(); + break; + case "Pause": + ViewModel.KeyboardHotkey.Pause = buttonValue.AsHidType(); + break; + case "ToggleMute": + ViewModel.KeyboardHotkey.ToggleMute = buttonValue.AsHidType(); + break; + case "ResScaleUp": + ViewModel.KeyboardHotkey.ResScaleUp = buttonValue.AsHidType(); + break; + case "ResScaleDown": + ViewModel.KeyboardHotkey.ResScaleDown = buttonValue.AsHidType(); + break; + case "VolumeUp": + ViewModel.KeyboardHotkey.VolumeUp = buttonValue.AsHidType(); + break; + case "VolumeDown": + ViewModel.KeyboardHotkey.VolumeDown = buttonValue.AsHidType(); + break; + case "CustomVSyncIntervalIncrement": + ViewModel.KeyboardHotkey.CustomVSyncIntervalIncrement = + buttonValue.AsHidType(); + break; + case "CustomVSyncIntervalDecrement": + ViewModel.KeyboardHotkey.CustomVSyncIntervalDecrement = + buttonValue.AsHidType(); + break; + } + }); } }; diff --git a/src/Ryujinx/UI/Views/Settings/SettingsNetworkView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsNetworkView.axaml.cs index c4987702c..934fcf142 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsNetworkView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsNetworkView.axaml.cs @@ -1,15 +1,13 @@ -using Avalonia.Controls; using Avalonia.Interactivity; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; using System; namespace Ryujinx.Ava.UI.Views.Settings { - public partial class SettingsNetworkView : UserControl + public partial class SettingsNetworkView : RyujinxControl { private readonly Random _random; - - public SettingsViewModel ViewModel; public SettingsNetworkView() { diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml index dd6858ee6..a52fe5fbe 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml @@ -191,16 +191,16 @@ IsEnabled="{Binding !IsGameTitleNotNull}" Opacity="{Binding PanelOpacity}" Orientation="Horizontal"> - - + ToolTip.Tip="{ext:Locale MatchTimeTooltip}"> + + + { - public SettingsViewModel ViewModel; - public SettingsSystemView() { InitializeComponent(); diff --git a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml index 7dd5211a7..1c18a8e4c 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml @@ -49,14 +49,15 @@ - + + IsChecked="{Binding ShowOldUI}" + ToolTip.Tip="{ext:Locale SettingsTabGeneralShowOldUIToolTip}"> - + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs index 2b0e57cb5..fb839a473 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs @@ -3,10 +3,10 @@ using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Platform.Storage; using Gommon; +using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Utilities; -using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -14,20 +14,18 @@ using System.Threading.Tasks; namespace Ryujinx.Ava.UI.Views.Settings { - public partial class SettingsUiView : UserControl + public partial class SettingsUiView : RyujinxControl { - public SettingsViewModel ViewModel; - public SettingsUiView() { InitializeComponent(); AddGameDirButton.Command = - Commands.Create(() => AddDirButton(GameDirPathBox, ViewModel.GameDirectories, true)); + Commands.Create(() => AddDirButton(GameDirPathBox, ViewModel.GameDirectories)); AddAutoloadDirButton.Command = - Commands.Create(() => AddDirButton(AutoloadDirPathBox, ViewModel.AutoloadDirectories, false)); + Commands.Create(() => AddDirButton(AutoloadDirPathBox, ViewModel.AutoloadDirectories)); } - private async Task AddDirButton(TextBox addDirBox, AvaloniaList directories, bool isGameList) + private async Task AddDirButton(TextBox addDirBox, AvaloniaList directories) { string path = addDirBox.Text; diff --git a/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs b/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs index afd102d07..eb1cf58bb 100644 --- a/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs +++ b/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs @@ -8,7 +8,6 @@ using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; using Ryujinx.HLE.HOS.Services.Account.Acc; -using System; using UserProfile = Ryujinx.Ava.UI.Models.UserProfile; namespace Ryujinx.Ava.UI.Views.User diff --git a/src/Ryujinx/UI/Views/User/UserRecovererView.axaml.cs b/src/Ryujinx/UI/Views/User/UserRecovererView.axaml.cs index 34dc3edab..d1fd70e9b 100644 --- a/src/Ryujinx/UI/Views/User/UserRecovererView.axaml.cs +++ b/src/Ryujinx/UI/Views/User/UserRecovererView.axaml.cs @@ -1,4 +1,3 @@ -using Avalonia.Controls; using Avalonia.Interactivity; using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Navigation; diff --git a/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml.cs b/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml.cs index 8aff9c5f9..edbbd595b 100644 --- a/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml.cs +++ b/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml.cs @@ -1,4 +1,3 @@ -using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Threading; using FluentAvalonia.UI.Controls; diff --git a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml index ce410923d..ad77a9b6b 100644 --- a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml +++ b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml @@ -6,6 +6,7 @@ xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" + xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="350" @@ -23,7 +24,25 @@ - + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs index 8c76b8e2f..2d6eb4716 100644 --- a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs @@ -1,13 +1,14 @@ using Avalonia.Interactivity; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Models.Amiibo; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.ViewModels; namespace Ryujinx.Ava.UI.Windows { public partial class AmiiboWindow : StyleableAppWindow { - public AmiiboWindow(bool showAll, string lastScannedAmiiboId, string titleId) + public AmiiboWindow(bool showAll, string lastScannedAmiiboId, string titleId) : base(true, 40) { DataContext = ViewModel = new AmiiboWindowViewModel(this, lastScannedAmiiboId, titleId) { @@ -16,6 +17,9 @@ namespace Ryujinx.Ava.UI.Windows InitializeComponent(); + FlushControls.IsVisible = !ConfigurationState.Instance.ShowOldUI; + NormalControls.IsVisible = ConfigurationState.Instance.ShowOldUI; + Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo); } diff --git a/src/Ryujinx/UI/Windows/CheatWindow.axaml b/src/Ryujinx/UI/Windows/CheatWindow.axaml index 32f914019..49b13048f 100644 --- a/src/Ryujinx/UI/Windows/CheatWindow.axaml +++ b/src/Ryujinx/UI/Windows/CheatWindow.axaml @@ -6,6 +6,7 @@ xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows" + xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" Width="600" Height="750" MinWidth="500" @@ -20,38 +21,81 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs new file mode 100644 index 000000000..a2b98f8f8 --- /dev/null +++ b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs @@ -0,0 +1,46 @@ +using Avalonia.Controls; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.ViewModels; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Windows +{ + public partial class CompatibilityListWindow : StyleableAppWindow + { + public static async Task Show(string titleId = null) + { + using CompatibilityViewModel compatWindow = new(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary); + + await ShowAsync(new CompatibilityListWindow + { + DataContext = compatWindow, + SearchBoxFlush = { Text = titleId ?? string.Empty }, + SearchBoxNormal = { Text = titleId ?? string.Empty } + }); + } + + public CompatibilityListWindow() : base(useCustomTitleBar: true, 37) + { + Title = RyujinxApp.FormatTitle(LocaleKeys.CompatibilityListTitle); + + InitializeComponent(); + + FlushControls.IsVisible = !ConfigurationState.Instance.ShowOldUI; + NormalControls.IsVisible = ConfigurationState.Instance.ShowOldUI; + } + + // ReSharper disable once UnusedMember.Local + // its referenced in the axaml but rider keeps yelling at me that its unused so + private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e) + { + if (DataContext is not CompatibilityViewModel cvm) + return; + + if (sender is not TextBox searchBox) + return; + + cvm.Search(searchBox.Text); + } + } +} diff --git a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs index a28099257..0d172ff59 100644 --- a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml.cs @@ -1,25 +1,9 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Controls.Shapes; -using Avalonia.Input; -using Avalonia.Media.Imaging; -using FluentAvalonia.Core; using FluentAvalonia.UI.Controls; -using Projektanker.Icons.Avalonia; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Ava.UI.ViewModels.Input; -using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.Configuration; -using Ryujinx.Common.Configuration; -using Ryujinx.HLE.FileSystem; -using Ryujinx.HLE.HOS.SystemState; -using Ryujinx.Input; using System; -using System.IO; using System.Linq; -using Key = Avalonia.Input.Key; namespace Ryujinx.Ava.UI.Windows diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 241a0c0dc..4f5cb13d3 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -7,20 +7,19 @@ using Avalonia.Platform; using Avalonia.Threading; using DynamicData; using FluentAvalonia.UI.Controls; -using FluentAvalonia.UI.Windowing; using Gommon; using LibHac.Ns; -using LibHac.Tools.FsSystem; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Input; +using Ryujinx.Ava.Systems; using Ryujinx.Ava.UI.Applet; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Utilities; -using Ryujinx.Ava.Utilities.AppLibrary; -using Ryujinx.Ava.Utilities.Configuration; -using Ryujinx.Ava.Utilities.Configuration.UI; +using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.Systems.Configuration.UI; using Ryujinx.Common; using Ryujinx.Common.Helper; using Ryujinx.Common.Logging; @@ -76,7 +75,7 @@ namespace Ryujinx.Ava.UI.Windows public readonly double StatusBarHeight; public readonly double MenuBarHeight; - public MainWindow() + public MainWindow() : base(useCustomTitleBar: true) { DataContext = ViewModel = new MainWindowViewModel { @@ -90,9 +89,6 @@ namespace Ryujinx.Ava.UI.Windows ViewModel.Title = RyujinxApp.FormatTitle(); - TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar; - TitleBar.TitleBarHitTestType = (ConfigurationState.Instance.ShowTitleBar) ? TitleBarHitTestType.Simple : TitleBarHitTestType.Complex; - // NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point. StatusBarHeight = StatusBarView.StatusBar.MinHeight; MenuBarHeight = MenuBar.MinHeight; @@ -100,7 +96,7 @@ namespace Ryujinx.Ava.UI.Windows TitleBar.Height = MenuBarHeight; // Correctly size window when 'TitleBar' is enabled (Nov. 14, 2024) - TitleBarHeight = (ConfigurationState.Instance.ShowTitleBar ? TitleBar.Height : 0); + TitleBarHeight = (ConfigurationState.Instance.ShowOldUI ? TitleBar.Height : 0); ApplicationList.DataContext = DataContext; ApplicationGrid.DataContext = DataContext; @@ -273,11 +269,7 @@ namespace Ryujinx.Ava.UI.Windows LibHacHorizonManager.InitializeBcatServer(); LibHacHorizonManager.InitializeSystemClients(); - IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks - ? IntegrityCheckLevel.ErrorOnInvalid - : IntegrityCheckLevel.None; - - ApplicationLibrary = new ApplicationLibrary(VirtualFileSystem, checkLevel) + ApplicationLibrary = new ApplicationLibrary(VirtualFileSystem, ConfigurationState.Instance.System.IntegrityCheckLevel) { DesiredLanguage = ConfigurationState.Instance.System.Language, }; diff --git a/src/Ryujinx/UI/Windows/SettingsWindow.axaml b/src/Ryujinx/UI/Windows/SettingsWindow.axaml index 54ca4cbbd..73c1f087a 100644 --- a/src/Ryujinx/UI/Windows/SettingsWindow.axaml +++ b/src/Ryujinx/UI/Windows/SettingsWindow.axaml @@ -11,10 +11,11 @@ xmlns:settings="clr-namespace:Ryujinx.Ava.UI.Views.Settings" xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common" + xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" Width="1100" - Height="927" MinWidth="800" MinHeight="480" + Title="{ext:WindowTitle Settings}" WindowStartupLocation="CenterOwner" x:DataType="viewModels:SettingsViewModel" mc:Ignorable="d" @@ -22,13 +23,20 @@ - + + + + - + @@ -41,12 +49,11 @@ @@ -108,7 +115,7 @@ -