From ab7c8aa25026dbd1207440711de0f1e3834e19e5 Mon Sep 17 00:00:00 2001 From: rbalsleyMSFT <53497092+rbalsleyMSFT@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:18:41 -0700 Subject: [PATCH] Refactor UI initialization and event handling Moves the VM Switch data population and event handler logic from the main UI script into the `FFUUI.Core.Initialize` module. This change improves code organization by centralizing UI initialization and event registration into dedicated functions, making the main script cleaner. It also simplifies module manifests by changing explicit function exports to a wildcard. --- FFUDevelopment/BuildFFUVM_UI.ps1 | 49 ++------------ .../FFUUI.Core/FFUUI.Core.Initialize.psm1 | 64 ++++++++++++++++++- .../FFUUI.Core.WindowsSettings.psm1 | 2 +- 3 files changed, 68 insertions(+), 47 deletions(-) diff --git a/FFUDevelopment/BuildFFUVM_UI.ps1 b/FFUDevelopment/BuildFFUVM_UI.ps1 index d045841..c0127c2 100644 --- a/FFUDevelopment/BuildFFUVM_UI.ps1 +++ b/FFUDevelopment/BuildFFUVM_UI.ps1 @@ -147,8 +147,12 @@ $window.Add_Loaded({ Initialize-DynamicUIElements -State $script:uiState + Initialize-VMSwitchData -State $script:uiState + + Register-EventHandlers -State $script:uiState + # Get Windows Settings UI using data from helper module - Get-WindowsSettingsCombos -isoPath $script:uiState.Defaults.windowsSettingsDefaults.DefaultISOPath -State $script:uiState # Use combined refresh function + Get-WindowsSettingsCombos -isoPath $script:uiState.Defaults.windowsSettingsDefaults.DefaultISOPath -State $script:uiState $script:uiState.Controls.txtISOPath.Add_TextChanged({ Get-WindowsSettingsCombos -isoPath $script:uiState.Controls.txtISOPath.Text -State $script:uiState @@ -170,49 +174,6 @@ $window.Add_Loaded({ if ($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $script:uiState.Controls.txtISOPath.Text = $ofd.FileName } }) - - # Hyper-V Settings: Populate VM Switch ComboBox (Keep existing logic) - $vmSwitchData = Get-VMSwitchData - $script:uiState.Data.vmSwitchMap = $vmSwitchData.SwitchMap - $script:uiState.Controls.cmbVMSwitchName.Items.Clear() - foreach ($switchName in $vmSwitchData.SwitchNames) { - $script:uiState.Controls.cmbVMSwitchName.Items.Add($switchName) | Out-Null - } - $script:uiState.Controls.cmbVMSwitchName.Items.Add('Other') | Out-Null - if ($script:uiState.Controls.cmbVMSwitchName.Items.Count -gt 1) { - $script:uiState.Controls.cmbVMSwitchName.SelectedIndex = 0 - $firstSwitch = $script:uiState.Controls.cmbVMSwitchName.SelectedItem - if ($script:uiState.Data.vmSwitchMap.ContainsKey($firstSwitch)) { - $script:uiState.Controls.txtVMHostIPAddress.Text = $script:uiState.Data.vmSwitchMap[$firstSwitch] - } - else { - $script:uiState.Controls.txtVMHostIPAddress.Text = $script:uiState.Defaults.generalDefaults.VMHostIPAddress # Use default if IP not found - } - $script:uiState.Controls.txtCustomVMSwitchName.Visibility = 'Collapsed' - } - else { - $script:uiState.Controls.cmbVMSwitchName.SelectedItem = 'Other' - $script:uiState.Controls.txtCustomVMSwitchName.Visibility = 'Visible' - $script:uiState.Controls.txtVMHostIPAddress.Text = $script:uiState.Defaults.generalDefaults.VMHostIPAddress # Use default - } - $script:uiState.Controls.cmbVMSwitchName.Add_SelectionChanged({ - param($eventSource, $selectionChangedEventArgs) - $selectedItem = $eventSource.SelectedItem - if ($selectedItem -eq 'Other') { - $script:uiState.Controls.txtCustomVMSwitchName.Visibility = 'Visible' - $script:uiState.Controls.txtVMHostIPAddress.Text = '' # Clear IP for custom - } - else { - $script:uiState.Controls.txtCustomVMSwitchName.Visibility = 'Collapsed' - if ($script:uiState.Data.vmSwitchMap.ContainsKey($selectedItem)) { - $script:uiState.Controls.txtVMHostIPAddress.Text = $script:uiState.Data.vmSwitchMap[$selectedItem] - } - else { - $script:uiState.Controls.txtVMHostIPAddress.Text = '' # Clear IP if not found in map - } - } - }) - # 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 da8d8f1..2713d40 100644 --- a/FFUDevelopment/FFUUI.Core/FFUUI.Core.Initialize.psm1 +++ b/FFUDevelopment/FFUUI.Core/FFUUI.Core.Initialize.psm1 @@ -150,7 +150,7 @@ function Initialize-UIControls { 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 @@ -371,4 +371,64 @@ function Initialize-DynamicUIElements { } } -Export-ModuleMember -Function Initialize-UIControls, Initialize-DynamicUIElements, Initialize-UIDefaults +function Initialize-VMSwitchData { + param([PSCustomObject]$State) + + WriteLog "Initializing VM Switch data..." + + # Hyper-V Settings: Populate VM Switch ComboBox + $vmSwitchData = Get-VMSwitchData + $State.Data.vmSwitchMap = $vmSwitchData.SwitchMap + $State.Controls.cmbVMSwitchName.Items.Clear() + foreach ($switchName in $vmSwitchData.SwitchNames) { + $State.Controls.cmbVMSwitchName.Items.Add($switchName) | Out-Null + } + $State.Controls.cmbVMSwitchName.Items.Add('Other') | Out-Null + if ($State.Controls.cmbVMSwitchName.Items.Count -gt 1) { + $State.Controls.cmbVMSwitchName.SelectedIndex = 0 + $firstSwitch = $State.Controls.cmbVMSwitchName.SelectedItem + if ($State.Data.vmSwitchMap.ContainsKey($firstSwitch)) { + $State.Controls.txtVMHostIPAddress.Text = $State.Data.vmSwitchMap[$firstSwitch] + } + else { + $State.Controls.txtVMHostIPAddress.Text = $State.Defaults.generalDefaults.VMHostIPAddress # Use default if IP not found + } + $State.Controls.txtCustomVMSwitchName.Visibility = 'Collapsed' + } + else { + $State.Controls.cmbVMSwitchName.SelectedItem = 'Other' + $State.Controls.txtCustomVMSwitchName.Visibility = 'Visible' + $State.Controls.txtVMHostIPAddress.Text = $State.Defaults.generalDefaults.VMHostIPAddress # Use default + } +} + +function Register-EventHandlers { + param([PSCustomObject]$State) + WriteLog "Registering UI event handlers..." + + # Hyper-V VM Switch Selection Changed Event + # This event handler updates the IP address field based on the selected VM switch + $State.Controls.cmbVMSwitchName.Add_SelectionChanged({ + param($eventSource, $selectionChangedEventArgs) + # The state object is available via the parent window's Tag property + $window = [System.Windows.Window]::GetWindow($eventSource) + $localState = $window.Tag + + $selectedItem = $eventSource.SelectedItem + if ($selectedItem -eq 'Other') { + $localState.Controls.txtCustomVMSwitchName.Visibility = 'Visible' + $localState.Controls.txtVMHostIPAddress.Text = '' # Clear IP for custom + } + else { + $localState.Controls.txtCustomVMSwitchName.Visibility = 'Collapsed' + if ($localState.Data.vmSwitchMap.ContainsKey($selectedItem)) { + $localState.Controls.txtVMHostIPAddress.Text = $localState.Data.vmSwitchMap[$selectedItem] + } + else { + $localState.Controls.txtVMHostIPAddress.Text = '' # Clear IP if not found in map + } + } + }) +} + +Export-ModuleMember -Function * diff --git a/FFUDevelopment/FFUUI.Core/FFUUI.Core.WindowsSettings.psm1 b/FFUDevelopment/FFUUI.Core/FFUUI.Core.WindowsSettings.psm1 index 78750e4..14e6da4 100644 --- a/FFUDevelopment/FFUUI.Core/FFUUI.Core.WindowsSettings.psm1 +++ b/FFUDevelopment/FFUUI.Core/FFUUI.Core.WindowsSettings.psm1 @@ -567,4 +567,4 @@ function BuildFeaturesGrid { # SECTION: Module Export # -------------------------------------------------------------------------- -Export-ModuleMember -Function Get-WindowsSettingsDefaults, Get-AvailableWindowsReleases, Get-AvailableWindowsVersions, Get-AvailableSkusForRelease, Update-WindowsReleaseCombo, Update-WindowsVersionCombo, Update-WindowsSkuCombo, Initialize-WindowsSettingsCombos, UpdateOptionalFeaturesString, BuildFeaturesGrid \ No newline at end of file +Export-ModuleMember -Function * \ No newline at end of file