Refactor Get-ModelsForMake and Update-CopyButtonState to use State parameter

- Updated functions to accept a State parameter for improved scope management.
- Replaced direct window control access with State object references for better encapsulation and consistency.
- Ensured proper handling of UI elements within the context of the State object.

Refactors UI functions to use a State parameter

Improves scope management and encapsulation by passing a `State` object to UI-interacting functions.

This change modifies several functions, including `Get-ModelsForMake` and `Update-CopyButtonState`, to accept a `State` parameter.
It replaces direct access to UI controls via `$window.FindName` with references from the `State` object, leading to more consistent and maintainable code.
This commit is contained in:
rbalsleyMSFT
2025-06-07 18:47:15 -07:00
parent 6eae7226be
commit 562529a26b
+38 -25
View File
@@ -272,17 +272,19 @@ function ConvertTo-StandardizedDriverModel {
function Get-ModelsForMake { function Get-ModelsForMake {
param( param(
[Parameter(Mandatory = $true)] [Parameter(Mandatory = $true)]
[string]$SelectedMake [string]$SelectedMake,
[Parameter(Mandatory = $true)]
[psobject]$State
) )
$standardizedModels = [System.Collections.Generic.List[PSCustomObject]]::new() $standardizedModels = [System.Collections.Generic.List[PSCustomObject]]::new()
$rawModels = @() $rawModels = @()
# Get necessary values from UI or script scope # Get necessary values from UI or script scope
$localDriversFolder = $window.FindName('txtDriversFolder').Text $localDriversFolder = $State.Controls.txtDriversFolder.Text
$localWindowsRelease = $null $localWindowsRelease = $null
if ($null -ne $window.FindName('cmbWindowsRelease').SelectedItem) { if ($null -ne $State.Controls.cmbWindowsRelease.SelectedItem) {
$localWindowsRelease = $window.FindName('cmbWindowsRelease').SelectedItem.Value $localWindowsRelease = $State.Controls.cmbWindowsRelease.SelectedItem.Value
} }
# $Headers and $UserAgent are available from script scope # $Headers and $UserAgent are available from script scope
@@ -308,7 +310,7 @@ function Get-ModelsForMake {
# User cancelled or entered nothing # User cancelled or entered nothing
return @() return @()
} }
$script:uiState.Controls.txtStatus.Text = "Searching Lenovo models for '$modelSearchTerm'..." $State.Controls.txtStatus.Text = "Searching Lenovo models for '$modelSearchTerm'..."
$rawModels = Get-LenovoDriversModelList -ModelSearchTerm $modelSearchTerm -Headers $Headers -UserAgent $UserAgent $rawModels = Get-LenovoDriversModelList -ModelSearchTerm $modelSearchTerm -Headers $Headers -UserAgent $UserAgent
} }
default { default {
@@ -769,11 +771,14 @@ $window = [Windows.Markup.XamlReader]::Load($xmlReader)
# Dynamic checkboxes for optional features in Windows Settings tab # Dynamic checkboxes for optional features in Windows Settings tab
function UpdateOptionalFeaturesString { function UpdateOptionalFeaturesString {
param(
[psobject]$State
)
$checkedFeatures = @() $checkedFeatures = @()
foreach ($entry in $script:uiState.Controls.featureCheckBoxes.GetEnumerator()) { foreach ($entry in $State.Controls.featureCheckBoxes.GetEnumerator()) {
if ($entry.Value.IsChecked) { $checkedFeatures += $entry.Key } if ($entry.Value.IsChecked) { $checkedFeatures += $entry.Key }
} }
$window.FindName('txtOptionalFeatures').Text = $checkedFeatures -join ";" $State.Controls.txtOptionalFeatures.Text = $checkedFeatures -join ";"
} }
function BuildFeaturesGrid { function BuildFeaturesGrid {
param ( param (
@@ -815,8 +820,8 @@ function BuildFeaturesGrid {
$chk = New-Object System.Windows.Controls.CheckBox $chk = New-Object System.Windows.Controls.CheckBox
$chk.Content = $featureName $chk.Content = $featureName
$chk.Margin = "5" $chk.Margin = "5"
$chk.Add_Checked({ UpdateOptionalFeaturesString }) $chk.Add_Checked({ UpdateOptionalFeaturesString -State $script:uiState })
$chk.Add_Unchecked({ UpdateOptionalFeaturesString }) $chk.Add_Unchecked({ UpdateOptionalFeaturesString -State $script:uiState })
$script:uiState.Controls.featureCheckBoxes[$featureName] = $chk # Track the checkbox $script:uiState.Controls.featureCheckBoxes[$featureName] = $chk # Track the checkbox
@@ -1106,7 +1111,7 @@ function Add-SelectableGridViewColumn {
return return
} }
$actualListView = $window.FindName($localListViewName) $actualListView = $script:uiState.Controls[$localListViewName]
if ($null -eq $actualListView) { if ($null -eq $actualListView) {
WriteLog "Add-SelectableGridViewColumn: CRITICAL - ListView control '$localListViewName' not found in window during HeaderChecked event. Aborting." WriteLog "Add-SelectableGridViewColumn: CRITICAL - ListView control '$localListViewName' not found in window during HeaderChecked event. Aborting."
return return
@@ -1156,7 +1161,7 @@ function Add-SelectableGridViewColumn {
return return
} }
$actualListView = $window.FindName($localListViewName) $actualListView = $script:uiState.Controls[$localListViewName]
if ($null -eq $actualListView) { if ($null -eq $actualListView) {
WriteLog "Add-SelectableGridViewColumn: CRITICAL - ListView control '$localListViewName' not found in window during HeaderUnchecked event. Aborting." WriteLog "Add-SelectableGridViewColumn: CRITICAL - ListView control '$localListViewName' not found in window during HeaderUnchecked event. Aborting."
return return
@@ -1249,7 +1254,7 @@ function Add-SelectableGridViewColumn {
} }
# Retrieve the actual ListView control using its name stored in the Tag # Retrieve the actual ListView control using its name stored in the Tag
$targetListView = $window.FindName($listViewNameFromTag) $targetListView = $script:uiState.Controls[$listViewNameFromTag]
if ($null -eq $targetListView) { if ($null -eq $targetListView) {
WriteLog "Add-SelectableGridViewColumn: Error - Could not find ListView control named '$listViewNameFromTag'." WriteLog "Add-SelectableGridViewColumn: Error - Could not find ListView control named '$listViewNameFromTag'."
return return
@@ -1411,8 +1416,11 @@ function Move-ListViewItemBottom {
# Function to update the enabled state of the Copy Apps button # Function to update the enabled state of the Copy Apps button
function Update-CopyButtonState { function Update-CopyButtonState {
$listView = $window.FindName('lstApplications') param(
$copyButton = $window.FindName('btnCopyBYOApps') [psobject]$State
)
$listView = $State.Controls.lstApplications
$copyButton = $State.Controls.btnCopyBYOApps
if ($listView -and $copyButton) { if ($listView -and $copyButton) {
$hasSource = $false $hasSource = $false
foreach ($item in $listView.Items) { foreach ($item in $listView.Items) {
@@ -1854,7 +1862,7 @@ $window.Add_Loaded({
$previouslySelectedModels = @($script:uiState.Data.allDriverModels | Where-Object { $_.IsSelected }) $previouslySelectedModels = @($script:uiState.Data.allDriverModels | Where-Object { $_.IsSelected })
# Get newly fetched models for the current make (already standardized) # Get newly fetched models for the current make (already standardized)
$newlyFetchedStandardizedModels = Get-ModelsForMake -SelectedMake $selectedMake $newlyFetchedStandardizedModels = Get-ModelsForMake -SelectedMake $selectedMake -State $script:uiState
$combinedModelsList = [System.Collections.Generic.List[PSCustomObject]]::new() $combinedModelsList = [System.Collections.Generic.List[PSCustomObject]]::new()
$modelIdentifiersInCombinedList = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase) $modelIdentifiersInCombinedList = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase)
@@ -2495,7 +2503,7 @@ $window.Add_Loaded({
$window.FindName('txtAppCommandLine').Text = "" $window.FindName('txtAppCommandLine').Text = ""
$window.FindName('txtAppArguments').Text = "" $window.FindName('txtAppArguments').Text = ""
$window.FindName('txtAppSource').Text = "" $window.FindName('txtAppSource').Text = ""
Update-CopyButtonState Update-CopyButtonState -State $script:uiState
}) })
$script:uiState.Controls.btnSaveBYOApplications.Add_Click({ $script:uiState.Controls.btnSaveBYOApplications.Add_Click({
$saveDialog = New-Object Microsoft.Win32.SaveFileDialog $saveDialog = New-Object Microsoft.Win32.SaveFileDialog
@@ -2515,11 +2523,11 @@ $window.Add_Loaded({
$initialDir = $window.FindName('txtApplicationPath').Text $initialDir = $window.FindName('txtApplicationPath').Text
if ([string]::IsNullOrWhiteSpace($initialDir) -or -not (Test-Path $initialDir)) { $initialDir = $PSScriptRoot } if ([string]::IsNullOrWhiteSpace($initialDir) -or -not (Test-Path $initialDir)) { $initialDir = $PSScriptRoot }
$openDialog.InitialDirectory = $initialDir $openDialog.InitialDirectory = $initialDir
if ($openDialog.ShowDialog()) { Import-BYOApplicationList -Path $openDialog.FileName; Update-CopyButtonState } if ($openDialog.ShowDialog()) { Import-BYOApplicationList -Path $openDialog.FileName; Update-CopyButtonState -State $script:uiState }
}) })
$script:uiState.Controls.btnClearBYOApplications.Add_Click({ $script:uiState.Controls.btnClearBYOApplications.Add_Click({
$result = [System.Windows.MessageBox]::Show("Are you sure you want to clear all applications?", "Clear Applications", [System.Windows.MessageBoxButton]::YesNo, [System.Windows.MessageBoxImage]::Question) $result = [System.Windows.MessageBox]::Show("Are you sure you want to clear all applications?", "Clear Applications", [System.Windows.MessageBoxButton]::YesNo, [System.Windows.MessageBoxImage]::Question)
if ($result -eq [System.Windows.MessageBoxResult]::Yes) { $window.FindName('lstApplications').Items.Clear(); Update-CopyButtonState } if ($result -eq [System.Windows.MessageBoxResult]::Yes) { $window.FindName('lstApplications').Items.Clear(); Update-CopyButtonState -State $script:uiState }
}) })
$script:uiState.Controls.btnCopyBYOApps.Add_Click({ $script:uiState.Controls.btnCopyBYOApps.Add_Click({
param($buttonSender, $clickEventArgs) param($buttonSender, $clickEventArgs)
@@ -2581,7 +2589,7 @@ $window.Add_Loaded({
if ($actionColumnIndex -ge 0) { $byoGridView.Columns.Insert($actionColumnIndex, $copyStatusColumn) } else { $byoGridView.Columns.Add($copyStatusColumn) } if ($actionColumnIndex -ge 0) { $byoGridView.Columns.Insert($actionColumnIndex, $copyStatusColumn) } else { $byoGridView.Columns.Add($copyStatusColumn) }
} }
} }
Update-CopyButtonState # Initial check Update-CopyButtonState -State $script:uiState # Initial check
# General Browse Button Handlers (Keep existing logic) # General Browse Button Handlers (Keep existing logic)
$script:uiState.Controls.btnBrowseFFUDevPath.Add_Click({ $script:uiState.Controls.btnBrowseFFUDevPath.Add_Click({
@@ -2894,9 +2902,12 @@ function Import-WingetList {
# Function to remove application and reorder priorities # Function to remove application and reorder priorities
function Remove-Application { function Remove-Application {
param($priority) param(
$priority,
[psobject]$State
)
$listView = $window.FindName('lstApplications') $listView = $State.Controls.lstApplications
# Remove the item with the specified priority # Remove the item with the specified priority
$itemToRemove = $listView.Items | Where-Object { $_.Priority -eq $priority } | Select-Object -First 1 $itemToRemove = $listView.Items | Where-Object { $_.Priority -eq $priority } | Select-Object -First 1
@@ -2905,7 +2916,7 @@ function Remove-Application {
# Reorder priorities for remaining items # Reorder priorities for remaining items
Update-ListViewPriorities -ListView $listView Update-ListViewPriorities -ListView $listView
# Update the Copy Apps button state # Update the Copy Apps button state
Update-CopyButtonState Update-CopyButtonState -State $State
} }
} }
@@ -2914,10 +2925,12 @@ function Save-BYOApplicationList {
[CmdletBinding()] [CmdletBinding()]
param( param(
[Parameter(Mandatory)] [Parameter(Mandatory)]
[string]$Path [string]$Path,
[Parameter(Mandatory)]
[psobject]$State
) )
$listView = $window.FindName('lstApplications') $listView = $State.Controls.lstApplications
if (-not $listView -or $listView.Items.Count -eq 0) { if (-not $listView -or $listView.Items.Count -eq 0) {
[System.Windows.MessageBox]::Show("No applications to save.", "Save Applications", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information) [System.Windows.MessageBox]::Show("No applications to save.", "Save Applications", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
return return
@@ -3330,7 +3343,7 @@ $window.Add_SourceInitialized({
[System.Windows.RoutedEventHandler] { [System.Windows.RoutedEventHandler] {
param($buttonSender, $clickEventArgs) param($buttonSender, $clickEventArgs)
if ($clickEventArgs.OriginalSource -is [System.Windows.Controls.Button] -and $clickEventArgs.OriginalSource.Content -eq "Remove") { if ($clickEventArgs.OriginalSource -is [System.Windows.Controls.Button] -and $clickEventArgs.OriginalSource.Content -eq "Remove") {
Remove-Application -priority $clickEventArgs.OriginalSource.Tag Remove-Application -priority $clickEventArgs.OriginalSource.Tag -State $script:uiState
} }
} }
) )