From fb214795317a91b52ae7426707a1439d3f506f81 Mon Sep 17 00:00:00 2001 From: "Mr.k" Date: Sat, 26 Oct 2024 17:12:52 +0300 Subject: [PATCH] Add a new 'Invoke-WPFPopup' Function to Better Handle Showing/Hiding/Toggling of Popups --- functions/public/Invoke-WPFPopup.ps1 | 91 +++++++++++++++++++++++++++ scripts/main.ps1 | 92 ++++++---------------------- 2 files changed, 109 insertions(+), 74 deletions(-) create mode 100644 functions/public/Invoke-WPFPopup.ps1 diff --git a/functions/public/Invoke-WPFPopup.ps1 b/functions/public/Invoke-WPFPopup.ps1 new file mode 100644 index 00000000..ea8942d1 --- /dev/null +++ b/functions/public/Invoke-WPFPopup.ps1 @@ -0,0 +1,91 @@ +function Invoke-WPFPopup { + param ( + [Parameter(position=0)] + [ValidateSet("Show","Hide","Toggle", ErrorMessage="Action '{0}' is not part of the valid set '{1}'.")] + [string]$Action = "", + + [Parameter(position=1)] + [string[]]$Popups = @(), + + [Parameter(position=2)] + [ValidateScript({ + $PossibleActions = @("Show", "Hide", "Toggle") + [hashtable]$UnExpectedPairs = @{} + Foreach ($pair in $_.GetEnumerator()) { + $key = $pair.Name + $value = $pair.Value + if (-not ($value -in $PossibleActions)) { + $UnExpectedPairs.Add("$key", "$value") + } + } + + if ($UnExpectedPairs.Count -gt 0) { + $UnExpectedPairsAsString = "@{" + Foreach ($pair in $UnExpectedPairs.GetEnumerator()) { $UnExpectedPairsAsString += "`"$($pair.Name)`" = `"$($pair.Value)`"; " } + $UnExpectedPairsAsString = $UnExpectedPairsAsString -replace (';\s*$', '') + $UnExpectedPairsAsString += "}" + throw "Found Unexpected pair(s), these Popup & Action pair(s) are: $UnExpectedPairsAsString" + } + + # Return true for passing validation checks + $true + })] + [hashtable]$PopupActionTable = @{} + ) + + if ($PopupActionTable.Count -eq 0 -and $Action -eq "" -and $Popups.Count -eq 0) { + throw [GenericException]::new("No Parameter was provided, please use either 'PopupActionTable' on its own, or use 'Action' and 'Popups' on their own, depending on your use case.") + } + if ($PopupActionTable.Count -gt 0 -and ($Action -ne "" -or $Popups.Count -gt 0)) { + throw [GenericException]::new("Only use 'PopupActionTable' on its own, or use 'Action' and 'Popups' on their own, depending on your use case.") + } + + $PopupsNotFound = [System.Collections.Generic.List[string]]::new($Popups.Count) + + if ($PopupActionTable.Count -gt 0) { + Foreach ($popupActionPair in $PopupActionTable.GetEnumerator()) { + $popup = $popupActionPair.Name + "Popup" + $action = $popupActionPair.Value + if ($sync.$popup -eq $null) { + $PopupsNotFound.Add("$popup") | Out-Null + continue + } + switch ($action) { + 'Show' { $actionAsBool = $true } + 'Hide' { $actionAsBool = $false } + 'Toggle' { $actionAsBool = -not $sync.$popup.IsOpen } + default { throw [GenericException]::new("Action can only be `"Show`" or `"Hide`" or `"Toggle`".") } + } + $sync.$popup.IsOpen = $actionAsBool + } + } else { + if ($Action -eq "" -or $Popups.Count -eq 0) { + throw [GenericException]::new("Please provide both the 'Action' and 'Popups' Parameters, with the appropriate values foreach parameter.") + } + Foreach ($popup in $Popups) { + $popup += "Popup" + if ($sync.$popup -eq $null) { + $PopupsNotFound.Add("$popup") | Out-Null + continue + } + switch ($action) { + 'Show' { $actionAsBool = $true } + 'Hide' { $actionAsBool = $false } + 'Toggle' { $actionAsBool = -not $sync.$popup.IsOpen } + default { throw [GenericException]::new("Action can only be `"Show`" or `"Hide`" or `"Toggle`".") } + } + $sync.$popup.IsOpen = $actionAsBool + } + } + + if ($PopupsNotFound.Count -gt 0) { + $PopupsNotFoundAsString = "@(" + Foreach ($popupNotFound in $PopupsNotFound) { + $PopupsNotFoundAsString += "$popupNotFound" + $PopupsNotFoundAsString += ", " + } + $PopupsNotFoundAsString = $PopupsNotFoundAsString -replace (',\s*$', '') + $PopupsNotFoundAsString += ")" + throw [GenericException]::new("Could not find $PopupsNotFoundAsString Popups in `$sync variable.") + } +} diff --git a/scripts/main.ps1 b/scripts/main.ps1 index e361a88e..b865d5e4 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -251,12 +251,7 @@ $commonKeyEvents = { $sync["Form"].Add_PreViewKeyDown($commonKeyEvents) $sync["Form"].Add_MouseLeftButtonDown({ - if ($sync.SettingsPopup -eq $null -or - $sync.ThemePopup -eq $null) { - Write-Host "Either Settings or Theme Popup is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.SettingsPopup.IsOpen = $false - $sync.ThemePopup.IsOpen = $false + Invoke-WPFPopup -Action "Hide" -Popups @("Settings", "Theme") $sync["Form"].DragMove() }) @@ -274,12 +269,7 @@ $sync["Form"].Add_MouseDoubleClick({ $sync["Form"].Add_Deactivated({ Write-Debug "WinUtil lost focus" - if ($sync.SettingsPopup -eq $null -or - $sync.ThemePopup -eq $null) { - Write-Host "Either Settings or Theme Popup is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.SettingsPopup.IsOpen = $false - $sync.ThemePopup.IsOpen = $false + Invoke-WPFPopup -Action "Hide" -Popups @("Settings", "Theme") }) $sync["Form"].Add_ContentRendered({ @@ -520,90 +510,53 @@ Set-WinUtilTaskbaritem -overlay "logo" $sync["Form"].Add_Activated({ Set-WinUtilTaskbaritem -overlay "logo" }) -# Define event handler for ThemeButton click + $sync["ThemeButton"].Add_Click({ - if ($sync.SettingsPopup -eq $null -or - $sync.ThemePopup -eq $null) { - Write-Host "Either Settings or Theme Popup is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - # Hide the settings popup and toggle the themes popup - $sync.ThemePopup.IsOpen = -not $sync.ThemePopup.IsOpen - $sync.SettingsPopup.IsOpen = $false + Write-Debug "ThemeButton clicked" + Invoke-WPFPopup -PopupActionTable @{ "Settings" = "Hide"; "Theme" = "Toggle" } $_.Handled = $false }) - -# Define event handlers for menu items $sync["AutoThemeMenuItem"].Add_Click({ - if ($sync.ThemePopup -eq $null) { - Write-Host "Theme Popup is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.ThemePopup.IsOpen = $false + Write-Debug "About clicked" + Invoke-WPFPopup -Action "Hide" -Popups @("Theme") Invoke-WinutilThemeChange -theme "Auto" $_.Handled = $false }) -# Define event handlers for menu items $sync["DarkThemeMenuItem"].Add_Click({ - if ($sync.ThemePopup -eq $null) { - Write-Host "Theme Popup is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.ThemePopup.IsOpen = $false + Write-Debug "Dark Theme clicked" + Invoke-WPFPopup -Action "Hide" -Popups @("Theme") Invoke-WinutilThemeChange -theme "Dark" $_.Handled = $false }) -# Define event handlers for menu items $sync["LightThemeMenuItem"].Add_Click({ - if ($sync.ThemePopup -eq $null) { - Write-Host "Theme Popup is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.ThemePopup.IsOpen = $false + Write-Debug "Light Theme clicked" + Invoke-WPFPopup -Action "Hide" -Popups @("Theme") Invoke-WinutilThemeChange -theme "Light" $_.Handled = $false }) -# Define event handler for button click $sync["SettingsButton"].Add_Click({ Write-Debug "SettingsButton clicked" - if ($sync.SettingsPopup -eq $null -or - $sync.ThemePopup -eq $null) { - Write-Host "Either Settings or Theme Popup is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - # Hide the themes popup and toggle the settings popup - $sync.SettingsPopup.IsOpen = -not $sync.SettingsPopup.IsOpen - $sync.ThemePopup.IsOpen = $false + Invoke-WPFPopup -PopupActionTable @{ "Settings" = "Toggle"; "Theme" = "Hide" } $_.Handled = $false }) - -# Define event handlers for menu items $sync["ImportMenuItem"].Add_Click({ - # Handle Import menu item click Write-Debug "Import clicked" - if ($sync.SettingsPopup -eq $null) { - Write-Host "Either Settings is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.SettingsPopup.IsOpen = $false + Invoke-WPFPopup -Action "Hide" -Popups @("Settings") Invoke-WPFImpex -type "import" $_.Handled = $false }) - $sync["ExportMenuItem"].Add_Click({ - # Handle Export menu item click Write-Debug "Export clicked" - if ($sync.SettingsPopup -eq $null) { - Write-Host "Either Settings is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.SettingsPopup.IsOpen = $false + Invoke-WPFPopup -Action "Hide" -Popups @("Settings") Invoke-WPFImpex -type "export" $_.Handled = $false }) - $sync["AboutMenuItem"].Add_Click({ - # Handle Export menu item click Write-Debug "About clicked" - if ($sync.SettingsPopup -eq $null) { - Write-Host "Either Settings is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.SettingsPopup.IsOpen = $false + Invoke-WPFPopup -Action "Hide" -Popups @("Settings") + $authorInfo = @" Author : @christitustech Runspace : @DeveloperDurp @@ -611,33 +564,24 @@ MicroWin : @KonTy, ChrisTitusTech/winutil Version : $($sync.version) "@ - Show-CustomDialog -Title "About" -Message $authorInfo }) - $sync["SponsorMenuItem"].Add_Click({ - # Handle Export menu item click Write-Debug "Sponsors clicked" - if ($sync.SettingsPopup -eq $null) { - Write-Host "Either Settings is null, this's not allowed to happen in the first place. Please double check your UI code." -ForegroundColor Red - } - $sync.SettingsPopup.IsOpen = $false + Invoke-WPFPopup -Action "Hide" -Popups @("Settings") + $authorInfo = @" Current sponsors for ChrisTitusTech: "@ $authorInfo += "`n" try { - # Call the function to get the sponsors $sponsors = Invoke-WinUtilSponsors - - # Append the sponsors to the authorInfo foreach ($sponsor in $sponsors) { $authorInfo += "$sponsor`n" } } catch { $authorInfo += "An error occurred while fetching or processing the sponsors: $_`n" } - Show-CustomDialog -Title "Sponsors" -Message $authorInfo -EnableScroll $true })