Files
DeployCenter/Modules/ThemeManager.psm1
T
2026-10-15 21:15:33 +02:00

63 lines
3.4 KiB
PowerShell

Set-StrictMode -Version 2.0
function ConvertFrom-ThemeColor {
param([Parameter(Mandatory=$true)][string]$Value)
$hex = $Value.Trim().TrimStart('#')
if ($hex -notmatch '^[0-9A-Fa-f]{6}$') {
throw "Couleur invalide dans un thème : '$Value'. Utiliser #RRGGBB."
}
return [System.Drawing.Color]::FromArgb(
[Convert]::ToInt32($hex.Substring(0,2),16),
[Convert]::ToInt32($hex.Substring(2,2),16),
[Convert]::ToInt32($hex.Substring(4,2),16)
)
}
function Get-DeployCenterThemeNames {
param([Parameter(Mandatory=$true)][string]$ThemesRoot)
$names = @()
foreach ($file in (Get-ChildItem -LiteralPath $ThemesRoot -Filter '*.psd1' -File -ErrorAction SilentlyContinue)) {
if ($file.BaseName -match '^[A-Za-z0-9_-]+$') { $names += $file.BaseName }
}
return @($names | Sort-Object -Unique)
}
function Import-DeployCenterTheme {
param(
[Parameter(Mandatory=$true)][string]$ThemesRoot,
[Parameter(Mandatory=$true)][string]$ThemeName
)
if ($ThemeName -notmatch '^[A-Za-z0-9_-]+$') { throw "Nom de thème invalide : $ThemeName" }
$path = Join-Path $ThemesRoot ($ThemeName + '.psd1')
if (-not (Test-Path -LiteralPath $path -PathType Leaf)) { throw "Thème introuvable : $ThemeName" }
$data = Import-PowerShellDataFile -LiteralPath $path
$required = @('Background','Panel','PanelAlt','Text','Secondary','Accent','Success','Border','Danger')
foreach ($key in $required) {
if (-not $data.ContainsKey($key)) { throw "Le thème '$ThemeName' ne contient pas la clé '$key'." }
}
$theme = @{}
foreach ($key in $required) { $theme[$key] = ConvertFrom-ThemeColor -Value ([string]$data[$key]) }
foreach ($key in @('TableHeader','TableRowEven','TableRowOdd')) {
if ($data.ContainsKey($key)) { $theme[$key] = ConvertFrom-ThemeColor -Value ([string]$data[$key]) }
else { $theme[$key] = $theme.PanelAlt }
}
$buttonDefaults = @{
Button = @{ Background=$theme.PanelAlt; Foreground=$theme.Text; Border=$theme.Border; HoverBackground=$theme.Panel; PressedBackground=$theme.Border; DisabledBackground=$theme.Panel; DisabledForeground=$theme.Secondary }
PrimaryButton = @{ Background=$theme.Accent; Foreground=[System.Drawing.Color]::White; Border=$theme.Accent; HoverBackground=$theme.Accent; PressedBackground=$theme.Accent; DisabledBackground=$theme.PanelAlt; DisabledForeground=$theme.Secondary }
DangerButton = @{ Background=$theme.Danger; Foreground=[System.Drawing.Color]::White; Border=$theme.Danger; HoverBackground=$theme.Danger; PressedBackground=$theme.Danger; DisabledBackground=$theme.PanelAlt; DisabledForeground=$theme.Secondary }
}
foreach ($role in @('Button','PrimaryButton','DangerButton')) {
$theme[$role] = @{}
$provided = $data[$role]
foreach ($property in @('Background','Foreground','Border','HoverBackground','PressedBackground','DisabledBackground','DisabledForeground')) {
$raw = $null
if ($provided -is [System.Collections.IDictionary] -and $provided.Contains($property)) { $raw = [string]$provided[$property] }
if ([string]::IsNullOrWhiteSpace($raw)) { $theme[$role][$property] = $buttonDefaults[$role][$property] }
else { $theme[$role][$property] = ConvertFrom-ThemeColor -Value $raw }
}
}
return $theme
}
Export-ModuleMember -Function ConvertFrom-ThemeColor, Get-DeployCenterThemeNames, Import-DeployCenterTheme