From 66026934775c696c75bcf92b6e9771b7412f5ff2 Mon Sep 17 00:00:00 2001 From: Goodfeat Date: Sun, 30 Mar 2025 22:29:57 -0500 Subject: [PATCH] feature: add the ability to skip profile select dialog when opening games that use it the skip behavior is done by passing the user id of the profile you have selected in Options > Manage User Profiles. See merge request ryubing/ryujinx!9 --- assets/locales.json | 50 +++++++++++++++++++ src/Ryujinx/Headless/Options.cs | 8 ++- .../Configuration/ConfigurationFileFormat.cs | 7 ++- .../ConfigurationState.Migration.cs | 4 +- .../Configuration/ConfigurationState.Model.cs | 7 +++ .../Configuration/ConfigurationState.cs | 2 + .../UI/Applet/ProfileSelectorDialog.axaml.cs | 8 +++ .../UI/ViewModels/SettingsViewModel.cs | 3 ++ .../Views/Settings/SettingsSystemView.axaml | 5 ++ 9 files changed, 91 insertions(+), 3 deletions(-) diff --git a/assets/locales.json b/assets/locales.json index 09266439c..a7e605ebb 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -5372,6 +5372,31 @@ "zh_TW": "忽略控制器小程式" } }, + { + "ID": "SettingsTabSystemSkipUserProfilesManager", + "Translations": { + "ar_SA": "تخطي مربع حوار 'إدارة الملفات الشخصية للمستخدم'", + "de_DE": "Überspringen des Dialogs 'Benutzerprofile verwalten'", + "el_GR": "Παράκαμψη διαλόγου 'Διαχείριση Προφίλ _Χρηστών'", + "en_US": "Skip dialog 'Manage User Profiles'", + "es_ES": "Omitir el diálogo 'Gestionar perfiles de usuario'", + "fr_FR": "Ignorer le dialogue 'Gérer les profils d'utilisateurs'", + "he_IL": "דילוג על הדיאלוג 'נהל פרופילי משתמש'", + "it_IT": "Salta la finestra di dialogo 'Gestisci i profili utente'", + "ja_JP": "「ユーザプロファイルを管理」ダイアログをスキップ", + "ko_KR": "'사용자 프로필 관리' 대화 상자 건너뛰기", + "no_NO": "Hopp over dialogen 'Administrere Brukerprofiler'", + "pl_PL": "Pomiń okno dialogowe 'Zarządzaj profilami użytkowników'", + "pt_BR": "Ignorar a caixa de diálogo 'Gerenciar Perfis de Usuário'", + "ru_RU": "Пропустить диалог 'Менеджер учётных записей'", + "sv_SE": "Hoppa över dialogen 'Hantera användarprofiler'", + "th_TH": "ข้ามหน้าต่างโต้ตอบ 'จัดการโปรไฟล์ผู้ใช้งาน'", + "tr_TR": "'Kullanıcı Profillerini Yönet' iletişim kutusunu atla", + "uk_UA": "Пропустити діалог 'Керувати профілями користувачів'", + "zh_CN": "跳过对话框“管理用户账户”", + "zh_TW": "略過對話框「管理使用者設定檔」" + } + }, { "ID": "SettingsTabGraphics", "Translations": { @@ -16772,6 +16797,31 @@ "zh_TW": "在模擬應用程式時如果遊戲手柄中斷連線則不會顯示控制器小程式。\n\n如果不確定,請保持關閉狀態。" } }, + { + "ID": "SkipUserProfilesTooltip", + "Translations": { + "ar_SA": "", + "de_DE": "Diese Option überspringt den Dialog 'Benutzerprofile verwalten' während des Spiels und verwendet ein voreingestelltes Profil.\n\nDie Profilumschaltung finden Sie unter 'Einstellungen' - 'Benutzerprofile verwalten'. Wählen Sie das gewünschte Profil aus, bevor Sie das Spiel laden.", + "el_GR": "Αυτή η επιλογή παρακάμπτει το παράθυρο διαλόγου 'Διαχειριστής Προφίλ Χρήστη' κατά τη διάρκεια του παιχνιδιού, χρησιμοποιώντας ένα προεπιλεγμένο προφίλ.\n\nΗ εναλλαγή προφίλ βρίσκεται στις 'Ρυθμίσεις' - 'Διαχειριστής Προφίλ Χρήστη'. Επιλέξτε το επιθυμητό προφίλ πριν φορτώσετε το παιχνίδι.", + "en_US": "This option skips the 'Manage User Profiles' dialog during gameplay, using a pre-selected profile.\n\nProfile switching is found in 'Settings' - 'Manager User Profiles'. Select the desired profile before loading the game.", + "es_ES": "Esta opción omite el diálogo de 'Gestionar perfiles de usuario' durante el juego, utilizando un perfil preseleccionado.\n\nEl cambio de perfil se encuentra en 'Configuración' - 'Gestionar perfiles de usuario'. Seleccione el perfil deseado antes de cargar el juego.", + "fr_FR": "Cette option permet d'éviter le dialogue du 'Gérer les profils d'utilisateurs' pendant le jeu, en utilisant un profil pré-sélectionné.\n\nLa sélection du profil se trouve dans 'Paramètres' - 'Gérer les profils d'utilisateurs'. Sélectionnez le profil souhaité avant de charger la partie.", + "he_IL": "", + "it_IT": "Questa opzione salta la finestra di dialogo 'Gestisci i profili utente' durante il gioco, utilizzando un profilo pre-selezionato.\n\nIl cambio del profilo si trova in 'Impostazioni' - 'Gestisci i profili utente'. Seleziona il profilo desiderato prima di caricare il gioco.", + "ja_JP": "このオプションは、ゲームプレイ中に「ユーザプロファイルを管理」ダイアログをスキップし、事前に選択されたプロファイルを使用します。\n\nプロファイルの切り替えは、「設定」-「ユーザプロファイルを管理」で見つけることができます。ゲームのロード前に目的のプロファイルをを選択してください。", + "ko_KR": "이 옵션은 게임 플레이 중 '사용자 프로필 관리' 대화 상자를 건너뛰고, 미리 선택된 프로필을 사용합니다.\n\n프로필 전환은 '설정' - '사용자 프로필 관리'에서 찾을 수 있습니다. 게임 로드 전에 원하는 프로필을 선택하세요.", + "no_NO": "Dette alternativet hopper over dialogen 'Administrere Brukerprofiler' under spilling, og bruker en forhåndsvalgt profil.\n\nProfilbytte finnes i 'Innstillinger' - 'Administrer Brukerprofiler'. Velg ønsket profil før du laster spillet.", + "pl_PL": "Ta opcja pomija okno dialogowe 'Zarządzaj profilami użytkowników' podczas gry, używając wcześniej wybrany profil.\n\nPrzełączanie profili można znaleźć w 'Ustawienia' - 'Zarządzaj Profilami Użytkowników'. Wybierz żądany profil przed załadowaniem gry.", + "pt_BR": "Esta opção ignora a caixa de diálogo 'Gerenciar Perfis de Usuário' durante o jogo, usando um perfil pré-selecionado.\n\nO gerenciamento de perfis pode ser encontrado em 'Configurações' - 'Gerenciar Perfis de Usuários'. Selecione o perfil desejado antes de carregar o jogo.", + "ru_RU": "Эта опция пропускает диалоговое окно 'Менеджер учётных записей' во время игры, используя предварительно выбранный профиль.\n\nПереключение профилей можно найти в 'Параметры' - 'Менеджер учётных записей'. Выберите желаемый профиль перед загрузкой игры.", + "sv_SE": "Det här alternativet hoppar över dialogrutan 'Hantera användarprofiler' under spelet och använder en förvald profil.\n\nProfilväxling finns i 'Inställningar' - 'Hantera användarprofiler'. Välj önskad profil innan du laddar spelet.", + "th_TH": "ตัวเลือกนี้จะข้ามหน้าต่าง 'จัดการโปรไฟล์ผู้ใช้งาน' ระหว่างเล่นเกม โดยใช้โปรไฟล์ที่เลือกไว้ล่วงหน้า\n\nการสลับโปรไฟล์สามารถพบได้ใน 'ตั้งค่า' - 'จัดการโปรไฟล์ผู้ใช้งาน' เลือกโปรไฟล์ที่คุณต้องการก่อนโหลดเกม", + "tr_TR": "Bu seçenek, oyun sırasında 'Kullanıcı Profillerini Yönet' iletişim kutusunu atlar ve önceden seçilmiş bir profil kullanır.\n\nProfil değiştirme 'Seçenekler' - 'Kullanıcı Profillerini Yönet' bölümünde bulunur. Oyunu yüklemeden önce istediğiniz profili seçin.", + "uk_UA": "Ця опція пропускає діалогове вікно 'Керувати профілями користувачів' під час гри, використовуючи попередньо вибраний профіль.\n\nПеремикання профілів можна знайти в 'Налаштування' - 'Керувати профілями користувачів'. Виберіть потрібний профіль перед завантаженням гри.", + "zh_CN": "此选项跳过游戏过程中的“管理用户账户”对话框,使用预选的配置。\n\n可以在“设置” - “管理用户账户”中找到配置文件切换。 在加载游戏之前选择所需的配置文件。", + "zh_TW": "這個選項跳過遊戲過程中的「管理使用者設定檔」對話框,使用預先選取的設定。\n\n可以在「設定」-「管理使用者設定檔」中找到設定檔切換。 在載入遊戲前選擇您需要的設定檔。" + } + }, { "ID": "GraphicsBackendThreadingTooltip", "Translations": { diff --git a/src/Ryujinx/Headless/Options.cs b/src/Ryujinx/Headless/Options.cs index 8305cd311..27df69e5b 100644 --- a/src/Ryujinx/Headless/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -150,7 +150,10 @@ namespace Ryujinx.Headless if (NeedsOverride(nameof(IgnoreControllerApplet))) IgnoreControllerApplet = configurationState.System.IgnoreControllerApplet; - + + if (NeedsOverride(nameof(SkipUserProfilesManager))) + SkipUserProfilesManager = configurationState.System.SkipUserProfilesManager; + return; bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey))); @@ -414,6 +417,9 @@ namespace Ryujinx.Headless [Option("ignore-controller-applet", Required = false, Default = false, HelpText = "Enable ignoring the controller applet when your game loses connection to your controller.")] public bool IgnoreControllerApplet { get; set; } + [Option("skip-user-profiles-manager", Required = false, Default = false, HelpText = "Enable skips the Profiles Manager popup during gameplay. Select the desired profile before starting the game")] + public bool SkipUserProfilesManager { get; set; } + // Values [Value(0, MetaName = "input", HelpText = "Input to load.", Required = true)] diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs index 470749674..c5bbe3da8 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs @@ -15,7 +15,7 @@ namespace Ryujinx.Ava.Systems.Configuration /// /// The current version of the file format /// - public const int CurrentVersion = 68; + public const int CurrentVersion = 69; /// /// Version of the configuration file format @@ -187,6 +187,11 @@ namespace Ryujinx.Ava.Systems.Configuration /// public bool IgnoreApplet { get; set; } + /// + /// Skip user profiles manager dialog during gameplay(the used profile in the configuration will be selected) + /// + public bool SkipUserProfiles { get; set; } + /// /// Enables or disables save window size, position and state on close. /// diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs index 20c4c6414..f7bc22913 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs @@ -103,6 +103,7 @@ namespace Ryujinx.Ava.Systems.Configuration System.DramSize.Value = cff.DramSize; System.IgnoreMissingServices.Value = cff.IgnoreMissingServices; System.IgnoreControllerApplet.Value = cff.IgnoreApplet; + System.SkipUserProfilesManager.Value = cff.SkipUserProfiles; System.UseHypervisor.Value = cff.UseHypervisor; UI.GuiColumns.FavColumn.Value = shouldLoadFromFile ? cff.GuiColumns.FavColumn : UI.GuiColumns.FavColumn.Value; @@ -459,7 +460,8 @@ namespace Ryujinx.Ava.Systems.Configuration TurboMode = Key.Unbound, TurboModeWhileHeld = false }; - }) + }), + (69, static cff => cff.SkipUserProfiles = false) ); } } diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs index 205054474..3c5fac1cb 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs @@ -395,6 +395,11 @@ namespace Ryujinx.Ava.Systems.Configuration /// public ReactiveObject IgnoreControllerApplet { get; private set; } + /// + /// Skip User Profiles Manager + /// + public ReactiveObject SkipUserProfilesManager { get; private set; } + /// /// Uses Hypervisor over JIT if available /// @@ -445,6 +450,8 @@ namespace Ryujinx.Ava.Systems.Configuration IgnoreMissingServices.LogChangesToValue(nameof(IgnoreMissingServices)); IgnoreControllerApplet = new ReactiveObject(); IgnoreControllerApplet.LogChangesToValue(nameof(IgnoreControllerApplet)); + SkipUserProfilesManager = new ReactiveObject(); + SkipUserProfilesManager.LogChangesToValue(nameof(SkipUserProfilesManager)); AudioVolume = new ReactiveObject(); AudioVolume.LogChangesToValue(nameof(AudioVolume)); UseHypervisor = new ReactiveObject(); diff --git a/src/Ryujinx/Systems/Configuration/ConfigurationState.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs index 65e8e02ce..39b14244c 100644 --- a/src/Ryujinx/Systems/Configuration/ConfigurationState.cs +++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs @@ -82,6 +82,7 @@ namespace Ryujinx.Ava.Systems.Configuration DramSize = System.DramSize, IgnoreMissingServices = System.IgnoreMissingServices, IgnoreApplet = System.IgnoreControllerApplet, + SkipUserProfiles = System.SkipUserProfilesManager, UseHypervisor = System.UseHypervisor, GuiColumns = new GuiColumns { @@ -206,6 +207,7 @@ namespace Ryujinx.Ava.Systems.Configuration System.DramSize.Value = MemoryConfiguration.MemoryConfiguration4GiB; System.IgnoreMissingServices.Value = false; System.IgnoreControllerApplet.Value = false; + System.SkipUserProfilesManager.Value = false; System.UseHypervisor.Value = true; Multiplayer.LanInterfaceId.Value = "0"; Multiplayer.Mode.Value = MultiplayerMode.Disabled; diff --git a/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs index babd8e5ee..606a865a1 100644 --- a/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs +++ b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml.cs @@ -3,6 +3,7 @@ using Avalonia.Controls; using Avalonia.Input; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; @@ -78,6 +79,13 @@ namespace Ryujinx.Ava.UI.Applet public static async Task<(UserId Id, bool Result)> ShowInputDialog(ProfileSelectorDialogViewModel viewModel) { + + if (ConfigurationState.Instance.System.SkipUserProfilesManager) + { + UserId defaultId = viewModel.SelectedUserId; + return (defaultId, true); + } + ContentDialog contentDialog = new() { Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle], diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 0be6ab3fe..9b540088b 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -133,6 +133,7 @@ namespace Ryujinx.Ava.UI.ViewModels public bool EnableDiscordIntegration { get; set; } public bool ShowConfirmExit { get; set; } public bool IgnoreApplet { get; set; } + public bool SkipUserProfiles { get; set; } public bool RememberWindowState { get; set; } public bool ShowOldUI { get; set; } public int HideCursor { get; set; } @@ -606,6 +607,7 @@ namespace Ryujinx.Ava.UI.ViewModels DramSize = config.System.DramSize; IgnoreMissingServices = config.System.IgnoreMissingServices; IgnoreApplet = config.System.IgnoreControllerApplet; + SkipUserProfiles = config.System.SkipUserProfilesManager; // CPU EnablePptc = config.System.EnablePtc; @@ -709,6 +711,7 @@ namespace Ryujinx.Ava.UI.ViewModels config.System.DramSize.Value = DramSize; config.System.IgnoreMissingServices.Value = IgnoreMissingServices; config.System.IgnoreControllerApplet.Value = IgnoreApplet; + config.System.SkipUserProfilesManager.Value = SkipUserProfiles; // CPU config.System.EnablePtc.Value = EnablePptc; diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml index a52fe5fbe..dbe4433dd 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml @@ -328,6 +328,11 @@ ToolTip.Tip="{ext:Locale SettingsTabSystemEnableCustomVSyncIntervalTooltip}"> + + +