Compare commits

..

8 Commits

Author SHA1 Message Date
2dc9c98d1e Bump version 0.7.0 / 0.5.0 → 0.8.0 (synced across launcher, updater, installer)
After the auto-update test loop the App was at 0.7.0 and Updater /
Inno Setup were still at 0.5.0. Sync everything to 0.8.0 so a single
version covers the recent batch of branding + UX changes:

- Default installRoot is C:\ASTERION_VR
- ASTERION favicon (window icons + .exe icon + Setup icon)
- ASTERION wordmark left of PROSERVE in the top bar
- Centered, readable "© 2026 ASTERION VR — Tous droits réservés" pill
- Window control hover in blue (was unreadable yellow)
- Background image anchored bottom-right so the brand mark doesn't
  get cropped on resize or hidden by the download footer
- Launcher window minimizes when a Proserve version is launched

Next time the operator pushes a release, "Définir" 0.8.0 in the
backoffice → upload PSLauncher-0.8.0.exe → click the blue Sync.
Existing 0.7.0 launchers will then auto-update to 0.8.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 12:01:55 +02:00
89f039e355 UI: ASTERION logo left of PROSERVE wordmark + minimize on launch
Brand mark
----------
Resources/logo-asterion-white.png embedded as a WPF Resource. Placed
in the top-bar StackPanel before the PROSERVE Pirulen wordmark, at
36px height, with HighQuality bitmap scaling and SnapsToDevicePixels
to keep the white logo crisp against the dark chrome.

Minimize on launch
------------------
Once a Proserve version is started via _processLauncher.Launch(),
the MainWindow drops to WindowState.Minimized so it doesn't sit on
top of the game. The launcher stays running (so the user can come
back to install / switch / see the badge license), just out of the way.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:59:03 +02:00
661c464b7a Background: anchor logo to bottom-right, never overlap the footer
Two related issues with the background bitmap:

1. The footer (download progress bar) appeared on top of the image,
   cropping the bottom strip — including the ASTERION VR mark in the
   bottom-right corner of Background.png.

2. UniformToFill scales-and-crops to maintain aspect ratio, but with
   the previous setup the crop was centered, so resizing the window
   wider/narrower silently pushed the bottom-right logo off-screen.

Fix:
- The bitmap now lives in a Rectangle restricted to Grid.Row="1"
  (body only). When the footer appears at Row 2, it sits below the
  body without overlapping the image.
- Switch from <Image Stretch="UniformToFill"> to
  <Rectangle><Fill><ImageBrush AlignmentX="Right" AlignmentY="Bottom"
  Stretch="UniformToFill" /></Fill></Rectangle>. The crop now
  happens on the LEFT and TOP edges, keeping the logo's corner pinned
  to the bottom-right and visible regardless of window proportions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:54:20 +02:00
c27066ffe4 Theme: window control buttons hover in blue, not yellow-white
The min/max button hover was set to #FFFFFF22, intended as "white at
13% alpha". WPF Color literals are AARRGGBB though, not RRGGBBAA, so
that's actually opaque red+green+a-touch-of-blue → yellow-ish white,
unreadable on the dark chrome.

