From 53c9e0519c20a6778a1077d93d5e0e19fc95ef37 Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Tue, 7 Jul 2026 17:02:26 +0200 Subject: [PATCH] =?UTF-8?q?v1.0.9=20=E2=80=94=20Badge=20channel=20affich?= =?UTF-8?q?=C3=A9=20uniquement=20en=20cas=20de=20conflit=20de=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feedback UX post-1.0.8 : le badge channel bleu était toujours visible dès qu'une entrée manifest avait un channel non-default. Sur les setups mono-channel (99 % des cas, y compris les clients firefighter/police qui ne voient QUE leur channel + les entries default), ça polluait chaque row avec un badge sans valeur informative — le badge ne sert qu'à distinguer deux rows partageant un numéro de version. Fix : nouveau flag HasVersionConflict sur VersionRowViewModel, positionné par RebuildList après construction (group by Version, count >= 2 → true). HasChannelBadge devient (ChannelBadge non vide AND HasVersionConflict) — badge visible seulement quand une AUTRE row visible partage le même numéro. Résultat : • Client firefighter voit v1.5.4.32 (default) → pas de badge (row unique) • Client firefighter voit v1.5.4.32 (default) + v1.5.4.32 (firefighter) → les DEUX rows affichent leur badge (« default » n'a pas de badge par convention, mais firefighter a le sien → distingue visuellement) • Client dev/opérateur voit tous les channels → badge apparaît sur toute row en conflit Notification via [NotifyPropertyChangedFor(HasChannelBadge)] sur la property auto-générée HasVersionConflict — les bindings XAML se rafraîchissent correctement quand le flag change entre deux RebuildList (ex : upload d'une entrée concurrente côté serveur puis refresh manifest client). Bump : 1.0.8 → 1.0.9 (patch UX). Co-Authored-By: Claude Opus 4.7 (1M context) --- installer/PSLauncher.iss | 2 +- src/PSLauncher.App/PSLauncher.App.csproj | 6 +++--- .../ViewModels/MainViewModel.cs | 9 +++++++++ .../ViewModels/VersionRowViewModel.cs | 19 ++++++++++++++++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/installer/PSLauncher.iss b/installer/PSLauncher.iss index 0d009a1..3a12834 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.8" +#define MyAppVersion "1.0.9" #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 2509a8d..1b1604a 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.8 - 1.0.8.0 - 1.0.8.0 + 1.0.9 + 1.0.9.0 + 1.0.9.0 true diff --git a/src/PSLauncher.App/ViewModels/MainViewModel.cs b/src/PSLauncher.App/ViewModels/MainViewModel.cs index 3ef645f..30874bb 100644 --- a/src/PSLauncher.App/ViewModels/MainViewModel.cs +++ b/src/PSLauncher.App/ViewModels/MainViewModel.cs @@ -657,6 +657,15 @@ public sealed partial class MainViewModel : ObservableObject } } + // Marque les rows qui partagent un numéro de version avec au moins UNE + // autre row visible → active leur badge channel (sinon caché pour ne pas + // polluer l'UI mono-channel). Group by Version, count >= 2 → conflict. + foreach (var grp in rows.GroupBy(r => r.Version, StringComparer.OrdinalIgnoreCase)) + { + bool hasConflict = grp.Count() >= 2; + foreach (var r in grp) r.HasVersionConflict = hasConflict; + } + // Featured : plus haute installée, sinon plus haute distante var featured = rows.FirstOrDefault(r => r.IsInstalled) ?? rows.FirstOrDefault(); FeaturedVersion = featured; diff --git a/src/PSLauncher.App/ViewModels/VersionRowViewModel.cs b/src/PSLauncher.App/ViewModels/VersionRowViewModel.cs index 216b790..1418ae9 100644 --- a/src/PSLauncher.App/ViewModels/VersionRowViewModel.cs +++ b/src/PSLauncher.App/ViewModels/VersionRowViewModel.cs @@ -56,7 +56,24 @@ public sealed partial class VersionRowViewModel : ObservableObject .FirstOrDefault(c => !string.IsNullOrWhiteSpace(c) && !string.Equals(c, "default", StringComparison.OrdinalIgnoreCase)); - public bool HasChannelBadge => !string.IsNullOrEmpty(ChannelBadge); + /// + /// True si au moins une AUTRE row visible sur ce launcher partage le même + /// numéro de version. Positionné par MainViewModel.RebuildList après + /// construction des rows (group by Version, count >= 2 → conflict). + /// Le badge channel n'est utile QUE dans ce cas — sinon la row est + /// univoque et le badge ajoute du bruit visuel. + /// + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(HasChannelBadge))] + private bool _hasVersionConflict; + + /// + /// Le badge n'est visible QUE quand la row a un channel spécifique ET qu'une + /// autre row visible partage le même numéro de version. Ça garde l'UI propre + /// sur les setups mono-channel (99 % des cas) et affiche le distingueur + /// seulement quand il est réellement nécessaire. + /// + public bool HasChannelBadge => !string.IsNullOrEmpty(ChannelBadge) && HasVersionConflict; /// /// True si la version est taggée BÊTA dans le manifest (champ