From 2e757c5491f0428690eaef2937546e5b68399ca3 Mon Sep 17 00:00:00 2001 From: MyDrift Date: Sun, 1 Sep 2024 13:57:30 +0200 Subject: [PATCH] improve viewboxfunction - add logo + checkmark + warning - add params - render on param "render" - custom dialog logo function call fix - main logo function call fix - update winutiltaskbaritem to use new images --- .../private/Invoke-WinUtilLogoviewbox.ps1 | 272 +++++++++++++----- functions/private/Set-WinUtilTaskbarItem.ps1 | 6 +- functions/private/Show-CustomDialog.ps1 | 2 +- scripts/main.ps1 | 2 +- 4 files changed, 206 insertions(+), 76 deletions(-) diff --git a/functions/private/Invoke-WinUtilLogoviewbox.ps1 b/functions/private/Invoke-WinUtilLogoviewbox.ps1 index 72919a74..2552b26a 100644 --- a/functions/private/Invoke-WinUtilLogoviewbox.ps1 +++ b/functions/private/Invoke-WinUtilLogoviewbox.ps1 @@ -1,88 +1,218 @@ function Invoke-WinUtilLogoviewbox { - param ($Size) + param ( + $type, + $Size, + [switch]$render + ) + # Create the Viewbox and set its size $LogoViewbox = New-Object Windows.Controls.Viewbox $LogoViewbox.Width = $Size $LogoViewbox.Height = $Size + # Create a Canvas to hold the paths + $canvas = New-Object Windows.Controls.Canvas + $canvas.Width = 100 + $canvas.Height = 100 + # Define a scale factor for the content inside the Canvas $scaleFactor = $Size / 100 - # Part 1 - $LogoPathData1 = @" - M 18.00,14.00 - C 18.00,14.00 45.00,27.74 45.00,27.74 - 45.00,27.74 57.40,34.63 57.40,34.63 - 57.40,34.63 59.00,43.00 59.00,43.00 - 59.00,43.00 59.00,83.00 59.00,83.00 - 55.35,81.66 46.99,77.79 44.72,74.79 - 41.17,70.10 42.01,59.80 42.00,54.00 - 42.00,51.62 42.20,48.29 40.98,46.21 - 38.34,41.74 25.78,38.60 21.28,33.79 - 16.81,29.02 18.00,20.20 18.00,14.00 Z -"@ - $LogoPath1 = New-Object Windows.Shapes.Path - $LogoPath1.Data = [Windows.Media.Geometry]::Parse($LogoPathData1) - $LogoPath1.Fill = [Windows.Media.Brushes]::Blue # Set fill color for left part - - # Part 2 - $LogoPathData2 = @" - M 107.00,14.00 - C 109.01,19.06 108.93,30.37 104.66,34.21 - 100.47,37.98 86.38,43.10 84.60,47.21 - 83.94,48.74 84.01,51.32 84.00,53.00 - 83.97,57.04 84.46,68.90 83.26,72.00 - 81.06,77.70 72.54,81.42 67.00,83.00 - 67.00,83.00 67.00,43.00 67.00,43.00 - 67.00,43.00 67.99,35.63 67.99,35.63 - 67.99,35.63 80.00,28.26 80.00,28.26 - 80.00,28.26 107.00,14.00 107.00,14.00 Z -"@ - $LogoPath2 = New-Object Windows.Shapes.Path - $LogoPath2.Data = [Windows.Media.Geometry]::Parse($LogoPathData2) - $LogoPath2.Fill = [Windows.Media.Brushes]::Blue # Set fill color for right part - - # Part 3 - $LogoPathData3 = @" - M 20.00,46.00 - C 22.36,47.14 29.67,50.71 31.01,52.63 - 32.17,54.30 31.99,57.04 32.00,59.00 - 32.04,65.41 31.35,72.16 34.56,78.00 - 39.19,86.45 47.10,89.04 55.00,93.31 - 57.55,94.69 61.10,97.20 64.00,97.22 - 66.50,97.24 69.77,95.36 72.00,94.25 - 77.42,91.55 85.51,87.78 89.82,83.68 - 95.56,78.20 96.96,70.59 97.00,63.00 - 97.01,60.24 96.59,54.63 98.02,52.39 - 99.80,49.60 104.95,47.87 108.00,47.00 - 108.00,47.00 108.00,67.00 108.00,67.00 - 107.90,87.69 97.10,93.85 81.00,103.00 - 77.51,104.98 67.66,110.67 64.00,110.52 - 61.33,110.41 56.55,107.53 54.00,106.25 - 47.21,102.83 37.63,98.57 32.04,93.68 - 17.88,81.28 20.00,62.88 20.00,46.00 Z -"@ - $LogoPath3 = New-Object Windows.Shapes.Path - $LogoPath3.Data = [Windows.Media.Geometry]::Parse($LogoPathData3) - $LogoPath3.Fill = [Windows.Media.Brushes]::Gray # Set fill color for bottom part - - # Create a Canvas to hold the paths - $LogoCanvas = New-Object Windows.Controls.Canvas - $LogoCanvas.Width = 100 - $LogoCanvas.Height = 100 - # Apply a scale transform to the Canvas content $scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor) - $LogoCanvas.LayoutTransform = $scaleTransform + $canvas.LayoutTransform = $scaleTransform - # Add the paths to the Canvas - $LogoCanvas.Children.Add($LogoPath1) | Out-Null - $LogoCanvas.Children.Add($LogoPath2) | Out-Null - $LogoCanvas.Children.Add($LogoPath3) | Out-Null + switch ($type) { + 'logo' { + + # Part 1 + $LogoPathData1 = @" + M 18.00,14.00 + C 18.00,14.00 45.00,27.74 45.00,27.74 + 45.00,27.74 57.40,34.63 57.40,34.63 + 57.40,34.63 59.00,43.00 59.00,43.00 + 59.00,43.00 59.00,83.00 59.00,83.00 + 55.35,81.66 46.99,77.79 44.72,74.79 + 41.17,70.10 42.01,59.80 42.00,54.00 + 42.00,51.62 42.20,48.29 40.98,46.21 + 38.34,41.74 25.78,38.60 21.28,33.79 + 16.81,29.02 18.00,20.20 18.00,14.00 Z +"@ + $LogoPath1 = New-Object Windows.Shapes.Path + $LogoPath1.Data = [Windows.Media.Geometry]::Parse($LogoPathData1) + $LogoPath1.Fill = [Windows.Media.Brushes]::Blue # Set fill color for left part + + # Part 2 + $LogoPathData2 = @" + M 107.00,14.00 + C 109.01,19.06 108.93,30.37 104.66,34.21 + 100.47,37.98 86.38,43.10 84.60,47.21 + 83.94,48.74 84.01,51.32 84.00,53.00 + 83.97,57.04 84.46,68.90 83.26,72.00 + 81.06,77.70 72.54,81.42 67.00,83.00 + 67.00,83.00 67.00,43.00 67.00,43.00 + 67.00,43.00 67.99,35.63 67.99,35.63 + 67.99,35.63 80.00,28.26 80.00,28.26 + 80.00,28.26 107.00,14.00 107.00,14.00 Z +"@ + $LogoPath2 = New-Object Windows.Shapes.Path + $LogoPath2.Data = [Windows.Media.Geometry]::Parse($LogoPathData2) + $LogoPath2.Fill = [Windows.Media.Brushes]::Blue # Set fill color for right part + + # Part 3 + $LogoPathData3 = @" + M 20.00,46.00 + C 22.36,47.14 29.67,50.71 31.01,52.63 + 32.17,54.30 31.99,57.04 32.00,59.00 + 32.04,65.41 31.35,72.16 34.56,78.00 + 39.19,86.45 47.10,89.04 55.00,93.31 + 57.55,94.69 61.10,97.20 64.00,97.22 + 66.50,97.24 69.77,95.36 72.00,94.25 + 77.42,91.55 85.51,87.78 89.82,83.68 + 95.56,78.20 96.96,70.59 97.00,63.00 + 97.01,60.24 96.59,54.63 98.02,52.39 + 99.80,49.60 104.95,47.87 108.00,47.00 + 108.00,47.00 108.00,67.00 108.00,67.00 + 107.90,87.69 97.10,93.85 81.00,103.00 + 77.51,104.98 67.66,110.67 64.00,110.52 + 61.33,110.41 56.55,107.53 54.00,106.25 + 47.21,102.83 37.63,98.57 32.04,93.68 + 17.88,81.28 20.00,62.88 20.00,46.00 Z +"@ + $LogoPath3 = New-Object Windows.Shapes.Path + $LogoPath3.Data = [Windows.Media.Geometry]::Parse($LogoPathData3) + $LogoPath3.Fill = [Windows.Media.Brushes]::Gray # Set fill color for bottom part + + # Add the paths to the Canvas + $canvas.Children.Add($LogoPath1) | Out-Null + $canvas.Children.Add($LogoPath2) | Out-Null + $canvas.Children.Add($LogoPath3) | Out-Null + + } + 'checkmark' { + # Create a Canvas to hold the paths + $canvas = New-Object Windows.Controls.Canvas + $canvas.Width = 2.54 # Adjust to the needed size for the content + $canvas.Height = 2.54 + + # Define a scale factor for the content inside the Canvas + $scaleFactor = $Size / 2.54 # Adjust scaling based on the canvas size + $scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor) + $canvas.LayoutTransform = $scaleTransform + + # Define the circle path + $circlePathData = "M 1.27,0 A 1.27,1.27 0 1,0 1.27,2.54 A 1.27,1.27 0 1,0 1.27,0" + $circlePath = New-Object Windows.Shapes.Path + $circlePath.Data = [Windows.Media.Geometry]::Parse($circlePathData) + $circlePath.Fill = [Windows.Media.Brushes]::Green # Set fill color to green + + # Define the checkmark path + $checkmarkPathData = "M 0.873 1.89 L 0.41 1.391 A 0.17 0.17 0 0 1 0.418 1.151 A 0.17 0.17 0 0 1 0.658 1.16 L 1.016 1.543 L 1.583 1.013 A 0.17 0.17 0 0 1 1.599 1 L 1.865 0.751 A 0.17 0.17 0 0 1 2.105 0.759 A 0.17 0.17 0 0 1 2.097 0.999 L 1.282 1.759 L 0.999 2.022 L 0.874 1.888 Z" + $checkmarkPath = New-Object Windows.Shapes.Path + $checkmarkPath.Data = [Windows.Media.Geometry]::Parse($checkmarkPathData) + $checkmarkPath.Fill = [Windows.Media.Brushes]::White # Set fill color to white + + # Add the paths to the Canvas + $canvas.Children.Add($circlePath) | Out-Null + $canvas.Children.Add($checkmarkPath) | Out-Null + } + 'warning' { + # Create a Canvas to hold the paths + $canvas = New-Object Windows.Controls.Canvas + $canvas.Width = 512 # Adjust to the needed size for the warning icon + $canvas.Height = 512 + + # Define a scale factor for the content inside the Canvas + $scaleFactor = $Size / 512 # Adjust scaling based on the canvas size + $scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor) + $canvas.LayoutTransform = $scaleTransform + + # Define the circle path + $circlePathData = "M 256,0 A 256,256 0 1,0 256,512 A 256,256 0 1,0 256,0" + $circlePath = New-Object Windows.Shapes.Path + $circlePath.Data = [Windows.Media.Geometry]::Parse($circlePathData) + $circlePath.Fill = [Windows.Media.Brushes]::Red # Set fill color to red + + # Define the exclamation mark path + $exclamationPathData = "M 256 307.2 A 35.89 35.89 0 0 1 220.14 272.74 L 215.41 153.3 A 35.89 35.89 0 0 1 251.27 116 H 260.73 A 35.89 35.89 0 0 1 296.59 153.3 L 291.86 272.74 A 35.89 35.89 0 0 1 256 307.2 Z" + $exclamationPath = New-Object Windows.Shapes.Path + $exclamationPath.Data = [Windows.Media.Geometry]::Parse($exclamationPathData) + $exclamationPath.Fill = [Windows.Media.Brushes]::White # Set fill color to white + + # Calculate the center position for the exclamation mark path + # Get the bounds of the exclamation mark path + $exclamationBounds = $exclamationPath.Data.Bounds + + # Calculate the center position for the exclamation mark path + $exclamationCenterX = ($canvas.Width - $exclamationBounds.Width) / 2 - $exclamationBounds.X + $exclamationPath.SetValue([Windows.Controls.Canvas]::LeftProperty, $exclamationCenterX) + + + + # Define the rounded rectangle at the bottom (dot of exclamation mark) + $roundedRectangle = New-Object Windows.Shapes.Rectangle + $roundedRectangle.Width = 80 + $roundedRectangle.Height = 80 + $roundedRectangle.RadiusX = 30 + $roundedRectangle.RadiusY = 30 + $roundedRectangle.Fill = [Windows.Media.Brushes]::White + + # Calculate the center position for the rounded rectangle + $centerX = ($canvas.Width - $roundedRectangle.Width) / 2 + $roundedRectangle.SetValue([Windows.Controls.Canvas]::LeftProperty, $centerX) + $roundedRectangle.SetValue([Windows.Controls.Canvas]::TopProperty, 324.34) + + + # Add the paths to the Canvas + $canvas.Children.Add($circlePath) | Out-Null + $canvas.Children.Add($exclamationPath) | Out-Null + $canvas.Children.Add($roundedRectangle) | Out-Null + + # Add the Canvas to the Viewbox + $LogoViewbox.Child = $canvas + } + default { + Write-Host "Invalid type: $type" + } + } # Add the Canvas to the Viewbox - $LogoViewbox.Child = $LogoCanvas + $LogoViewbox.Child = $canvas - return $LogoViewbox + if ($render) { + # Measure and arrange the canvas to ensure proper rendering + $canvas.Measure([Windows.Size]::new($canvas.Width, $canvas.Height)) + $canvas.Arrange([Windows.Rect]::new(0, 0, $canvas.Width, $canvas.Height)) + $canvas.UpdateLayout() + + # Initialize RenderTargetBitmap correctly with dimensions + $renderTargetBitmap = New-Object Windows.Media.Imaging.RenderTargetBitmap($canvas.Width, $canvas.Height, 96, 96, [Windows.Media.PixelFormats]::Pbgra32) + + # Render the canvas to the bitmap + $renderTargetBitmap.Render($canvas) + + # Create a BitmapFrame from the RenderTargetBitmap + $bitmapFrame = [Windows.Media.Imaging.BitmapFrame]::Create($renderTargetBitmap) + + # Create a PngBitmapEncoder and add the frame + $bitmapEncoder = [Windows.Media.Imaging.PngBitmapEncoder]::new() + $bitmapEncoder.Frames.Add($bitmapFrame) + + # Save to a memory stream + $imageStream = New-Object System.IO.MemoryStream + $bitmapEncoder.Save($imageStream) + $imageStream.Position = 0 + + # Load the stream into a BitmapImage + $bitmapImage = [Windows.Media.Imaging.BitmapImage]::new() + $bitmapImage.BeginInit() + $bitmapImage.StreamSource = $imageStream + $bitmapImage.CacheOption = [Windows.Media.Imaging.BitmapCacheOption]::OnLoad + $bitmapImage.EndInit() + + return $bitmapImage + } else { + return $LogoViewbox + } } diff --git a/functions/private/Set-WinUtilTaskbarItem.ps1 b/functions/private/Set-WinUtilTaskbarItem.ps1 index 465ca4c3..16413200 100644 --- a/functions/private/Set-WinUtilTaskbarItem.ps1 +++ b/functions/private/Set-WinUtilTaskbarItem.ps1 @@ -61,13 +61,13 @@ function Set-WinUtilTaskbaritem { if ($overlay) { switch ($overlay) { 'logo' { - $sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\cttlogo.png" + $sync["Form"].taskbarItemInfo.Overlay = (Invoke-WinUtilLogoviewbox -Type "Logo" -Size 80 -Render) } 'checkmark' { - $sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\checkmark.png" + $sync["Form"].taskbarItemInfo.Overlay = (Invoke-WinUtilLogoviewbox -Type "checkmark" -Size 80 -Render) } 'warning' { - $sync["Form"].taskbarItemInfo.Overlay = "$env:LOCALAPPDATA\winutil\warning.png" + $sync["Form"].taskbarItemInfo.Overlay = (Invoke-WinUtilLogoviewbox -Type "warning" -Size 80 -Render) } 'None' { $sync["Form"].taskbarItemInfo.Overlay = $null diff --git a/functions/private/Show-CustomDialog.ps1 b/functions/private/Show-CustomDialog.ps1 index 7e6c63ef..1cc3b6b3 100644 --- a/functions/private/Show-CustomDialog.ps1 +++ b/functions/private/Show-CustomDialog.ps1 @@ -129,7 +129,7 @@ function Show-CustomDialog { [Windows.Controls.Grid]::SetRow($stackPanel, 0) # Set the row to the second row (0-based index) # Add SVG path to the stack panel - $stackPanel.Children.Add((Invoke-WinUtilLogoviewbox -Size 25)) + $stackPanel.Children.Add((Invoke-WinUtilLogoviewbox -Type "logo" -Size 25)) # Add "Winutil" text $winutilTextBlock = New-Object Windows.Controls.TextBlock diff --git a/scripts/main.ps1 b/scripts/main.ps1 index 752ddc3e..55261291 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -446,7 +446,7 @@ $sync["Form"].Add_Loaded({ }) $NavLogoPanel = $sync["Form"].FindName("NavLogoPanel") -$NavLogoPanel.Children.Add((Invoke-WinUtilLogoviewbox -Size 25)) | Out-Null +$NavLogoPanel.Children.Add((Invoke-WinUtilLogoviewbox -Type "logo" -Size 25)) | Out-Null # Initialize the hashtable $winutildir = @{}