mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 02:09:35 -06:00
Refactors UI event handlers into core module
Moves UI event handler registration logic from the main script to the `Register-EventHandlers` function in the `FFUUI.Core` module. This change centralizes UI logic, improving code organization and modularity. The event handlers are also updated to access state via the window's tag, reducing reliance on script-scoped variables.
This commit is contained in:
@@ -17,26 +17,26 @@ $FFUDevelopmentPath = 'C:\FFUDevelopment' # hard coded for testing
|
|||||||
# --- NEW: Central State Object ---
|
# --- NEW: Central State Object ---
|
||||||
$script:uiState = [PSCustomObject]@{
|
$script:uiState = [PSCustomObject]@{
|
||||||
FFUDevelopmentPath = $FFUDevelopmentPath;
|
FFUDevelopmentPath = $FFUDevelopmentPath;
|
||||||
Window = $null;
|
Window = $null;
|
||||||
Controls = @{
|
Controls = @{
|
||||||
featureCheckBoxes = @{};
|
featureCheckBoxes = @{};
|
||||||
UpdateInstallAppsBasedOnUpdates = $null
|
UpdateInstallAppsBasedOnUpdates = $null
|
||||||
};
|
};
|
||||||
Data = @{
|
Data = @{
|
||||||
allDriverModels = [System.Collections.Generic.List[PSCustomObject]]::new();
|
allDriverModels = [System.Collections.Generic.List[PSCustomObject]]::new();
|
||||||
appsScriptVariablesDataList = [System.Collections.Generic.List[PSCustomObject]]::new();
|
appsScriptVariablesDataList = [System.Collections.Generic.List[PSCustomObject]]::new();
|
||||||
versionData = $null;
|
versionData = $null;
|
||||||
vmSwitchMap = @{}
|
vmSwitchMap = @{}
|
||||||
};
|
};
|
||||||
Flags = @{
|
Flags = @{
|
||||||
installAppsForcedByUpdates = $false;
|
installAppsForcedByUpdates = $false;
|
||||||
prevInstallAppsStateBeforeUpdates = $null;
|
prevInstallAppsStateBeforeUpdates = $null;
|
||||||
installAppsCheckedByOffice = $false;
|
installAppsCheckedByOffice = $false;
|
||||||
lastSortProperty = $null;
|
lastSortProperty = $null;
|
||||||
lastSortAscending = $true
|
lastSortAscending = $true
|
||||||
};
|
};
|
||||||
Defaults = @{};
|
Defaults = @{};
|
||||||
LogFilePath = "$FFUDevelopmentPath\FFUDevelopment_UI.log"
|
LogFilePath = "$FFUDevelopmentPath\FFUDevelopment_UI.log"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Remove any existing modules to avoid conflicts
|
# Remove any existing modules to avoid conflicts
|
||||||
@@ -151,50 +151,20 @@ $window.Add_Loaded({
|
|||||||
|
|
||||||
Register-EventHandlers -State $script:uiState
|
Register-EventHandlers -State $script:uiState
|
||||||
|
|
||||||
$script:uiState.Controls.txtISOPath.Add_TextChanged({
|
|
||||||
Get-WindowsSettingsCombos -isoPath $script:uiState.Controls.txtISOPath.Text -State $script:uiState
|
|
||||||
})
|
|
||||||
$script:uiState.Controls.cmbWindowsRelease.Add_SelectionChanged({
|
|
||||||
$selectedReleaseValue = 11 # Default if null
|
|
||||||
if ($null -ne $script:uiState.Controls.cmbWindowsRelease.SelectedItem) {
|
|
||||||
$selectedReleaseValue = $script:uiState.Controls.cmbWindowsRelease.SelectedItem.Value
|
|
||||||
}
|
|
||||||
# Only need to update the Version combo when Release changes
|
|
||||||
Update-WindowsVersionCombo -selectedRelease $selectedReleaseValue -isoPath $script:uiState.Controls.txtISOPath.Text -State $script:uiState
|
|
||||||
# Also update the SKU combo (now derives values internally)
|
|
||||||
Update-WindowsSkuCombo -State $script:uiState
|
|
||||||
})
|
|
||||||
$script:uiState.Controls.btnBrowseISO.Add_Click({
|
|
||||||
$ofd = New-Object System.Windows.Forms.OpenFileDialog
|
|
||||||
$ofd.Filter = "ISO files (*.iso)|*.iso"
|
|
||||||
$ofd.Title = "Select Windows ISO File"
|
|
||||||
if ($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $script:uiState.Controls.txtISOPath.Text = $ofd.FileName }
|
|
||||||
})
|
|
||||||
|
|
||||||
# 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) {
|
||||||
if ($script:uiState.Controls.cmbMake.Items.Count -gt 0) { $script:uiState.Controls.cmbMake.SelectedIndex = 0 }
|
[void]$script:uiState.Controls.cmbMake.Items.Add($m)
|
||||||
$script:uiState.Controls.chkDownloadDrivers.Add_Checked({
|
}
|
||||||
$script:uiState.Controls.cmbMake.Visibility = 'Visible'
|
if ($script:uiState.Controls.cmbMake.Items.Count -gt 0) {
|
||||||
$script:uiState.Controls.btnGetModels.Visibility = 'Visible'
|
$script:uiState.Controls.cmbMake.SelectedIndex = 0
|
||||||
$script:uiState.Controls.spMakeSection.Visibility = 'Visible'
|
}
|
||||||
$script:uiState.Controls.spModelFilterSection.Visibility = 'Visible'
|
$script:uiState.Controls.spMakeSection.Visibility = if ($script:uiState.Controls.chkDownloadDrivers.IsChecked) {
|
||||||
$script:uiState.Controls.lstDriverModels.Visibility = 'Visible'
|
'Visible'
|
||||||
$script:uiState.Controls.spDriverActionButtons.Visibility = 'Visible'
|
}
|
||||||
})
|
else {
|
||||||
$script:uiState.Controls.chkDownloadDrivers.Add_Unchecked({
|
'Collapsed'
|
||||||
$script:uiState.Controls.cmbMake.Visibility = 'Collapsed'
|
}
|
||||||
$script:uiState.Controls.btnGetModels.Visibility = 'Collapsed'
|
|
||||||
$script:uiState.Controls.spMakeSection.Visibility = 'Collapsed'
|
|
||||||
$script:uiState.Controls.spModelFilterSection.Visibility = 'Collapsed'
|
|
||||||
$script:uiState.Controls.lstDriverModels.Visibility = 'Collapsed'
|
|
||||||
$script:uiState.Controls.spDriverActionButtons.Visibility = 'Collapsed'
|
|
||||||
$script:uiState.Controls.lstDriverModels.ItemsSource = $null
|
|
||||||
$script:uiState.Data.allDriverModels = @()
|
|
||||||
$script:uiState.Controls.txtModelFilter.Text = ""
|
|
||||||
})
|
|
||||||
$script:uiState.Controls.spMakeSection.Visibility = if ($script:uiState.Controls.chkDownloadDrivers.IsChecked) { 'Visible' } else { 'Collapsed' }
|
|
||||||
$script:uiState.Controls.btnGetModels.Visibility = if ($script:uiState.Controls.chkDownloadDrivers.IsChecked) { 'Visible' } else { 'Collapsed' }
|
$script:uiState.Controls.btnGetModels.Visibility = if ($script:uiState.Controls.chkDownloadDrivers.IsChecked) { 'Visible' } else { 'Collapsed' }
|
||||||
$script:uiState.Controls.spModelFilterSection.Visibility = 'Collapsed'
|
$script:uiState.Controls.spModelFilterSection.Visibility = 'Collapsed'
|
||||||
$script:uiState.Controls.lstDriverModels.Visibility = 'Collapsed'
|
$script:uiState.Controls.lstDriverModels.Visibility = 'Collapsed'
|
||||||
@@ -204,7 +174,6 @@ $window.Add_Loaded({
|
|||||||
$script:uiState.Controls.txtStatus.Text = "Getting models for $selectedMake..."
|
$script:uiState.Controls.txtStatus.Text = "Getting models for $selectedMake..."
|
||||||
$window.Cursor = [System.Windows.Input.Cursors]::Wait
|
$window.Cursor = [System.Windows.Input.Cursors]::Wait
|
||||||
$this.IsEnabled = $false
|
$this.IsEnabled = $false
|
||||||
|
|
||||||
try {
|
try {
|
||||||
# Get previously selected models from the master list ($script:uiState.Data.allDriverModels)
|
# Get previously selected models from the master list ($script:uiState.Data.allDriverModels)
|
||||||
# This ensures all selected items are captured, regardless of any active filter.
|
# This ensures all selected items are captured, regardless of any active filter.
|
||||||
@@ -704,7 +673,7 @@ $window.Add_Loaded({
|
|||||||
$script:uiState.Controls.txtAppSource.Text = ''
|
$script:uiState.Controls.txtAppSource.Text = ''
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.chkInstallWingetApps.Add_Checked({
|
$script:uiState.Controls.chkInstallWingetApps.Add_Checked({
|
||||||
$script:uiState.Controls.wingetPanel.Visibility = 'Visible'
|
$script:uiState.Controls.wingetPanel.Visibility = 'Visible'
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.chkInstallWingetApps.Add_Unchecked({
|
$script:uiState.Controls.chkInstallWingetApps.Add_Unchecked({
|
||||||
$script:uiState.Controls.wingetPanel.Visibility = 'Collapsed'
|
$script:uiState.Controls.wingetPanel.Visibility = 'Collapsed'
|
||||||
@@ -758,8 +727,8 @@ $window.Add_Loaded({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnWingetSearch.Add_Click({
|
$script:uiState.Controls.btnWingetSearch.Add_Click({
|
||||||
Search-WingetApps -State $script:uiState
|
Search-WingetApps -State $script:uiState
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.txtWingetSearch.Add_KeyDown({
|
$script:uiState.Controls.txtWingetSearch.Add_KeyDown({
|
||||||
param($eventSrc, $keyEvent)
|
param($eventSrc, $keyEvent)
|
||||||
if ($keyEvent.Key -eq 'Return') {
|
if ($keyEvent.Key -eq 'Return') {
|
||||||
@@ -767,11 +736,11 @@ $window.Add_Loaded({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnSaveWingetList.Add_Click({
|
$script:uiState.Controls.btnSaveWingetList.Add_Click({
|
||||||
Save-WingetList -State $script:uiState
|
Save-WingetList -State $script:uiState
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnImportWingetList.Add_Click({
|
$script:uiState.Controls.btnImportWingetList.Add_Click({
|
||||||
Import-WingetList -State $script:uiState
|
Import-WingetList -State $script:uiState
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnClearWingetList.Add_Click({
|
$script:uiState.Controls.btnClearWingetList.Add_Click({
|
||||||
$script:uiState.Controls.lstWingetResults.ItemsSource = @() # Set ItemsSource to an empty array
|
$script:uiState.Controls.lstWingetResults.ItemsSource = @() # Set ItemsSource to an empty array
|
||||||
$script:uiState.Controls.txtWingetSearch.Text = ""
|
$script:uiState.Controls.txtWingetSearch.Text = ""
|
||||||
@@ -924,17 +893,17 @@ $window.Add_Loaded({
|
|||||||
$buttonSender.IsEnabled = $true
|
$buttonSender.IsEnabled = $true
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnMoveTop.Add_Click({
|
$script:uiState.Controls.btnMoveTop.Add_Click({
|
||||||
Move-ListViewItemTop -ListView $script:uiState.Controls.lstApplications
|
Move-ListViewItemTop -ListView $script:uiState.Controls.lstApplications
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnMoveUp.Add_Click({
|
$script:uiState.Controls.btnMoveUp.Add_Click({
|
||||||
Move-ListViewItemUp -ListView $script:uiState.Controls.lstApplications
|
Move-ListViewItemUp -ListView $script:uiState.Controls.lstApplications
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnMoveDown.Add_Click({
|
$script:uiState.Controls.btnMoveDown.Add_Click({
|
||||||
Move-ListViewItemDown -ListView $script:uiState.Controls.lstApplications
|
Move-ListViewItemDown -ListView $script:uiState.Controls.lstApplications
|
||||||
})
|
})
|
||||||
$script:uiState.Controls.btnMoveBottom.Add_Click({
|
$script:uiState.Controls.btnMoveBottom.Add_Click({
|
||||||
Move-ListViewItemBottom -ListView $script:uiState.Controls.lstApplications
|
Move-ListViewItemBottom -ListView $script:uiState.Controls.lstApplications
|
||||||
})
|
})
|
||||||
|
|
||||||
# BYO Apps ListView setup (Keep existing logic, ensure CopyStatus column is handled)
|
# BYO Apps ListView setup (Keep existing logic, ensure CopyStatus column is handled)
|
||||||
$byoGridView = $script:uiState.Controls.lstApplications.View
|
$byoGridView = $script:uiState.Controls.lstApplications.View
|
||||||
|
|||||||
@@ -409,8 +409,7 @@ function Register-EventHandlers {
|
|||||||
param([PSCustomObject]$State)
|
param([PSCustomObject]$State)
|
||||||
WriteLog "Registering UI event handlers..."
|
WriteLog "Registering UI event handlers..."
|
||||||
|
|
||||||
# Hyper-V VM Switch Selection Changed Event
|
# Hyper-V tab event handlers
|
||||||
# This event handler updates the IP address field based on the selected VM switch
|
|
||||||
$State.Controls.cmbVMSwitchName.Add_SelectionChanged({
|
$State.Controls.cmbVMSwitchName.Add_SelectionChanged({
|
||||||
param($eventSource, $selectionChangedEventArgs)
|
param($eventSource, $selectionChangedEventArgs)
|
||||||
# The state object is available via the parent window's Tag property
|
# The state object is available via the parent window's Tag property
|
||||||
@@ -432,6 +431,65 @@ function Register-EventHandlers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# Windows Settings tab Event Handlers
|
||||||
|
$State.Controls.txtISOPath.Add_TextChanged({
|
||||||
|
param($eventSource, $textChangedEventArgs)
|
||||||
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
|
$localState = $window.Tag
|
||||||
|
Get-WindowsSettingsCombos -isoPath $localState.Controls.txtISOPath.Text -State $localState
|
||||||
|
})
|
||||||
|
|
||||||
|
$State.Controls.cmbWindowsRelease.Add_SelectionChanged({
|
||||||
|
param($eventSource, $selectionChangedEventArgs)
|
||||||
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
|
$localState = $window.Tag
|
||||||
|
$selectedReleaseValue = 11 # Default if null
|
||||||
|
if ($null -ne $localState.Controls.cmbWindowsRelease.SelectedItem) {
|
||||||
|
$selectedReleaseValue = $localState.Controls.cmbWindowsRelease.SelectedItem.Value
|
||||||
|
}
|
||||||
|
# Only need to update the Version combo when Release changes
|
||||||
|
Update-WindowsVersionCombo -selectedRelease $selectedReleaseValue -isoPath $localState.Controls.txtISOPath.Text -State $localState
|
||||||
|
# Also update the SKU combo (now derives values internally)
|
||||||
|
Update-WindowsSkuCombo -State $localState
|
||||||
|
})
|
||||||
|
|
||||||
|
$State.Controls.btnBrowseISO.Add_Click({
|
||||||
|
param($eventSource, $routedEventArgs)
|
||||||
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
|
$localState = $window.Tag
|
||||||
|
$ofd = New-Object System.Windows.Forms.OpenFileDialog
|
||||||
|
$ofd.Filter = "ISO files (*.iso)|*.iso"
|
||||||
|
$ofd.Title = "Select Windows ISO File"
|
||||||
|
if ($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { $localState.Controls.txtISOPath.Text = $ofd.FileName }
|
||||||
|
})
|
||||||
|
|
||||||
|
# Drivers Tab Event Handlers
|
||||||
|
$State.Controls.chkDownloadDrivers.Add_Checked({
|
||||||
|
param($eventSource, $routedEventArgs)
|
||||||
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
|
$localState = $window.Tag
|
||||||
|
$localState.Controls.cmbMake.Visibility = 'Visible'
|
||||||
|
$localState.Controls.btnGetModels.Visibility = 'Visible'
|
||||||
|
$localState.Controls.spMakeSection.Visibility = 'Visible'
|
||||||
|
$localState.Controls.spModelFilterSection.Visibility = 'Visible'
|
||||||
|
$localState.Controls.lstDriverModels.Visibility = 'Visible'
|
||||||
|
$localState.Controls.spDriverActionButtons.Visibility = 'Visible'
|
||||||
|
})
|
||||||
|
$State.Controls.chkDownloadDrivers.Add_Unchecked({
|
||||||
|
param($eventSource, $routedEventArgs)
|
||||||
|
$window = [System.Windows.Window]::GetWindow($eventSource)
|
||||||
|
$localState = $window.Tag
|
||||||
|
$localState.Controls.cmbMake.Visibility = 'Collapsed'
|
||||||
|
$localState.Controls.btnGetModels.Visibility = 'Collapsed'
|
||||||
|
$localState.Controls.spMakeSection.Visibility = 'Collapsed'
|
||||||
|
$localState.Controls.spModelFilterSection.Visibility = 'Collapsed'
|
||||||
|
$localState.Controls.lstDriverModels.Visibility = 'Collapsed'
|
||||||
|
$localState.Controls.spDriverActionButtons.Visibility = 'Collapsed'
|
||||||
|
$localState.Controls.lstDriverModels.ItemsSource = $null
|
||||||
|
$localState.Data.allDriverModels.Clear()
|
||||||
|
$localState.Controls.txtModelFilter.Text = ""
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
Export-ModuleMember -Function *
|
Export-ModuleMember -Function *
|
||||||
|
|||||||
Reference in New Issue
Block a user