Refactor: Centralize driver checkbox event handling

Moves the interdependent state logic for the driver-related checkboxes from the main UI script into a new, centralized function within the core module.

This change simplifies the event handling by using a single handler for all related checkboxes, which improves code readability and maintainability. The new function is also called during initialization to ensure the UI reflects the correct state on startup.
This commit is contained in:
rbalsleyMSFT
2025-06-19 15:42:57 -07:00
parent 2cfd947429
commit a4e9b70b27
4 changed files with 108 additions and 94 deletions
-35
View File
@@ -217,41 +217,6 @@ $window.Add_Loaded({
} }
Update-CopyButtonState -State $script:uiState # Initial check Update-CopyButtonState -State $script:uiState # Initial check
# General Browse Button Handlers (Keep existing logic)
# Driver Checkbox Conditional Logic
$script:uiState.Controls.chkInstallDrivers.Add_Checked({
$script:uiState.Controls.chkCopyDrivers.IsEnabled = $false
$script:uiState.Controls.chkCompressDriversToWIM.IsEnabled = $false
})
$script:uiState.Controls.chkInstallDrivers.Add_Unchecked({
# Only re-enable if the other checkboxes are not checked
if (-not $script:uiState.Controls.chkCopyDrivers.IsChecked) {
$script:uiState.Controls.chkCopyDrivers.IsEnabled = $true
}
if (-not $script:uiState.Controls.chkCompressDriversToWIM.IsChecked) {
$script:uiState.Controls.chkCompressDriversToWIM.IsEnabled = $true
}
})
$script:uiState.Controls.chkCopyDrivers.Add_Checked({
$script:uiState.Controls.chkInstallDrivers.IsEnabled = $false
})
$script:uiState.Controls.chkCopyDrivers.Add_Unchecked({
# Only re-enable if InstallDrivers is not checked
if (-not $script:uiState.Controls.chkInstallDrivers.IsChecked) { $script:uiState.Controls.chkInstallDrivers.IsEnabled = $true }
})
$script:uiState.Controls.chkCompressDriversToWIM.Add_Checked({
$script:uiState.Controls.chkInstallDrivers.IsEnabled = $false
})
$script:uiState.Controls.chkCompressDriversToWIM.Add_Unchecked({
# Only re-enable if InstallDrivers is not checked
if (-not $script:uiState.Controls.chkInstallDrivers.IsChecked) { $script:uiState.Controls.chkInstallDrivers.IsEnabled = $true }
})
# Set initial state based on defaults (assuming defaults are false)
$script:uiState.Controls.chkInstallDrivers.IsEnabled = $true
$script:uiState.Controls.chkCopyDrivers.IsEnabled = $true
$script:uiState.Controls.chkCompressDriversToWIM.IsEnabled = $true
# AppsScriptVariables Event Handlers # AppsScriptVariables Event Handlers
$script:uiState.Controls.chkDefineAppsScriptVariables.Add_Checked({ $script:uiState.Controls.chkDefineAppsScriptVariables.Add_Checked({
$script:uiState.Controls.appsScriptVariablesPanel.Visibility = 'Visible' $script:uiState.Controls.appsScriptVariablesPanel.Visibility = 'Visible'
@@ -581,8 +581,25 @@ function Register-EventHandlers {
$localState.Controls.OfficeConfigurationXMLFileStackPanel.Visibility = 'Collapsed' $localState.Controls.OfficeConfigurationXMLFileStackPanel.Visibility = 'Collapsed'
$localState.Controls.OfficeConfigurationXMLFileGrid.Visibility = 'Collapsed' $localState.Controls.OfficeConfigurationXMLFileGrid.Visibility = 'Collapsed'
}) })
# Drivers Tab Event Handlers # Drivers Tab Event Handlers
# Define a single handler for interdependent driver checkboxes
$driverCheckboxHandler = {
param($eventSource, $routedEventArgs)
$window = [System.Windows.Window]::GetWindow($eventSource)
if ($null -ne $window) {
Update-DriverCheckboxStates -State $window.Tag
}
}
# Attach the handler to all relevant checkboxes
$State.Controls.chkInstallDrivers.Add_Checked($driverCheckboxHandler)
$State.Controls.chkInstallDrivers.Add_Unchecked($driverCheckboxHandler)
$State.Controls.chkCopyDrivers.Add_Checked($driverCheckboxHandler)
$State.Controls.chkCopyDrivers.Add_Unchecked($driverCheckboxHandler)
$State.Controls.chkCompressDriversToWIM.Add_Checked($driverCheckboxHandler)
$State.Controls.chkCompressDriversToWIM.Add_Unchecked($driverCheckboxHandler)
$State.Controls.btnBrowseDriversFolder.Add_Click({ $State.Controls.btnBrowseDriversFolder.Add_Click({
param($eventSource, $routedEventArgs) param($eventSource, $routedEventArgs)
$window = [System.Windows.Window]::GetWindow($eventSource) $window = [System.Windows.Window]::GetWindow($eventSource)
@@ -238,7 +238,11 @@ function Initialize-UIDefaults {
$State.Controls.chkInstallDrivers.IsChecked = $State.Defaults.generalDefaults.InstallDrivers $State.Controls.chkInstallDrivers.IsChecked = $State.Defaults.generalDefaults.InstallDrivers
$State.Controls.chkCopyDrivers.IsChecked = $State.Defaults.generalDefaults.CopyDrivers $State.Controls.chkCopyDrivers.IsChecked = $State.Defaults.generalDefaults.CopyDrivers
$State.Controls.chkCopyPEDrivers.IsChecked = $State.Defaults.generalDefaults.CopyPEDrivers $State.Controls.chkCopyPEDrivers.IsChecked = $State.Defaults.generalDefaults.CopyPEDrivers
$State.Controls.chkCompressDriversToWIM.IsChecked = $State.Defaults.generalDefaults.CompressDownloadedDriversToWim
# Set initial state for driver checkbox interplay
Update-DriverCheckboxStates -State $State
# Set initial state for InstallApps checkbox based on updates # Set initial state for InstallApps checkbox based on updates
Update-InstallAppsState -State $State Update-InstallAppsState -State $State
+86 -58
View File
@@ -108,66 +108,67 @@ function Get-GeneralDefaults {
return [PSCustomObject]@{ return [PSCustomObject]@{
# Build Tab Defaults # Build Tab Defaults
CustomFFUNameTemplate = "{WindowsRelease}_{WindowsVersion}_{SKU}_{yyyy}-{MM}-{dd}_{HH}{mm}" CustomFFUNameTemplate = "{WindowsRelease}_{WindowsVersion}_{SKU}_{yyyy}-{MM}-{dd}_{HH}{mm}"
FFUCaptureLocation = $ffuCapturePath FFUCaptureLocation = $ffuCapturePath
ShareName = "FFUCaptureShare" ShareName = "FFUCaptureShare"
Username = "ffu_user" Username = "ffu_user"
BuildUSBDriveEnable = $false BuildUSBDriveEnable = $false
CompactOS = $true CompactOS = $true
Optimize = $true Optimize = $true
AllowVHDXCaching = $false AllowVHDXCaching = $false
CreateCaptureMedia = $true CreateCaptureMedia = $true
CreateDeploymentMedia = $true CreateDeploymentMedia = $true
AllowExternalHardDiskMedia = $false AllowExternalHardDiskMedia = $false
PromptExternalHardDiskMedia = $true PromptExternalHardDiskMedia = $true
SelectSpecificUSBDrives = $false SelectSpecificUSBDrives = $false
CopyAutopilot = $false CopyAutopilot = $false
CopyUnattend = $false CopyUnattend = $false
CopyPPKG = $false CopyPPKG = $false
CleanupAppsISO = $true CleanupAppsISO = $true
CleanupCaptureISO = $true CleanupCaptureISO = $true
CleanupDeployISO = $true CleanupDeployISO = $true
CleanupDrivers = $false CleanupDrivers = $false
RemoveFFU = $false RemoveFFU = $false
RemoveApps = $false RemoveApps = $false
RemoveUpdates = $false RemoveUpdates = $false
# Hyper-V Settings Defaults # Hyper-V Settings Defaults
VMHostIPAddress = "" VMHostIPAddress = ""
DiskSizeGB = 30 DiskSizeGB = 30
MemoryGB = 4 MemoryGB = 4
Processors = 4 Processors = 4
VMLocation = $vmLocationPath VMLocation = $vmLocationPath
VMNamePrefix = "_FFU" VMNamePrefix = "_FFU"
LogicalSectorSize = 512 LogicalSectorSize = 512
# Updates Tab Defaults # Updates Tab Defaults
UpdateLatestCU = $true UpdateLatestCU = $true
UpdateLatestNet = $true UpdateLatestNet = $true
UpdateLatestDefender = $true UpdateLatestDefender = $true
UpdateEdge = $true UpdateEdge = $true
UpdateOneDrive = $true UpdateOneDrive = $true
UpdateLatestMSRT = $true UpdateLatestMSRT = $true
UpdateLatestMicrocode = $false UpdateLatestMicrocode = $false
UpdatePreviewCU = $false UpdatePreviewCU = $false
# Applications Tab Defaults # Applications Tab Defaults
InstallApps = $false InstallApps = $false
ApplicationPath = $appsPath ApplicationPath = $appsPath
AppListJsonPath = $appListJsonPath AppListJsonPath = $appListJsonPath
InstallWingetApps = $false InstallWingetApps = $false
BringYourOwnApps = $false BringYourOwnApps = $false
# M365 Apps/Office Tab Defaults # M365 Apps/Office Tab Defaults
InstallOffice = $true InstallOffice = $true
OfficePath = $officePath OfficePath = $officePath
CopyOfficeConfigXML = $false CopyOfficeConfigXML = $false
OfficeConfigXMLFilePath = "" OfficeConfigXMLFilePath = ""
# Drivers Tab Defaults # Drivers Tab Defaults
DriversFolder = $driversPath DriversFolder = $driversPath
PEDriversFolder = $peDriversPath PEDriversFolder = $peDriversPath
DriversJsonPath = $driversJsonPath DriversJsonPath = $driversJsonPath
DownloadDrivers = $false DownloadDrivers = $false
InstallDrivers = $false InstallDrivers = $false
CopyDrivers = $false CopyDrivers = $false
CopyPEDrivers = $false CopyPEDrivers = $false
UpdateADK = $true UpdateADK = $true
CompressDownloadedDriversToWim = $false
} }
} }
@@ -197,9 +198,9 @@ function Update-InstallAppsState {
# Determine if any checkbox that forces "Install Apps" is checked # Determine if any checkbox that forces "Install Apps" is checked
$anyUpdateChecked = $State.Controls.chkUpdateLatestDefender.IsChecked -or ` $anyUpdateChecked = $State.Controls.chkUpdateLatestDefender.IsChecked -or `
$State.Controls.chkUpdateEdge.IsChecked -or ` $State.Controls.chkUpdateEdge.IsChecked -or `
$State.Controls.chkUpdateOneDrive.IsChecked -or ` $State.Controls.chkUpdateOneDrive.IsChecked -or `
$State.Controls.chkUpdateLatestMSRT.IsChecked $State.Controls.chkUpdateLatestMSRT.IsChecked
$isForced = $anyUpdateChecked -or $installOfficeChk.IsChecked $isForced = $anyUpdateChecked -or $installOfficeChk.IsChecked
@@ -225,6 +226,33 @@ function Update-InstallAppsState {
} }
} }
# Function to manage the enabled state of interdependent driver-related checkboxes
function Update-DriverCheckboxStates {
param([PSCustomObject]$State)
$installDriversChk = $State.Controls.chkInstallDrivers
$copyDriversChk = $State.Controls.chkCopyDrivers
$compressWimChk = $State.Controls.chkCompressDriversToWIM
# Default to enabled, then apply disabling rules
$installDriversChk.IsEnabled = $true
$copyDriversChk.IsEnabled = $true
$compressWimChk.IsEnabled = $true
if ($installDriversChk.IsChecked) {
$copyDriversChk.IsEnabled = $false
$compressWimChk.IsEnabled = $false
}
if ($copyDriversChk.IsChecked) {
$installDriversChk.IsEnabled = $false
}
if ($compressWimChk.IsChecked) {
$installDriversChk.IsEnabled = $false
}
}
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# SECTION: Module Export # SECTION: Module Export
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------