function Get-TabXaml { <# .SYNOPSIS Generates XAML for a tab in the WinUtil GUI This function is used to generate the XAML for the applications tab in the WinUtil GUI It takes the tabname and the number of columns to display the applications in as input and returns the XAML for the tab as output .PARAMETER tabname The name of the tab to generate XAML for .PARAMETER columncount The number of columns to display the applications in .OUTPUTS The XAML for the tab .EXAMPLE Get-TabXaml "applications" 3 #> param( [Parameter(Mandatory=$true)] $tabname, $columncount = 0 ) $organizedData = @{} # Iterate through JSON data and organize by panel and category foreach ($appName in $sync.configs.$tabname.PSObject.Properties.Name) { $appInfo = $sync.configs.$tabname.$appName # Create an object for the application $appObject = [PSCustomObject]@{ Name = $appName Category = $appInfo.Category Content = $appInfo.Content Choco = $appInfo.choco Winget = $appInfo.winget Panel = if ($columncount -gt 0 ) { "0" } else {$appInfo.panel} Link = $appInfo.link Description = $appInfo.description # Type is (Checkbox,Toggle,Button,Combobox ) (Default is Checkbox) Type = $appInfo.type ComboItems = $appInfo.ComboItems # Checked is the property to set startup checked status of checkbox (Default is false) Checked = $appInfo.Checked } if (-not $organizedData.ContainsKey($appObject.panel)) { $organizedData[$appObject.panel] = @{} } if (-not $organizedData[$appObject.panel].ContainsKey($appObject.Category)) { $organizedData[$appObject.panel][$appObject.Category] = @{} } # Store application data in a sub-array under the category # Add Order property to keep the original order of tweaks and features $organizedData[$appObject.panel][$appInfo.Category]["$($appInfo.order)$appName"] = $appObject } $panelcount=0 $paneltotal = $organizedData.Keys.Count if ($columncount -gt 0) { $appcount = $sync.configs.$tabname.PSObject.Properties.Name.count + $organizedData["0"].Keys.count $maxcount = [Math]::Round( $appcount / $columncount + 0.5) $paneltotal = $columncount } # add ColumnDefinitions to evenly draw colums $blockXml="`n"+("`n"*($paneltotal))+"`n" # Iterate through organizedData by panel, category, and application $count = 0 foreach ($panel in ($organizedData.Keys | Sort-Object)) { $blockXml += "`n`n" $panelcount++ foreach ($category in ($organizedData[$panel].Keys | Sort-Object)) { $count++ if ($columncount -gt 0) { $panelcount2 = [Int](($count)/$maxcount-0.5) if ($panelcount -eq $panelcount2 ) { $blockXml +="`n`n`n" $blockXml += "`n`n" $panelcount++ } } $blockXml += "`n`n" $blockXml += "`n`n" $panelcount++ } } $appInfo = $organizedData[$panel][$category][$appName] if ("Toggle" -eq $appInfo.Type) { $blockXml += "`n`n" } elseif ("Combobox" -eq $appInfo.Type) { $blockXml += "`n" # If it is a digit, type is button and button length is digits } elseif ($appInfo.Type -match "^[\d\.]+$") { $blockXml += "