From e673b1954cc4aa73a09bd71904caa680fcd6f729 Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Thu, 9 Jul 2026 12:30:06 +0200 Subject: [PATCH] =?UTF-8?q?v1.0.13=20=E2=80=94=20Section=20=C2=AB=20Argume?= =?UTF-8?q?nts=20de=20lancement=20=C2=BB=20ind=C3=A9pendante=20du=20mode?= =?UTF-8?q?=20auto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feature request : jusqu'à v1.0.12, les CLI args passés à PROSERVE_UE_*.exe n'étaient utilisés QUE dans _config.AutoMode.Args, et seulement pour la version désignée AUTO. Un opérateur qui voulait des flags globaux appliqués à TOUS les lancements manuels (ex : -nosplash, -log, -fps=90) devait soit activer le mode auto sur chaque version manuellement, soit modifier le raccourci Windows (perdu au prochain install). Fix : nouvelle section « Arguments de lancement » dans Settings → Avancés, au-dessus du bloc « Mode auto ». Ces args sont concaténés en PREMIER dans la ligne de commande passée à Unreal ; les args du mode auto s'ajoutent DERRIÈRE quand la version courante est celle marquée AUTO. Sémantique de merge : • Non-auto (comportement neuf) : cliArgs = DefaultLaunchArgs • Auto (comportement étendu) : cliArgs = DefaultLaunchArgs + AutoMode.Args • Doublons de clé : Unreal FParse prend la dernière occurrence — les auto args écrasent silencieusement un default homonyme. Voulu (ex : -fps=90 en default, -fps=120 en auto). Impl : • Model : LocalConfig.DefaultLaunchArgs (List, reuse du type existant). Empty par défaut → rétro-compat total. • MainViewModel.LaunchVersion : composition de argList (default puis auto). • SettingsViewModel : nouvelle ObservableCollection DefaultLaunchArgs + AddDefaultLaunchArgCommand + Save/Load persistence. • SettingsDialog.xaml : nouvelle carte au-dessus d'AutoMode, patron identique (Key + Value + Remove par ligne + bouton Ajouter). • Strings.cs : SettingsLaunchArgs + SettingsLaunchArgsHelp (FR/EN/CN/TH/ AR/ES/DE). Rétro-compat : configs existantes qui n'ont pas le field DefaultLaunchArgs en JSON → deserialize en List vide → cliArgs = null sur launch manuel (= comportement d'avant, identique). Bump : 1.0.12 → 1.0.13 (nouvelle feature UI). Co-Authored-By: Claude Opus 4.7 (1M context) --- installer/PSLauncher.iss | 2 +- src/PSLauncher.App/PSLauncher.App.csproj | 6 +- .../ViewModels/MainViewModel.cs | 17 +++-- .../ViewModels/SettingsViewModel.cs | 29 +++++++++ src/PSLauncher.App/Views/SettingsDialog.xaml | 62 +++++++++++++++++++ src/PSLauncher.Core/Localization/Strings.cs | 20 ++++++ src/PSLauncher.Models/LocalConfig.cs | 11 ++++ 7 files changed, 139 insertions(+), 8 deletions(-) diff --git a/installer/PSLauncher.iss b/installer/PSLauncher.iss index 2ee832d..3bfb45e 100644 --- a/installer/PSLauncher.iss +++ b/installer/PSLauncher.iss @@ -11,7 +11,7 @@ #define MyAppName "PROSERVE Launcher" #define MyAppShortName "PS_Launcher" -#define MyAppVersion "1.0.12" +#define MyAppVersion "1.0.13" #define MyAppPublisher "ASTERION VR" #define MyAppURL "https://asterionvr.com" #define MyAppExeName "PS_Launcher.exe" diff --git a/src/PSLauncher.App/PSLauncher.App.csproj b/src/PSLauncher.App/PSLauncher.App.csproj index c34c715..c016863 100644 --- a/src/PSLauncher.App/PSLauncher.App.csproj +++ b/src/PSLauncher.App/PSLauncher.App.csproj @@ -18,9 +18,9 @@ PROSERVE Launcher © 2026 ASTERION VR — All rights reserved PSLauncher.App - 1.0.12 - 1.0.12.0 - 1.0.12.0 + 1.0.13 + 1.0.13.0 + 1.0.13.0 true diff --git a/src/PSLauncher.App/ViewModels/MainViewModel.cs b/src/PSLauncher.App/ViewModels/MainViewModel.cs index 21e7b50..600c3e8 100644 --- a/src/PSLauncher.App/ViewModels/MainViewModel.cs +++ b/src/PSLauncher.App/ViewModels/MainViewModel.cs @@ -1186,13 +1186,22 @@ public sealed partial class MainViewModel : ObservableObject try { - // Si on lance la version désignée comme "auto", on passe les CLI args - // configurés (ex: -autoconnect -login=Jerome2 -password=… -ipserver=10.0.4.100). - // Pour les lancements manuels d'autres versions, args = null (comportement standard). + // Composition des CLI args passés à PROSERVE_UE_*.exe : + // 1. _config.DefaultLaunchArgs — appliqués à CHAQUE lancement (auto ou manuel). + // Contenu type : -nosplash, -log, -fps=90. + // 2. _config.AutoMode.Args — appliqués UNIQUEMENT si la version lancée est la + // version auto désignée. Contenu type : -autoconnect, -login=Jerome, + // -password=…, -ipserver=10.0.4.100. + // Concaténation dans cet ordre → Unreal FParse lit dans l'ordre, la dernière + // occurrence d'une clé gagne : les auto args écrasent les default args sur un + // même key (comportement intentionnel : un opérateur peut avoir -fps=90 en + // default et -fps=120 en auto sans conflit). var isAutoVersion = _config.AutoMode.FeatureEnabled && !string.IsNullOrEmpty(_config.AutoMode.SelectedVersion) && string.Equals(_config.AutoMode.SelectedVersion, row.Version, StringComparison.Ordinal); - string[]? cliArgs = isAutoVersion ? BuildAutoModeCliArgs(_config.AutoMode.Args) : null; + var argList = new List(_config.DefaultLaunchArgs); + if (isAutoVersion) argList.AddRange(_config.AutoMode.Args); + string[]? cliArgs = argList.Count > 0 ? BuildAutoModeCliArgs(argList) : null; var proc = _processLauncher.Launch(row.Installed, cliArgs); _runningProserve = proc; diff --git a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs index d33a18a..dbff4f5 100644 --- a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs +++ b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs @@ -129,6 +129,10 @@ public sealed partial class SettingsViewModel : ObservableObject public System.Collections.ObjectModel.ObservableCollection LanDiscoveredPeers { get; } = new(); public bool HasLanDiscoveredPeers => LanDiscoveredPeers.Count > 0; + // ----- Args par défaut (chaque lancement) ----- + /// Args édités dans la UI. Persiste vers _config.DefaultLaunchArgs au Save. + public System.Collections.ObjectModel.ObservableCollection DefaultLaunchArgs { get; } = new(); + // ----- Mode auto ----- [ObservableProperty] private bool _autoModeFeatureEnabled; [ObservableProperty] private int _autoModeGraceSeconds; @@ -276,6 +280,9 @@ public sealed partial class SettingsViewModel : ObservableObject Environment.NewLine, config.SteamVr.ProcessesToKill ?? new List()); + foreach (var a in config.DefaultLaunchArgs ?? new List()) + DefaultLaunchArgs.Add(new AutoModeArgRowViewModel(a.Key, a.Value, RemoveDefaultLaunchArg)); + _autoModeFeatureEnabled = config.AutoMode.FeatureEnabled; _autoModeGraceSeconds = config.AutoMode.GracePeriodSeconds; _autoModeSelectedVersion = config.AutoMode.SelectedVersion ?? string.Empty; @@ -465,6 +472,15 @@ public sealed partial class SettingsViewModel : ObservableObject .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); + _config.DefaultLaunchArgs = DefaultLaunchArgs + .Select(r => new AutoModeArg + { + Key = (r.Key ?? string.Empty).Trim(), + Value = string.IsNullOrEmpty(r.Value) ? null : r.Value.Trim(), + }) + .Where(a => !string.IsNullOrWhiteSpace(a.Key)) + .ToList(); + _config.AutoMode.FeatureEnabled = AutoModeFeatureEnabled; _config.AutoMode.GracePeriodSeconds = Math.Clamp(AutoModeGraceSeconds, 1, 60); _config.AutoMode.SelectedVersion = string.IsNullOrWhiteSpace(AutoModeSelectedVersion) @@ -1057,6 +1073,19 @@ public sealed partial class SettingsViewModel : ObservableObject } } + // ===================== DEFAULT LAUNCH ARGS ===================== + + [RelayCommand] + private void AddDefaultLaunchArg() + { + DefaultLaunchArgs.Add(new AutoModeArgRowViewModel(string.Empty, null, RemoveDefaultLaunchArg)); + } + + private void RemoveDefaultLaunchArg(AutoModeArgRowViewModel row) + { + DefaultLaunchArgs.Remove(row); + } + // ===================== AUTO MODE ARGS ===================== [RelayCommand] diff --git a/src/PSLauncher.App/Views/SettingsDialog.xaml b/src/PSLauncher.App/Views/SettingsDialog.xaml index 20c4b85..6ca18a3 100644 --- a/src/PSLauncher.App/Views/SettingsDialog.xaml +++ b/src/PSLauncher.App/Views/SettingsDialog.xaml @@ -696,6 +696,68 @@ + + + + + + + + + + + + + + + + + + +