mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2025-06-28 09:04:47 -05:00
Better Image handling (#2665)
* enhance asset mgmt - invoke ico directly - invoke ico only at shortcut creation - remove "ConvertTo-Icon" Function file - removed image from xaml - added stackpanel to xaml - added functions to create viewbox with image - added logic to add image via code to xaml & customdialog - changed title color for customdialog - remove webinvokes for assets from main.ps1 TODO: convert images into bitmap base64 string & add them directly into invoke-WinUtiltaskbaritem.ps1 * 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 * fix sizing - warning & checkmark sizing fix - remove unneded comments * fixes - remove unneeded redundancy of "$canvas = New-Object Windows.Controls.Canvas" - adjust empty lines - use LimeGreen instead of Green * fix layouting * fixes - use correct ctt blue color #0567ff - remove unneeded comments - rename Logoview to assets * performance improvement instead of rendering the image another time on each item switch, it caches it at the start and uses the render afterwards * redo gray part of winutil logo * correct gray shade * fix coloring * ise ico if available --------- Co-authored-by: Chris Titus <contact@christitus.com>
This commit is contained in:
199
functions/private/Invoke-WinUtilAssets.ps1
Normal file
199
functions/private/Invoke-WinUtilAssets.ps1
Normal file
@ -0,0 +1,199 @@
|
||||
function Invoke-WinUtilAssets {
|
||||
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
|
||||
|
||||
# Apply a scale transform to the Canvas content
|
||||
$scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor)
|
||||
$canvas.LayoutTransform = $scaleTransform
|
||||
|
||||
switch ($type) {
|
||||
'logo' {
|
||||
$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 = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#0567ff")
|
||||
|
||||
$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 = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#0567ff")
|
||||
|
||||
$LogoPathData3 = @"
|
||||
M 19.00,46.00
|
||||
C 21.36,47.14 28.67,50.71 30.01,52.63
|
||||
31.17,54.30 30.99,57.04 31.00,59.00
|
||||
31.04,65.41 30.35,72.16 33.56,78.00
|
||||
38.19,86.45 46.10,89.04 54.00,93.31
|
||||
56.55,94.69 60.10,97.20 63.00,97.22
|
||||
65.50,97.24 68.77,95.36 71.00,94.25
|
||||
76.42,91.55 84.51,87.78 88.82,83.68
|
||||
94.56,78.20 95.96,70.59 96.00,63.00
|
||||
96.01,60.24 95.59,54.63 97.02,52.39
|
||||
98.80,49.60 103.95,47.87 107.00,47.00
|
||||
107.00,47.00 107.00,67.00 107.00,67.00
|
||||
106.90,87.69 96.10,93.85 80.00,103.00
|
||||
76.51,104.98 66.66,110.67 63.00,110.52
|
||||
60.33,110.41 55.55,107.53 53.00,106.25
|
||||
46.21,102.83 36.63,98.57 31.04,93.68
|
||||
16.88,81.28 19.00,62.88 19.00,46.00 Z
|
||||
"@
|
||||
$LogoPath3 = New-Object Windows.Shapes.Path
|
||||
$LogoPath3.Data = [Windows.Media.Geometry]::Parse($LogoPathData3)
|
||||
$LogoPath3.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#a3a4a6")
|
||||
|
||||
$canvas.Children.Add($LogoPath1) | Out-Null
|
||||
$canvas.Children.Add($LogoPath2) | Out-Null
|
||||
$canvas.Children.Add($LogoPath3) | Out-Null
|
||||
}
|
||||
'checkmark' {
|
||||
$canvas.Width = 512
|
||||
$canvas.Height = 512
|
||||
|
||||
$scaleFactor = $Size / 2.54
|
||||
$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 = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#39ba00")
|
||||
|
||||
# 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
|
||||
|
||||
# Add the paths to the Canvas
|
||||
$canvas.Children.Add($circlePath) | Out-Null
|
||||
$canvas.Children.Add($checkmarkPath) | Out-Null
|
||||
}
|
||||
'warning' {
|
||||
$canvas.Width = 512
|
||||
$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 = [System.Windows.Media.BrushConverter]::new().ConvertFromString("#f41b43")
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
}
|
||||
default {
|
||||
Write-Host "Invalid type: $type"
|
||||
}
|
||||
}
|
||||
|
||||
# Add the Canvas to the Viewbox
|
||||
$LogoViewbox.Child = $canvas
|
||||
|
||||
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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user