mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2026-08-09 09:31:15 +10:00
8d3adb599f
* Replace FOSS dot with a corner badge on app entries - Add New-WinUtilFossBadge, the open source keyhole on a green backdrop - Mark FOSS apps with a corner triangle instead of a dot after the name - Give the FOSS legend a circle badge and move it below the buttons - Sort Note entries last, they shared a rank with checkboxes before Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Update functions/private/Initialize-InstallAppEntry.ps1 Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
121 lines
5.8 KiB
PowerShell
121 lines
5.8 KiB
PowerShell
function Initialize-InstallAppEntry {
|
|
<#
|
|
.SYNOPSIS
|
|
Creates the app entry to be placed on the install tab for a given app
|
|
Used to as part of the Install Tab UI generation
|
|
.PARAMETER TargetElement
|
|
The Element into which the Apps should be placed
|
|
.PARAMETER appKey
|
|
The Key of the app inside the $sync.configs.applicationsHashtable
|
|
#>
|
|
param(
|
|
[Windows.Controls.WrapPanel]$TargetElement,
|
|
$appKey
|
|
)
|
|
|
|
$app = $sync.configs.applicationsHashtable.$appKey
|
|
|
|
# Create the outer Border for the application type
|
|
$border = New-Object Windows.Controls.Border
|
|
$border.Style = $sync.Form.Resources.AppEntryBorderStyle
|
|
$border.Tag = $appKey
|
|
$border.ToolTip = $app.description
|
|
$border.Add_MouseLeftButtonUp({
|
|
# Resolve through $sync because the border's child is a layout Grid for FOSS entries
|
|
$childCheckbox = $sync.$($this.Tag)
|
|
$childCheckbox.IsChecked = -not $childCheckbox.IsChecked
|
|
})
|
|
$border.Add_MouseEnter({
|
|
if (($sync.$($this.Tag).IsChecked) -eq $false) {
|
|
$this.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, "AppInstallHighlightedColor")
|
|
}
|
|
})
|
|
$border.Add_MouseLeave({
|
|
if (($sync.$($this.Tag).IsChecked) -eq $false) {
|
|
$this.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, "AppInstallUnselectedColor")
|
|
}
|
|
})
|
|
$border.Add_MouseRightButtonUp({
|
|
# Store the selected app in a global variable so it can be used in the popup
|
|
$sync.appPopupSelectedApp = $this.Tag
|
|
# Set the popup position to the current mouse position
|
|
$sync.appPopup.PlacementTarget = $this
|
|
$sync.appPopup.IsOpen = $true
|
|
})
|
|
|
|
$checkBox = New-Object Windows.Controls.CheckBox
|
|
# Sanitize the name for WPF
|
|
$checkBox.Name = $appKey -replace '-', '_'
|
|
# Store the original appKey in Tag
|
|
$checkBox.Tag = $appKey
|
|
$checkbox.Style = $sync.Form.Resources.AppEntryCheckboxStyle
|
|
# The checkbox sits inside the entry layout Grid, so the border is one level further up
|
|
$checkbox.Add_Checked({
|
|
Invoke-WPFSelectedCheckboxesUpdate -type "Add" -checkboxName $this.Tag
|
|
$borderElement = $this.Parent.Parent
|
|
$borderElement.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, "AppInstallSelectedColor")
|
|
})
|
|
|
|
$checkbox.Add_Unchecked({
|
|
Invoke-WPFSelectedCheckboxesUpdate -type "Remove" -checkboxName $this.Tag
|
|
$borderElement = $this.Parent.Parent
|
|
$borderElement.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, "AppInstallUnselectedColor")
|
|
})
|
|
|
|
$contentPanel = New-Object Windows.Controls.StackPanel
|
|
$contentPanel.Orientation = "Horizontal"
|
|
$contentPanel.VerticalAlignment = [Windows.VerticalAlignment]::Center
|
|
|
|
$icon = New-Object Windows.Controls.Grid
|
|
$icon.SetResourceReference([Windows.FrameworkElement]::WidthProperty, "AppEntryIconSize")
|
|
$icon.SetResourceReference([Windows.FrameworkElement]::HeightProperty, "AppEntryIconSize")
|
|
$icon.Margin = New-Object Windows.Thickness(0, 0, 8, 0)
|
|
$fallback = New-Object Windows.Controls.TextBlock
|
|
$fallback.Text = $app.content.TrimStart(".").Substring(0, 1).ToUpper()
|
|
$fallback.FontWeight = "Bold"; $fallback.HorizontalAlignment = "Center"; $fallback.VerticalAlignment = "Center"
|
|
if ($app.link) { $fallback.Visibility = "Collapsed" }
|
|
$fallback.SetResourceReference([Windows.Controls.TextBlock]::FontSizeProperty, "AppEntryFontSize")
|
|
$fallback.SetResourceReference([Windows.Controls.TextBlock]::ForegroundProperty, "ToggleButtonOnColor")
|
|
[void]$icon.Children.Add($fallback)
|
|
if ($app.link) {
|
|
$logo = New-Object Windows.Controls.Image
|
|
$logo.Stretch = [Windows.Media.Stretch]::Uniform
|
|
$logo.Source = "https://www.google.com/s2/favicons?sz=64&domain_url=$([uri]::EscapeDataString($app.link))"
|
|
$logo.Add_ImageFailed({ $this.Visibility = "Collapsed"; $this.Parent.Children[0].Visibility = "Visible" })
|
|
[void]$icon.Children.Add($logo)
|
|
}
|
|
[void]$contentPanel.Children.Add($icon)
|
|
|
|
# Create the TextBlock for the application name
|
|
$appName = New-Object Windows.Controls.TextBlock
|
|
$appName.Style = $sync.Form.Resources.AppEntryNameStyle
|
|
$appName.Text = $app.content
|
|
[void]$contentPanel.Children.Add($appName)
|
|
$checkBox.Content = $contentPanel
|
|
|
|
# Add accessibility properties to make the elements screen reader friendly
|
|
$checkBox.SetValue([Windows.Automation.AutomationProperties]::NameProperty, $app.content)
|
|
$border.SetValue([Windows.Automation.AutomationProperties]::NameProperty, $app.content)
|
|
|
|
# Keep the same layout for every entry so the checkbox handlers can reach the border
|
|
$entryLayout = New-Object Windows.Controls.Grid
|
|
[void]$entryLayout.Children.Add($checkBox)
|
|
|
|
# Mark FOSS apps with a corner badge, bled into the border padding so it sits on the edge
|
|
if ($app.foss -eq $true) {
|
|
$fossBadge = New-WinUtilFossBadge
|
|
$fossBadge.HorizontalAlignment = "Right"
|
|
$fossBadge.VerticalAlignment = "Top"
|
|
$fossBadge.Margin = New-Object Windows.Thickness(0, -4, -6, 0)
|
|
|
|
[void]$entryLayout.Children.Add($fossBadge)
|
|
}
|
|
$border.Child = $entryLayout
|
|
if ($sync.selectedApps -contains $appKey) {
|
|
$checkBox.IsChecked = $true
|
|
}
|
|
# Add the border to the corresponding Category
|
|
$TargetElement.Children.Add($border) | Out-Null
|
|
return $checkbox
|
|
}
|