From acd0092f2684389ceba375b7628cbf94f10818f7 Mon Sep 17 00:00:00 2001 From: rbalsleyMSFT <53497092+rbalsleyMSFT@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:14:54 -0700 Subject: [PATCH] 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. --- FFUDevelopment/BuildFFUVM_UI.ps1 | 93 +------------------ .../FFUUI.Core/FFUUI.Core.Initialize.psm1 | 89 +++++++++++++++++- 2 files changed, 92 insertions(+), 90 deletions(-) diff --git a/FFUDevelopment/BuildFFUVM_UI.ps1 b/FFUDevelopment/BuildFFUVM_UI.ps1 index ff14e0a..2152ec1 100644 --- a/FFUDevelopment/BuildFFUVM_UI.ps1 +++ b/FFUDevelopment/BuildFFUVM_UI.ps1 @@ -16,6 +16,7 @@ $FFUDevelopmentPath = 'C:\FFUDevelopment' # hard coded for testing # --- NEW: Central State Object --- $script:uiState = [PSCustomObject]@{ + FFUDevelopmentPath = $FFUDevelopmentPath; Window = $null; Controls = @{ featureCheckBoxes = @{}; @@ -142,16 +143,13 @@ $window.Add_Loaded({ $window.Tag = $script:uiState Initialize-UIControls -State $script:uiState - # Get Windows Settings defaults and lists from helper module - $script:uiState.Defaults.windowsSettingsDefaults = Get-WindowsSettingsDefaults + Initialize-UIDefaults -State $script:uiState - # Get General defaults from helper module - $script:uiState.Defaults.generalDefaults = Get-GeneralDefaults -FFUDevelopmentPath $FFUDevelopmentPath - Initialize-DynamicUIElements -State $script:uiState # Initialize Windows Settings UI using data from helper module Initialize-WindowsSettingsCombos -isoPath $script:uiState.Defaults.windowsSettingsDefaults.DefaultISOPath -State $script:uiState # Use combined refresh function + $script:uiState.Controls.txtISOPath.Add_TextChanged({ 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 } }) - # 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) $vmSwitchData = Get-VMSwitchData $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 $makeList = @('Microsoft', 'Dell', 'HP', 'Lenovo') foreach ($m in $makeList) { [void]$script:uiState.Controls.cmbMake.Items.Add($m) } diff --git a/FFUDevelopment/FFUUI.Core/FFUUI.Core.Initialize.psm1 b/FFUDevelopment/FFUUI.Core/FFUUI.Core.Initialize.psm1 index bbd862c..da8d8f1 100644 --- a/FFUDevelopment/FFUUI.Core/FFUUI.Core.Initialize.psm1 +++ b/FFUDevelopment/FFUUI.Core/FFUUI.Core.Initialize.psm1 @@ -147,6 +147,93 @@ function Initialize-UIControls { $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 { param([PSCustomObject]$State) 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