Refactor UI initialization into core module

Extracts the logic for setting default UI control values from the main script into a new `Initialize-UIDefaults` function within the `FFUUI.Core` module.

This change cleans up the main UI script's window loaded event, improving code organization and separating UI setup from default value initialization.
This commit is contained in:
rbalsleyMSFT
2025-06-17 13:14:54 -07:00
parent 71a4923c56
commit acd0092f26
2 changed files with 92 additions and 90 deletions
+4 -89
View File
@@ -16,6 +16,7 @@ $FFUDevelopmentPath = 'C:\FFUDevelopment' # hard coded for testing
# --- NEW: Central State Object --- # --- NEW: Central State Object ---
$script:uiState = [PSCustomObject]@{ $script:uiState = [PSCustomObject]@{
FFUDevelopmentPath = $FFUDevelopmentPath;
Window = $null; Window = $null;
Controls = @{ Controls = @{
featureCheckBoxes = @{}; featureCheckBoxes = @{};
@@ -142,16 +143,13 @@ $window.Add_Loaded({
$window.Tag = $script:uiState $window.Tag = $script:uiState
Initialize-UIControls -State $script:uiState Initialize-UIControls -State $script:uiState
# Get Windows Settings defaults and lists from helper module Initialize-UIDefaults -State $script:uiState
$script:uiState.Defaults.windowsSettingsDefaults = Get-WindowsSettingsDefaults
# Get General defaults from helper module
$script:uiState.Defaults.generalDefaults = Get-GeneralDefaults -FFUDevelopmentPath $FFUDevelopmentPath
Initialize-DynamicUIElements -State $script:uiState Initialize-DynamicUIElements -State $script:uiState
# Initialize Windows Settings UI using data from helper module # Initialize Windows Settings UI using data from helper module
Initialize-WindowsSettingsCombos -isoPath $script:uiState.Defaults.windowsSettingsDefaults.DefaultISOPath -State $script:uiState # Use combined refresh function Initialize-WindowsSettingsCombos -isoPath $script:uiState.Defaults.windowsSettingsDefaults.DefaultISOPath -State $script:uiState # Use combined refresh function
$script:uiState.Controls.txtISOPath.Add_TextChanged({ $script:uiState.Controls.txtISOPath.Add_TextChanged({
Initialize-WindowsSettingsCombos -isoPath $script:uiState.Controls.txtISOPath.Text -State $script:uiState Initialize-WindowsSettingsCombos -isoPath $script:uiState.Controls.txtISOPath.Text -State $script:uiState
}) })
@@ -172,58 +170,7 @@ $window.Add_Loaded({
if ($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $script:uiState.Controls.txtISOPath.Text = $ofd.FileName } if ($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $script:uiState.Controls.txtISOPath.Text = $ofd.FileName }
}) })
# Populate static combos from defaults object
$script:uiState.Controls.cmbWindowsArch.ItemsSource = $script:uiState.Defaults.windowsSettingsDefaults.AllowedArchitectures
$script:uiState.Controls.cmbWindowsArch.SelectedItem = $script:uiState.Defaults.windowsSettingsDefaults.DefaultWindowsArch
$script:uiState.Controls.cmbWindowsLang.ItemsSource = $script:uiState.Defaults.windowsSettingsDefaults.AllowedLanguages
$script:uiState.Controls.cmbWindowsLang.SelectedItem = $script:uiState.Defaults.windowsSettingsDefaults.DefaultWindowsLang
# $script:uiState.Controls.cmbWindowsSKU.ItemsSource is now populated by Update-WindowsSkuCombo
$script:uiState.Controls.cmbWindowsSKU.SelectedItem = $script:uiState.Defaults.windowsSettingsDefaults.DefaultWindowsSKU # Attempt to set default
$script:uiState.Controls.cmbMediaType.ItemsSource = $script:uiState.Defaults.windowsSettingsDefaults.AllowedMediaTypes
$script:uiState.Controls.cmbMediaType.SelectedItem = $script:uiState.Defaults.windowsSettingsDefaults.DefaultMediaType
# Set default text values for Windows Settings
$script:uiState.Controls.txtOptionalFeatures.Text = $script:uiState.Defaults.windowsSettingsDefaults.DefaultOptionalFeatures
$script:uiState.Controls.txtProductKey.Text = $script:uiState.Defaults.windowsSettingsDefaults.DefaultProductKey
# Build tab defaults from General Defaults
$script:uiState.Controls.txtFFUDevPath.Text = $FFUDevelopmentPath # Keep this as it's the base path
$script:uiState.Controls.txtCustomFFUNameTemplate.Text = $script:uiState.Defaults.generalDefaults.CustomFFUNameTemplate
$script:uiState.Controls.txtFFUCaptureLocation.Text = $script:uiState.Defaults.generalDefaults.FFUCaptureLocation
$script:uiState.Controls.txtShareName.Text = $script:uiState.Defaults.generalDefaults.ShareName
$script:uiState.Controls.txtUsername.Text = $script:uiState.Defaults.generalDefaults.Username
$script:uiState.Controls.chkBuildUSBDriveEnable.IsChecked = $script:uiState.Defaults.generalDefaults.BuildUSBDriveEnable
$script:uiState.Controls.chkCompactOS.IsChecked = $script:uiState.Defaults.generalDefaults.CompactOS
$script:uiState.Controls.chkUpdateADK.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateADK # Set default for chkUpdateADK
$script:uiState.Controls.chkOptimize.IsChecked = $script:uiState.Defaults.generalDefaults.Optimize
$script:uiState.Controls.chkAllowVHDXCaching.IsChecked = $script:uiState.Defaults.generalDefaults.AllowVHDXCaching
$script:uiState.Controls.chkCreateCaptureMedia.IsChecked = $script:uiState.Defaults.generalDefaults.CreateCaptureMedia
$script:uiState.Controls.chkCreateDeploymentMedia.IsChecked = $script:uiState.Defaults.generalDefaults.CreateDeploymentMedia
$script:uiState.Controls.chkAllowExternalHardDiskMedia.IsChecked = $script:uiState.Defaults.generalDefaults.AllowExternalHardDiskMedia
$script:uiState.Controls.chkPromptExternalHardDiskMedia.IsChecked = $script:uiState.Defaults.generalDefaults.PromptExternalHardDiskMedia
$script:uiState.Controls.chkSelectSpecificUSBDrives.IsChecked = $script:uiState.Defaults.generalDefaults.SelectSpecificUSBDrives
$script:uiState.Controls.chkCopyAutopilot.IsChecked = $script:uiState.Defaults.generalDefaults.CopyAutopilot
$script:uiState.Controls.chkCopyUnattend.IsChecked = $script:uiState.Defaults.generalDefaults.CopyUnattend
$script:uiState.Controls.chkCopyPPKG.IsChecked = $script:uiState.Defaults.generalDefaults.CopyPPKG
$script:uiState.Controls.chkCleanupAppsISO.IsChecked = $script:uiState.Defaults.generalDefaults.CleanupAppsISO
$script:uiState.Controls.chkCleanupCaptureISO.IsChecked = $script:uiState.Defaults.generalDefaults.CleanupCaptureISO
$script:uiState.Controls.chkCleanupDeployISO.IsChecked = $script:uiState.Defaults.generalDefaults.CleanupDeployISO
$script:uiState.Controls.chkCleanupDrivers.IsChecked = $script:uiState.Defaults.generalDefaults.CleanupDrivers
$script:uiState.Controls.chkRemoveFFU.IsChecked = $script:uiState.Defaults.generalDefaults.RemoveFFU
$script:uiState.Controls.chkRemoveApps.IsChecked = $script:uiState.Defaults.generalDefaults.RemoveApps
$script:uiState.Controls.chkRemoveUpdates.IsChecked = $script:uiState.Defaults.generalDefaults.RemoveUpdates
# Hyper-V Settings defaults from General Defaults
$script:uiState.Controls.txtDiskSize.Text = $script:uiState.Defaults.generalDefaults.DiskSizeGB
$script:uiState.Controls.txtMemory.Text = $script:uiState.Defaults.generalDefaults.MemoryGB
$script:uiState.Controls.txtProcessors.Text = $script:uiState.Defaults.generalDefaults.Processors
$script:uiState.Controls.txtVMLocation.Text = $script:uiState.Defaults.generalDefaults.VMLocation
$script:uiState.Controls.txtVMNamePrefix.Text = $script:uiState.Defaults.generalDefaults.VMNamePrefix
$script:uiState.Controls.cmbLogicalSectorSize.SelectedItem = ($script:uiState.Controls.cmbLogicalSectorSize.Items | Where-Object { $_.Content -eq $script:uiState.Defaults.generalDefaults.LogicalSectorSize.ToString() })
# Hyper-V Settings: Populate VM Switch ComboBox (Keep existing logic) # Hyper-V Settings: Populate VM Switch ComboBox (Keep existing logic)
$vmSwitchData = Get-VMSwitchData $vmSwitchData = Get-VMSwitchData
$script:uiState.Data.vmSwitchMap = $vmSwitchData.SwitchMap $script:uiState.Data.vmSwitchMap = $vmSwitchData.SwitchMap
@@ -266,38 +213,6 @@ $window.Add_Loaded({
} }
}) })
# Updates tab defaults from General Defaults
$script:uiState.Controls.chkUpdateLatestCU.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateLatestCU
$script:uiState.Controls.chkUpdateLatestNet.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateLatestNet
$script:uiState.Controls.chkUpdateLatestDefender.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateLatestDefender
$script:uiState.Controls.chkUpdateEdge.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateEdge
$script:uiState.Controls.chkUpdateOneDrive.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateOneDrive
$script:uiState.Controls.chkUpdateLatestMSRT.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateLatestMSRT
$script:uiState.Controls.chkUpdateLatestMicrocode.IsChecked = $script:uiState.Defaults.generalDefaults.UpdateLatestMicrocode # Added for UpdateLatestMicrocode
$script:uiState.Controls.chkUpdatePreviewCU.IsChecked = $script:uiState.Defaults.generalDefaults.UpdatePreviewCU
# Applications tab defaults from General Defaults
$script:uiState.Controls.chkInstallApps.IsChecked = $script:uiState.Defaults.generalDefaults.InstallApps
$script:uiState.Controls.txtApplicationPath.Text = $script:uiState.Defaults.generalDefaults.ApplicationPath
$script:uiState.Controls.txtAppListJsonPath.Text = $script:uiState.Defaults.generalDefaults.AppListJsonPath
$script:uiState.Controls.chkInstallWingetApps.IsChecked = $script:uiState.Defaults.generalDefaults.InstallWingetApps
$script:uiState.Controls.chkBringYourOwnApps.IsChecked = $script:uiState.Defaults.generalDefaults.BringYourOwnApps
# M365 Apps/Office tab defaults from General Defaults
$script:uiState.Controls.chkInstallOffice.IsChecked = $script:uiState.Defaults.generalDefaults.InstallOffice
$script:uiState.Controls.txtOfficePath.Text = $script:uiState.Defaults.generalDefaults.OfficePath
$script:uiState.Controls.chkCopyOfficeConfigXML.IsChecked = $script:uiState.Defaults.generalDefaults.CopyOfficeConfigXML
$script:uiState.Controls.txtOfficeConfigXMLFilePath.Text = $script:uiState.Defaults.generalDefaults.OfficeConfigXMLFilePath
# Drivers tab defaults from General Defaults
$script:uiState.Controls.txtDriversFolder.Text = $script:uiState.Defaults.generalDefaults.DriversFolder
$script:uiState.Controls.txtPEDriversFolder.Text = $script:uiState.Defaults.generalDefaults.PEDriversFolder
$script:uiState.Controls.txtDriversJsonPath.Text = $script:uiState.Defaults.generalDefaults.DriversJsonPath # Set default text
$script:uiState.Controls.chkDownloadDrivers.IsChecked = $script:uiState.Defaults.generalDefaults.DownloadDrivers
$script:uiState.Controls.chkInstallDrivers.IsChecked = $script:uiState.Defaults.generalDefaults.InstallDrivers
$script:uiState.Controls.chkCopyDrivers.IsChecked = $script:uiState.Defaults.generalDefaults.CopyDrivers
$script:uiState.Controls.chkCopyPEDrivers.IsChecked = $script:uiState.Defaults.generalDefaults.CopyPEDrivers
# Drivers tab UI logic # Drivers tab UI logic
$makeList = @('Microsoft', 'Dell', 'HP', 'Lenovo') $makeList = @('Microsoft', 'Dell', 'HP', 'Lenovo')
foreach ($m in $makeList) { [void]$script:uiState.Controls.cmbMake.Items.Add($m) } foreach ($m in $makeList) { [void]$script:uiState.Controls.cmbMake.Items.Add($m) }
@@ -147,6 +147,93 @@ function Initialize-UIControls {
$State.Controls.chkUpdateADK = $window.FindName('chkUpdateADK') $State.Controls.chkUpdateADK = $window.FindName('chkUpdateADK')
} }
function Initialize-UIDefaults {
param([PSCustomObject]$State)
WriteLog "Initializing UI defaults..."
# Get default values from helper functions
$State.Defaults.windowsSettingsDefaults = Get-WindowsSettingsDefaults
$State.Defaults.generalDefaults = Get-GeneralDefaults -FFUDevelopmentPath $State.FFUDevelopmentPath
# Build tab defaults from General Defaults
$State.Controls.txtFFUDevPath.Text = $State.FFUDevelopmentPath
$State.Controls.txtCustomFFUNameTemplate.Text = $State.Defaults.generalDefaults.CustomFFUNameTemplate
$State.Controls.txtFFUCaptureLocation.Text = $State.Defaults.generalDefaults.FFUCaptureLocation
$State.Controls.txtShareName.Text = $State.Defaults.generalDefaults.ShareName
$State.Controls.txtUsername.Text = $State.Defaults.generalDefaults.Username
$State.Controls.chkBuildUSBDriveEnable.IsChecked = $State.Defaults.generalDefaults.BuildUSBDriveEnable
$State.Controls.chkCompactOS.IsChecked = $State.Defaults.generalDefaults.CompactOS
$State.Controls.chkUpdateADK.IsChecked = $State.Defaults.generalDefaults.UpdateADK
$State.Controls.chkOptimize.IsChecked = $State.Defaults.generalDefaults.Optimize
$State.Controls.chkAllowVHDXCaching.IsChecked = $State.Defaults.generalDefaults.AllowVHDXCaching
$State.Controls.chkCreateCaptureMedia.IsChecked = $State.Defaults.generalDefaults.CreateCaptureMedia
$State.Controls.chkCreateDeploymentMedia.IsChecked = $State.Defaults.generalDefaults.CreateDeploymentMedia
$State.Controls.chkAllowExternalHardDiskMedia.IsChecked = $State.Defaults.generalDefaults.AllowExternalHardDiskMedia
$State.Controls.chkPromptExternalHardDiskMedia.IsChecked = $State.Defaults.generalDefaults.PromptExternalHardDiskMedia
$State.Controls.chkSelectSpecificUSBDrives.IsChecked = $State.Defaults.generalDefaults.SelectSpecificUSBDrives
$State.Controls.chkCopyAutopilot.IsChecked = $State.Defaults.generalDefaults.CopyAutopilot
$State.Controls.chkCopyUnattend.IsChecked = $State.Defaults.generalDefaults.CopyUnattend
$State.Controls.chkCopyPPKG.IsChecked = $State.Defaults.generalDefaults.CopyPPKG
$State.Controls.chkCleanupAppsISO.IsChecked = $State.Defaults.generalDefaults.CleanupAppsISO
$State.Controls.chkCleanupCaptureISO.IsChecked = $State.Defaults.generalDefaults.CleanupCaptureISO
$State.Controls.chkCleanupDeployISO.IsChecked = $State.Defaults.generalDefaults.CleanupDeployISO
$State.Controls.chkCleanupDrivers.IsChecked = $State.Defaults.generalDefaults.CleanupDrivers
$State.Controls.chkRemoveFFU.IsChecked = $State.Defaults.generalDefaults.RemoveFFU
$State.Controls.chkRemoveApps.IsChecked = $State.Defaults.generalDefaults.RemoveApps
$State.Controls.chkRemoveUpdates.IsChecked = $State.Defaults.generalDefaults.RemoveUpdates
# Hyper-V Settings defaults from General Defaults
$State.Controls.txtDiskSize.Text = $State.Defaults.generalDefaults.DiskSizeGB
$State.Controls.txtMemory.Text = $State.Defaults.generalDefaults.MemoryGB
$State.Controls.txtProcessors.Text = $State.Defaults.generalDefaults.Processors
$State.Controls.txtVMLocation.Text = $State.Defaults.generalDefaults.VMLocation
$State.Controls.txtVMNamePrefix.Text = $State.Defaults.generalDefaults.VMNamePrefix
$State.Controls.cmbLogicalSectorSize.SelectedItem = ($State.Controls.cmbLogicalSectorSize.Items | Where-Object { $_.Content -eq $State.Defaults.generalDefaults.LogicalSectorSize.ToString() })
# Windows Settings tab defaults
$State.Controls.cmbWindowsArch.ItemsSource = $State.Defaults.windowsSettingsDefaults.AllowedArchitectures
$State.Controls.cmbWindowsArch.SelectedItem = $State.Defaults.windowsSettingsDefaults.DefaultWindowsArch
$State.Controls.cmbWindowsLang.ItemsSource = $State.Defaults.windowsSettingsDefaults.AllowedLanguages
$State.Controls.cmbWindowsLang.SelectedItem = $State.Defaults.windowsSettingsDefaults.DefaultWindowsLang
$State.Controls.cmbWindowsSKU.SelectedItem = $State.Defaults.windowsSettingsDefaults.DefaultWindowsSKU
$State.Controls.cmbMediaType.ItemsSource = $State.Defaults.windowsSettingsDefaults.AllowedMediaTypes
$State.Controls.cmbMediaType.SelectedItem = $State.Defaults.windowsSettingsDefaults.DefaultMediaType
$State.Controls.txtOptionalFeatures.Text = $State.Defaults.windowsSettingsDefaults.DefaultOptionalFeatures
$State.Controls.txtProductKey.Text = $State.Defaults.windowsSettingsDefaults.DefaultProductKey
# Updates tab defaults from General Defaults
$State.Controls.chkUpdateLatestCU.IsChecked = $State.Defaults.generalDefaults.UpdateLatestCU
$State.Controls.chkUpdateLatestNet.IsChecked = $State.Defaults.generalDefaults.UpdateLatestNet
$State.Controls.chkUpdateLatestDefender.IsChecked = $State.Defaults.generalDefaults.UpdateLatestDefender
$State.Controls.chkUpdateEdge.IsChecked = $State.Defaults.generalDefaults.UpdateEdge
$State.Controls.chkUpdateOneDrive.IsChecked = $State.Defaults.generalDefaults.UpdateOneDrive
$State.Controls.chkUpdateLatestMSRT.IsChecked = $State.Defaults.generalDefaults.UpdateLatestMSRT
$State.Controls.chkUpdateLatestMicrocode.IsChecked = $State.Defaults.generalDefaults.UpdateLatestMicrocode
$State.Controls.chkUpdatePreviewCU.IsChecked = $State.Defaults.generalDefaults.UpdatePreviewCU
# Applications tab defaults from General Defaults
$State.Controls.chkInstallApps.IsChecked = $State.Defaults.generalDefaults.InstallApps
$State.Controls.txtApplicationPath.Text = $State.Defaults.generalDefaults.ApplicationPath
$State.Controls.txtAppListJsonPath.Text = $State.Defaults.generalDefaults.AppListJsonPath
$State.Controls.chkInstallWingetApps.IsChecked = $State.Defaults.generalDefaults.InstallWingetApps
$State.Controls.chkBringYourOwnApps.IsChecked = $State.Defaults.generalDefaults.BringYourOwnApps
# M365 Apps/Office tab defaults from General Defaults
$State.Controls.chkInstallOffice.IsChecked = $State.Defaults.generalDefaults.InstallOffice
$State.Controls.txtOfficePath.Text = $State.Defaults.generalDefaults.OfficePath
$State.Controls.chkCopyOfficeConfigXML.IsChecked = $State.Defaults.generalDefaults.CopyOfficeConfigXML
$State.Controls.txtOfficeConfigXMLFilePath.Text = $State.Defaults.generalDefaults.OfficeConfigXMLFilePath
# Drivers tab defaults from General Defaults
$State.Controls.txtDriversFolder.Text = $State.Defaults.generalDefaults.DriversFolder
$State.Controls.txtPEDriversFolder.Text = $State.Defaults.generalDefaults.PEDriversFolder
$State.Controls.txtDriversJsonPath.Text = $State.Defaults.generalDefaults.DriversJsonPath
$State.Controls.chkDownloadDrivers.IsChecked = $State.Defaults.generalDefaults.DownloadDrivers
$State.Controls.chkInstallDrivers.IsChecked = $State.Defaults.generalDefaults.InstallDrivers
$State.Controls.chkCopyDrivers.IsChecked = $State.Defaults.generalDefaults.CopyDrivers
$State.Controls.chkCopyPEDrivers.IsChecked = $State.Defaults.generalDefaults.CopyPEDrivers
}
function Initialize-DynamicUIElements { function Initialize-DynamicUIElements {
param([PSCustomObject]$State) param([PSCustomObject]$State)
WriteLog "Initializing dynamic UI elements (Grids, Columns)..." WriteLog "Initializing dynamic UI elements (Grids, Columns)..."
@@ -284,4 +371,4 @@ function Initialize-DynamicUIElements {
} }
} }
Export-ModuleMember -Function Initialize-UIControls, Initialize-DynamicUIElements Export-ModuleMember -Function Initialize-UIControls, Initialize-DynamicUIElements, Initialize-UIDefaults