Switch to Brush.Accent (#3B82F6) on hover with white foreground,
matching the close button red on hover (#E81123) — both controls now
have clear, distinct hover states.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:50:59 +02:00
3c31d1ea8a Copyright: center the floating pill at the bottom of the body 2026-05-02 11:49:55 +02:00
8ebde15535 Copyright: readable pill with proper "© 2026 ASTERION VR — All rights reserved"
The previous copyright was a faded TextBlock at Opacity 0.7 with the
secondary grey color, sitting directly on top of the variable-
luminance background image. Hard to read on the bright spots of the
ASTERION VR engraving.

Wrap it in a Border with #A0000000 background (~63% opacity black)
and CornerRadius=10 — same pill style as the license badge — so the
text reads cleanly regardless of what's behind. Foreground is now
plain white instead of the secondary grey.

Text changed from the terse "© ASTERION VR" to the proper convention:
- UI: "© 2026 ASTERION VR — Tous droits réservés" (matches the
  French-language UI in MainWindow + Settings)
- Assembly metadata (Properties → Détails on the .exe): English form
  "© 2026 ASTERION VR — All rights reserved"

Same change applied to PSLauncher.Updater.csproj.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:48:25 +02:00
dfad967eae branding: ASTERION VR favicon + copyright everywhere
Icon
----
src/favicon64.jpg converted to favicon.ico (single-resolution 64x64)
via PowerShell + System.Drawing.Icon.FromHandle. The .ico is now an
EmbeddedResource of PSLauncher.App and referenced as:
- <ApplicationIcon> on PSLauncher.App.csproj → .exe icon in
  Explorer / taskbar / Alt-Tab
- Window.Icon on every WPF window: MainWindow, SettingsDialog,
  OnboardingDialog, LicenseDetailsDialog, UpdateAvailableDialog,
  ReleaseNotesViewerDialog, LauncherUpdateDialog
- <ApplicationIcon> on PSLauncher.Updater.csproj → updater also
  carries the brand icon
- SetupIconFile in installer/PSLauncher.iss → the Inno Setup .exe
  installer shows the icon too

Copyright
---------
- <Company>, <Product>, <Copyright> assembly attributes set in
  both csprojs → properties dialog on the .exe shows "© ASTERION VR".
- MainWindow body has a discreet floating "© ASTERION VR" text in the
  bottom-right, mirroring the "Vérifier les MAJ" button on the left.
  Opacity 0.7 + secondary color so it doesn't compete with the cards.
- SettingsDialog "Logs & Application" section gains a
  "© ASTERION VR — Tous droits réservés" line under the version.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:44:28 +02:00
3484c23683 ConfigStore: default installRoot to C:\ASTERION_VR for client installs
Previous default fell back to %UserProfile%\ASTERION_VR which is
fine for dev but unconventional for end users; the standard
deployment path is plainly C:\ASTERION_VR. New first-launch behavior:

1. If a sibling ASTERION_VR exists next to the exe (portable / dev
   layout), prefer it — keeps the development workflow intact.
2. Otherwise, default to C:\ASTERION_VR. The folder is created on
   the first install (Directory.CreateDirectory in ZipInstaller
   handles non-existent parents).

Existing users with an explicit installRoot in their config.json are
unaffected — only fresh configs (or empty installRoot) hit this path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 11:38:07 +02:00
18 changed files with 75 additions and 24 deletions

View File

@@ -11,7 +11,7 @@
#define MyAppName "PROSERVE Launcher" #define MyAppName "PROSERVE Launcher"
#define MyAppShortName "PSLauncher" #define MyAppShortName "PSLauncher"
#define MyAppVersion "0.5.0" #define MyAppVersion "0.8.0"
#define MyAppPublisher "ASTERION VR" #define MyAppPublisher "ASTERION VR"
#define MyAppURL "https://asterionvr.com" #define MyAppURL "https://asterionvr.com"
#define MyAppExeName "PSLauncher.exe" #define MyAppExeName "PSLauncher.exe"
@@ -35,7 +35,7 @@ DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes DisableProgramGroupPage=yes
OutputDir=output OutputDir=output
OutputBaseFilename=PSLauncher-Setup-{#MyAppVersion} OutputBaseFilename=PSLauncher-Setup-{#MyAppVersion}
SetupIconFile= SetupIconFile=..\src\PSLauncher.App\Resources\favicon.ico
Compression=lzma2/ultra Compression=lzma2/ultra
SolidCompression=yes SolidCompression=yes
WizardStyle=modern WizardStyle=modern

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -9,12 +9,15 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<ApplicationIcon></ApplicationIcon> <ApplicationIcon>Resources\favicon.ico</ApplicationIcon>
<AssemblyName>PSLauncher</AssemblyName> <AssemblyName>PSLauncher</AssemblyName>
<Company>ASTERION VR</Company>
<Product>PROSERVE Launcher</Product>
<Copyright>© 2026 ASTERION VR — All rights reserved</Copyright>
<RootNamespace>PSLauncher.App</RootNamespace> <RootNamespace>PSLauncher.App</RootNamespace>
<Version>0.7.0</Version> <Version>0.8.0</Version>
<AssemblyVersion>0.7.0.0</AssemblyVersion> <AssemblyVersion>0.8.0.0</AssemblyVersion>
<FileVersion>0.7.0.0</FileVersion> <FileVersion>0.8.0.0</FileVersion>
<!-- Single-file self-contained publish profile (used by `dotnet publish`) --> <!-- Single-file self-contained publish profile (used by `dotnet publish`) -->
<PublishSingleFile>true</PublishSingleFile> <PublishSingleFile>true</PublishSingleFile>
@@ -47,6 +50,8 @@
<ItemGroup> <ItemGroup>
<Resource Include="Resources\Background.png" /> <Resource Include="Resources\Background.png" />
<Resource Include="Resources\pirulen.otf" /> <Resource Include="Resources\pirulen.otf" />
<Resource Include="Resources\favicon.ico" />
<Resource Include="Resources\logo-asterion-white.png" />
</ItemGroup> </ItemGroup>
<!-- Après chaque `dotnet publish -c Release`, copie le single-file exe à la racine du repo <!-- Après chaque `dotnet publish -c Release`, copie le single-file exe à la racine du repo

View File

@@ -154,7 +154,8 @@
</Border> </Border>
<ControlTemplate.Triggers> <ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True"> <Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#FFFFFF22" /> <Setter TargetName="Bd" Property="Background" Value="{StaticResource Brush.Accent}" />
<Setter Property="Foreground" Value="White" />
</Trigger> </Trigger>
</ControlTemplate.Triggers> </ControlTemplate.Triggers>
</ControlTemplate> </ControlTemplate>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -427,6 +427,10 @@ public sealed partial class MainViewModel : ObservableObject
_processLauncher.Launch(row.Installed); _processLauncher.Launch(row.Installed);
_config.LastLaunchedVersion = row.Version; _config.LastLaunchedVersion = row.Version;
_configStore.Save(_config); _configStore.Save(_config);
// Réduit la fenêtre du launcher pour ne pas gêner Proserve qui démarre
if (Application.Current.MainWindow is { } mw)
mw.WindowState = WindowState.Minimized;
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -2,6 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Mise à jour du launcher" Title="Mise à jour du launcher"
Icon="pack://application:,,,/Resources/favicon.ico"
Width="500" Height="320" Width="500" Height="320"
ResizeMode="NoResize" ResizeMode="NoResize"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"

View File

@@ -2,6 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="License" Title="License"
Icon="pack://application:,,,/Resources/favicon.ico"
Width="500" Height="480" Width="500" Height="480"
ResizeMode="NoResize" ResizeMode="NoResize"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"

View File

@@ -4,6 +4,7 @@
xmlns:vm="clr-namespace:PSLauncher.App.ViewModels" xmlns:vm="clr-namespace:PSLauncher.App.ViewModels"
xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework" xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"
Title="PROSERVE Launcher" Title="PROSERVE Launcher"
Icon="pack://application:,,,/Resources/favicon.ico"
Background="Black" Background="Black"
Width="1280" Height="720" Width="1280" Height="720"
MinWidth="980" MinHeight="600" MinWidth="980" MinHeight="600"
@@ -165,15 +166,20 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- Background image (sous tout le reste, ne capte pas la souris). <!-- Background image : limité au body uniquement (Grid.Row="1") pour ne pas
Le fond noir du Grid garantit que les zones transparentes de l'image se faire chevaucher par le footer quand un download tourne. ImageBrush
(et l'image dans son ensemble à faible opacity) reposent sur du noir avec AlignmentX=Right + AlignmentY=Bottom : si le ratio fenêtre force
pur, sans héritage du brush système. --> un crop, on rogne en haut/à gauche — le logo ASTERION VR en bas-droite
<Image Grid.Row="0" Grid.RowSpan="3" reste TOUJOURS visible. -->
Source="pack://application:,,,/Resources/Background.png" <Rectangle Grid.Row="1" IsHitTestVisible="False">
Stretch="UniformToFill" <Rectangle.Fill>
Opacity="0.25" <ImageBrush ImageSource="pack://application:,,,/Resources/Background.png"
IsHitTestVisible="False" /> Stretch="UniformToFill"
AlignmentX="Right"
AlignmentY="Bottom"
Opacity="0.25" />
</Rectangle.Fill>
</Rectangle>
<!-- Top bar : 3 colonnes (brand / license center / chrome) --> <!-- Top bar : 3 colonnes (brand / license center / chrome) -->
<Border Grid.Row="0" Background="{StaticResource Brush.Bg.Sidebar}" <Border Grid.Row="0" Background="{StaticResource Brush.Bg.Sidebar}"
@@ -187,6 +193,12 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<!-- Col 1 : brand --> <!-- Col 1 : brand -->
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center"> <StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<Image Source="pack://application:,,,/Resources/logo-asterion-white.png"
Height="36"
VerticalAlignment="Center"
Margin="0,0,14,0"
SnapsToDevicePixels="True"
RenderOptions.BitmapScalingMode="HighQuality" />
<TextBlock Text="PROSERVE" <TextBlock Text="PROSERVE"
FontFamily="{StaticResource Font.Brand}" FontFamily="{StaticResource Font.Brand}"
FontSize="22" FontSize="22"
@@ -494,6 +506,18 @@
Style="{StaticResource SecondaryButton}" Style="{StaticResource SecondaryButton}"
Content="🔄 Vérifier les MAJ" Content="🔄 Vérifier les MAJ"
Command="{Binding CheckForUpdatesCommand}" /> Command="{Binding CheckForUpdatesCommand}" />
<!-- Copyright flottant en bas centré, sur une pill sombre pour rester
lisible quel que soit l'arrière-plan (image, voile noir, etc.). -->
<Border HorizontalAlignment="Center" VerticalAlignment="Bottom"
Margin="0,0,0,28"
Background="#A0000000"
CornerRadius="10"
Padding="10,4">
<TextBlock Text="© 2026 ASTERION VR — Tous droits réservés"
FontSize="11"
Foreground="White" />
</Border>
</Grid> </Grid>
<!-- Footer : visible uniquement quand busy / status à afficher. <!-- Footer : visible uniquement quand busy / status à afficher.

View File

@@ -2,6 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Activation PROSERVE Launcher" Title="Activation PROSERVE Launcher"
Icon="pack://application:,,,/Resources/favicon.ico"
Width="540" Height="420" Width="540" Height="420"
MinWidth="480" MinHeight="380" MinWidth="480" MinHeight="380"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"

View File

@@ -2,6 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Notes de version" Title="Notes de version"
Icon="pack://application:,,,/Resources/favicon.ico"
Width="640" Height="540" Width="640" Height="540"
MinWidth="480" MinHeight="400" MinWidth="480" MinHeight="400"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"

View File

@@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:PSLauncher.App.ViewModels" xmlns:vm="clr-namespace:PSLauncher.App.ViewModels"
Title="Paramètres" Title="Paramètres"
Icon="pack://application:,,,/Resources/favicon.ico"
Width="640" Height="720" Width="640" Height="720"
MinWidth="540" MinHeight="500" MinWidth="540" MinHeight="500"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"
@@ -234,6 +235,10 @@
<Run Text="Version : " /> <Run Text="Version : " />
<Run Text="{Binding LauncherVersion, Mode=OneWay}" FontWeight="SemiBold" /> <Run Text="{Binding LauncherVersion, Mode=OneWay}" FontWeight="SemiBold" />
</TextBlock> </TextBlock>
<TextBlock Text="© 2026 ASTERION VR — Tous droits réservés"
FontSize="12"
Foreground="{StaticResource Brush.Text.Secondary}"
Margin="0,4,0,0" />
<Grid Margin="0,8,0,0"> <Grid Margin="0,8,0,0">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />

View File

@@ -2,6 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Mise à jour disponible" Title="Mise à jour disponible"
Icon="pack://application:,,,/Resources/favicon.ico"
Width="640" Height="540" Width="640" Height="540"
MinWidth="480" MinHeight="400" MinWidth="480" MinHeight="400"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterOwner"

View File

@@ -65,17 +65,21 @@ public sealed class ConfigStore : IConfigStore
File.Move(tmp, _configFile, overwrite: true); File.Move(tmp, _configFile, overwrite: true);
} }
/// <summary>
/// Cible standard pour les déploiements clients : <c>C:\ASTERION_VR</c>.
/// Si un dossier ASTERION_VR existe déjà à côté de l'exe (mode dev / portable),
/// il est préféré pour ne pas casser l'environnement de développement.
/// </summary>
private static string ResolveDefaultInstallRoot() private static string ResolveDefaultInstallRoot()
{ {
// Mode dev / portable : ASTERION_VR à côté de l'exe (par ex. dans le repo)
var exeDir = AppContext.BaseDirectory; var exeDir = AppContext.BaseDirectory;
var sibling = Path.Combine(Path.GetDirectoryName(exeDir.TrimEnd(Path.DirectorySeparatorChar))!, "ASTERION_VR"); var sibling = Path.Combine(
Path.GetDirectoryName(exeDir.TrimEnd(Path.DirectorySeparatorChar))!,
"ASTERION_VR");
if (Directory.Exists(sibling)) return sibling; if (Directory.Exists(sibling)) return sibling;
var dev = @"C:\ASTERION\GIT\PS_Launcher\ASTERION_VR"; // Cible standard pour les clients (créée au premier install si absente)
if (Directory.Exists(dev)) return dev; return @"C:\ASTERION_VR";
return Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
"ASTERION_VR");
} }
} }

View File

@@ -8,7 +8,10 @@
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<AssemblyName>PSLauncher.Updater</AssemblyName> <AssemblyName>PSLauncher.Updater</AssemblyName>
<RootNamespace>PSLauncher.Updater</RootNamespace> <RootNamespace>PSLauncher.Updater</RootNamespace>
<Version>0.5.0</Version> <Version>0.8.0</Version>
<ApplicationIcon>..\PSLauncher.App\Resources\favicon.ico</ApplicationIcon>
<Company>ASTERION VR</Company>
<Copyright>© 2026 ASTERION VR — All rights reserved</Copyright>
<!-- Single-file self-contained pour le publish (~10 Mo) --> <!-- Single-file self-contained pour le publish (~10 Mo) -->
<PublishSingleFile>true</PublishSingleFile> <PublishSingleFile>true</PublishSingleFile>

BIN
src/favicon64.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB