diff --git a/Compile.ps1 b/Compile.ps1
index f86fbce6..6f7a0313 100644
--- a/Compile.ps1
+++ b/Compile.ps1
@@ -64,38 +64,14 @@ Get-ChildItem "$workingdir\functions" -Recurse -File | ForEach-Object {
}
Update-Progress "Adding: Config *.json" 40
Get-ChildItem "$workingdir\config" | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
-
$json = (Get-Content $psitem.FullName).replace("'","''")
-
- # Replace every XML Special Character so it'll render correctly in final build
- # Only do so if json files has content to be displayed (for example the applications, tweaks, features json files)
- # Make an Array List containing every name at first level of Json File
- $jsonAsObject = $json | convertfrom-json
- $firstLevelJsonList = [System.Collections.ArrayList]::new()
- $jsonAsObject.PSObject.Properties.Name | ForEach-Object {$null = $firstLevelJsonList.Add($_)}
- # Note:
- # Avoid using HTML Entity Codes, for example '”' (stands for "Right Double Quotation Mark"),
- # Use **HTML decimal/hex codes instead**, as using HTML Entity Codes will result in XML parse Error when running the compiled script.
- for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) {
- $firstLevelName = $firstLevelJsonList[$i]
- if ($jsonAsObject.$firstLevelName.content -ne $null) {
- $jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('&','&').replace('“','“').replace('”','”').replace("'",''').replace('<','<').replace('>','>').replace('—','—')
- $jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('''',"'") # resolves the Double Apostrophe caused by the first replace function in the main loop
- }
- if ($jsonAsObject.$firstLevelName.description -ne $null) {
- $jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('&','&').replace('“','“').replace('”','”').replace("'",''').replace('<','<').replace('>','>').replace('—','—')
- $jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('''',"'") # resolves the Double Apostrophe caused by the first replace function in the main loop
- }
- }
+ $jsonAsObject = $json | convertfrom-json
# Add 'WPFInstall' as a prefix to every entry-name in 'applications.json' file
if ($psitem.Name -eq "applications.json") {
- for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) {
- $appEntryName = $firstLevelJsonList[$i]
+ foreach ($appEntryName in $jsonAsObject.PSObject.Properties.Name) {
$appEntryContent = $jsonAsObject.$appEntryName
- # Remove the entire app entry, so we could add it later with a different name
$jsonAsObject.PSObject.Properties.Remove($appEntryName)
- # Add the app entry, but with a different name (WPFInstall + The App Entry Name)
$jsonAsObject | Add-Member -MemberType NoteProperty -Name "WPFInstall$appEntryName" -Value $appEntryContent
}
}
@@ -110,20 +86,7 @@ Get-ChildItem "$workingdir\config" | Where-Object {$psitem.extension -eq ".json"
$xaml = (Get-Content "$workingdir\xaml\inputXML.xaml").replace("'","''")
-# Dot-source the Get-TabXaml function
-. "$workingdir\functions\private\Get-TabXaml.ps1"
-
-Update-Progress "Building: Xaml " 75
-$appXamlContent = Get-TabXaml "applications" 5
-$tweaksXamlContent = Get-TabXaml "tweaks"
-$featuresXamlContent = Get-TabXaml "feature"
-
-
Update-Progress "Adding: Xaml " 90
-# Replace the placeholder in $inputXML with the content of inputApp.xaml
-$xaml = $xaml -replace "{{InstallPanel_applications}}", $appXamlContent
-$xaml = $xaml -replace "{{InstallPanel_tweaks}}", $tweaksXamlContent
-$xaml = $xaml -replace "{{InstallPanel_features}}", $featuresXamlContent
$script_content.Add($(Write-output "`$inputXML = '$xaml'"))
diff --git a/functions/private/Get-TabXaml.ps1 b/functions/private/Get-TabXaml.ps1
deleted file mode 100644
index 5eef6417..00000000
--- a/functions/private/Get-TabXaml.ps1
+++ /dev/null
@@ -1,221 +0,0 @@
-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
- Note: the 'tabname' parameter must equal one of the json files found in $sync.configs variable
- Otherwise, it'll throw an exception
-
- .PARAMETER columncount
- The number of columns to display the applications in, default is 0
-
- .OUTPUTS
- The XAML for the tab
-
- .EXAMPLE
- Get-TabXaml "applications" 3
- #>
-
-
- param(
- [Parameter(Mandatory, position=0)]
- [string]$tabname,
-
- [Parameter(position=1)]
- [ValidateRange(0,10)] # 10 panels as max number is more then enough
- [int]$columncount = 0
- )
-
- # Validate tabname
- if ($sync.configs.$tabname -eq $null) {
- throw "Invalid parameter passed, can't find '$tabname' in '`$sync.configs' variable, please double check any calls to 'Get-TabXaml' function."
- }
-
- $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
- ButtonWidth = $appInfo.ButtonWidth
- }
-
- 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
- }
-
- # Same tab amount in last line of 'inputXML.xaml' file
- # TODO: Get the base repeat (amount) of tabs from last line (or even lines)
- # so it can dynamicly react to whatever is before this generated XML string.
- # .. may be solve this even before calling this function, and pass the result as a parameter?
- $tab_repeat = 7
- $spaces_per_tab = 4 # The convenction used across the code base
- $tab_as_spaces = $(" " * $spaces_per_tab)
- $precal_indent = $($tab_as_spaces * $tab_repeat)
- $precal_indent_p1 = $($tab_as_spaces * ($tab_repeat + 1))
- $precal_indent_p2 = $($tab_as_spaces * ($tab_repeat + 2))
- $precal_indent_m1 = $($tab_as_spaces * ($tab_repeat - 1))
- $precal_indent_m2 = $($tab_as_spaces * ($tab_repeat - 2))
-
- # Calculate the needed number of panels
- $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 = ""
- $blockXml += $("`r`n" + " " * ($spaces_per_tab * $tab_repeat) +
- "") * $paneltotal
- $blockXml += $("`r`n" + " " * ($spaces_per_tab * ($tab_repeat - 1))) +
- "" + "`r`n"
-
- # Iterate through 'organizedData' by panel, category, and application
- $count = 0
- foreach ($panel in ($organizedData.Keys | Sort-Object)) {
- $blockXml += $precal_indent_m1 + "" + "`r`n"
- $blockXml += $precal_indent + "" + "`r`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 += $precal_indent_p2 + "" + "`r`n"
- $blockXml += $precal_indent_p1 + "" + "`r`n"
- $blockXml += $precal_indent_p1 + "" + "`r`n"
- $blockXml += $precal_indent_p2 + "" + "`r`n"
- $panelcount++
- }
- }
-
- # Dot-source the Get-WPFObjectName function
- . "$($sync.PSScriptRoot)\functions\private\Get-WPFObjectName.ps1"
-
- $categorycontent = $($category -replace '^.__', '')
- $categoryname = Get-WPFObjectName -type "Label" -name $categorycontent
- $blockXml += $("`r`n" + " " * ($spaces_per_tab * $tab_repeat)) +
- "" + "`r`n" + "`r`n"
- $sortedApps = $organizedData[$panel][$category].Keys | Sort-Object
- foreach ($appName in $sortedApps) {
- $count++
-
- if ($columncount -gt 0) {
- $panelcount2 = [Int](($count)/$maxcount-0.5)
- # Verify the indentation actually works...
- if ($panelcount -eq $panelcount2 ) {
- $blockXml += $precal_indent_m1 +
- "" + "`r`n"
- $blockXml += $precal_indent_m2 +
- "" + "`r`n"
- $blockXml += $precal_indent_m2 +
- "" + "`r`n"
- $blockXml += $precal_indent_m1 +
- "" + "`r`n"
- $panelcount++
- }
- }
-
- $appInfo = $organizedData[$panel][$category][$appName]
- switch ($appInfo.Type) {
- "Toggle" {
- $blockXml += $precal_indent_m1 +
- "" + "`r`n"
- $blockXml += $precal_indent +
- "" + "`r`n"
- $blockXml += $precal_indent +
- "" + "`r`n"
- $blockXml += $precal_indent_m1 +
- "" + "`r`n"
- }
-
- "Combobox" {
- $blockXml += $precal_indent_m1 +
- "" + "`r`n"
- $blockXml += $precal_indent + "" + "`r`n"
- $blockXml += $precal_indent +
- "" + "`r`n"
-
- $addfirst="IsSelected=""True"""
- foreach ($comboitem in ($appInfo.ComboItems -split " ")) {
- $blockXml += $precal_indent_p1 +
- "" + "`r`n"
- $addfirst=""
- }
-
- $blockXml += $precal_indent_p1 + "" + "`r`n"
- $blockXml += $precal_indent + "" + "`r`n"
- }
-
- "Button" {
- if ($appInfo.ButtonWidth -ne $null) {
- $ButtonWidthStr = "Width=""$($appInfo.ButtonWidth)"""
- }
- $blockXml += $precal_indent +
- "" + "`r`n"
- }
-
- # else it is a checkbox
- default {
- $checkedStatus = If ($appInfo.Checked -eq $null) {""} else {" IsChecked=""$($appInfo.Checked)"""}
- if ($appInfo.Link -eq $null) {
- $blockXml += $precal_indent +
- "" + "`r`n"
- } else {
- $blockXml += $precal_indent +
- "" + "`r`n"
- $blockXml += $precal_indent_p1 +
- "" + "`r`n"
- $blockXml += $precal_indent_p1 +
- "" + "`r`n"
- $blockXml += $precal_indent +
- "" + "`r`n"
- }
- }
- }
- }
- }
-
- $blockXml += $precal_indent_p1 + "" + "`r`n"
- $blockXml += $precal_indent + "" + "`r`n"
- }
- return ($blockXml)
-}
diff --git a/functions/public/Invoke-WPFUIElements.ps1 b/functions/public/Invoke-WPFUIElements.ps1
new file mode 100644
index 00000000..2319d6fe
--- /dev/null
+++ b/functions/public/Invoke-WPFUIElements.ps1
@@ -0,0 +1,325 @@
+function Invoke-WPFUIElements {
+ <#
+ .SYNOPSIS
+ Adds UI elements to a specified Grid in the WinUtil GUI based on a JSON configuration.
+ .PARAMETER configVariable
+ The variable/link containing the JSON configuration.
+ .PARAMETER targetGridName
+ The name of the grid to which the UI elements should be added.
+ .PARAMETER columncount
+ The number of columns to be used in the Grid. If not provided, a default value is used based on the panel.
+ .EXAMPLE
+ Invoke-WPFUIElements -configVariable $sync.configs.applications -targetGridName "install" -columncount 5
+ .NOTES
+ Future me/contributer: If possible please wrap this into a runspace to make it load all panels at the same time.
+ #>
+
+ param(
+ [Parameter(Mandatory, position=0)]
+ [PSCustomObject]$configVariable,
+
+ [Parameter(Mandatory, position=1)]
+ [string]$targetGridName,
+
+ [Parameter(Mandatory, position=2)]
+ [int]$columncount
+ )
+
+ $window = $sync["Form"]
+
+ $theme = $sync.configs.themes.$ctttheme
+ $borderstyle = $window.FindResource("BorderStyle")
+ $HoverTextBlockStyle = $window.FindResource("HoverTextBlockStyle")
+ $ColorfulToggleSwitchStyle = $window.FindResource("ColorfulToggleSwitchStyle")
+
+ if (!$borderstyle -or !$HoverTextBlockStyle -or !$ColorfulToggleSwitchStyle) {
+ throw "Failed to retrieve Styles using 'FindResource' from main window element."
+ }
+
+ $targetGrid = $window.FindName($targetGridName)
+
+ if (!$targetGrid) {
+ throw "Failed to retrieve Target Grid by name, provided name: $targetGrid"
+ }
+
+ # Clear existing ColumnDefinitions and Children
+ $targetGrid.ColumnDefinitions.Clear() | Out-Null
+ $targetGrid.Children.Clear() | Out-Null
+
+ # Add ColumnDefinitions to the target Grid
+ for ($i = 0; $i -lt $columncount; $i++) {
+ $colDef = New-Object Windows.Controls.ColumnDefinition
+ $colDef.Width = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Star)
+ $targetGrid.ColumnDefinitions.Add($colDef) | Out-Null
+ }
+
+ # Convert PSCustomObject to Hashtable
+ $configHashtable = @{}
+ $configVariable.PSObject.Properties.Name | ForEach-Object {
+ $configHashtable[$_] = $configVariable.$_
+ }
+
+ $organizedData = @{}
+ # Iterate through JSON data and organize by panel and category
+ foreach ($entry in $configHashtable.Keys) {
+ $entryInfo = $configHashtable[$entry]
+
+ # Create an object for the application
+ $entryObject = [PSCustomObject]@{
+ Name = $entry
+ Order = $entryInfo.order
+ Category = $entryInfo.Category
+ Content = $entryInfo.Content
+ Choco = $entryInfo.choco
+ Winget = $entryInfo.winget
+ Panel = if ($entryInfo.Panel) { $entryInfo.Panel } else { "0" }
+ Link = $entryInfo.link
+ Description = $entryInfo.description
+ Type = $entryInfo.type
+ ComboItems = $entryInfo.ComboItems
+ Checked = $entryInfo.Checked
+ ButtonWidth = $entryInfo.ButtonWidth
+ }
+
+ if (-not $organizedData.ContainsKey($entryObject.Panel)) {
+ $organizedData[$entryObject.Panel] = @{}
+ }
+
+ if (-not $organizedData[$entryObject.Panel].ContainsKey($entryObject.Category)) {
+ $organizedData[$entryObject.Panel][$entryObject.Category] = @()
+ }
+
+ # Store application data in an array under the category
+ $organizedData[$entryObject.Panel][$entryObject.Category] += $entryObject
+
+ # Only apply the logic for distributing entries across columns if the targetGridName is "appspanel"
+ if ($targetGridName -eq "appspanel") {
+ $panelcount = 0
+ $entrycount = $configHashtable.Keys.Count + $organizedData["0"].Keys.Count
+ $maxcount = [Math]::Round($entrycount / $columncount + 0.5)
+ }
+ }
+
+ # Iterate through 'organizedData' by panel, category, and application
+ $count = 0
+ foreach ($panelKey in ($organizedData.Keys | Sort-Object)) {
+ # Create a Border for each column
+ $border = New-Object Windows.Controls.Border
+ $border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
+ [System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
+ $border.style = $borderstyle
+ $targetGrid.Children.Add($border) | Out-Null
+
+ # Create a StackPanel inside the Border
+ $stackPanel = New-Object Windows.Controls.StackPanel
+ $stackPanel.Background = [Windows.Media.Brushes]::Transparent
+ $stackPanel.SnapsToDevicePixels = $true
+ $stackPanel.VerticalAlignment = "Stretch" # Ensure the stack panel stretches vertically
+ $border.Child = $stackPanel
+ $panelcount++
+
+ foreach ($category in ($organizedData[$panelKey].Keys | Sort-Object)) {
+ $count++
+ if ($targetGridName -eq "appspanel" -and $columncount -gt 0) {
+ $panelcount2 = [Int](($count) / $maxcount - 0.5)
+ if ($panelcount -eq $panelcount2) {
+ # Create a new Border for the new column
+ $border = New-Object Windows.Controls.Border
+ $border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
+ [System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
+ $border.style = $borderstyle
+ $targetGrid.Children.Add($border) | Out-Null
+
+ # Create a new StackPanel inside the Border
+ $stackPanel = New-Object Windows.Controls.StackPanel
+ $stackPanel.Background = [Windows.Media.Brushes]::Transparent
+ $stackPanel.SnapsToDevicePixels = $true
+ $stackPanel.VerticalAlignment = "Stretch" # Ensure the stack panel stretches vertically
+ $border.Child = $stackPanel
+ $panelcount++
+ }
+ }
+
+ $label = New-Object Windows.Controls.Label
+ $label.Content = $category -replace ".*__", ""
+ $label.FontSize = $theme.FontSizeHeading
+ $label.FontFamily = $theme.HeaderFontFamily
+ $stackPanel.Children.Add($label) | Out-Null
+
+ $sync[$category] = $label
+
+ # Sort entries by Order and then by Name, but only display Name
+ $entries = $organizedData[$panelKey][$category] | Sort-Object Order, Name
+ foreach ($entryInfo in $entries) {
+ $count++
+ if ($targetGridName -eq "appspanel" -and $columncount -gt 0) {
+ $panelcount2 = [Int](($count) / $maxcount - 0.5)
+ if ($panelcount -eq $panelcount2) {
+ # Create a new Border for the new column
+ $border = New-Object Windows.Controls.Border
+ $border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
+ [System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
+ $border.style = $borderstyle
+ $targetGrid.Children.Add($border) | Out-Null
+
+ # Create a new StackPanel inside the Border
+ $stackPanel = New-Object Windows.Controls.StackPanel
+ $stackPanel.Background = [Windows.Media.Brushes]::Transparent
+ $stackPanel.SnapsToDevicePixels = $true
+ $stackPanel.VerticalAlignment = "Stretch" # Ensure the stack panel stretches vertically
+ $border.Child = $stackPanel
+ $panelcount++
+ }
+ }
+
+ switch ($entryInfo.Type) {
+ "Toggle" {
+ $dockPanel = New-Object Windows.Controls.DockPanel
+ $checkBox = New-Object Windows.Controls.CheckBox
+ $checkBox.Name = $entryInfo.Name
+ $checkBox.HorizontalAlignment = "Right"
+ $dockPanel.Children.Add($checkBox) | Out-Null
+ $checkBox.Style = $ColorfulToggleSwitchStyle
+
+ $label = New-Object Windows.Controls.Label
+ $label.Content = $entryInfo.Content
+ $label.ToolTip = $entryInfo.Description
+ $label.HorizontalAlignment = "Left"
+ $label.FontSize = $theme.FontSize
+ $dockPanel.Children.Add($label) | Out-Null
+ $stackPanel.Children.Add($dockPanel) | Out-Null
+
+ $sync[$entryInfo.Name] = $checkBox
+
+ $sync[$entryInfo.Name].IsChecked = Get-WinUtilToggleStatus $sync[$entryInfo.Name].Name
+
+ $sync[$entryInfo.Name].Add_Click({
+ [System.Object]$Sender = $args[0]
+ Invoke-WPFToggle $Sender.name
+ })
+ }
+
+ "ToggleButton" {
+ $toggleButton = New-Object Windows.Controls.ToggleButton
+ $toggleButton.Name = $entryInfo.Name
+ $toggleButton.Name = "WPFTab" + ($stackPanel.Children.Count + 1) + "BT"
+ $toggleButton.HorizontalAlignment = "Left"
+ $toggleButton.Height = $theme.TabButtonHeight
+ $toggleButton.Width = $theme.TabButtonWidth
+ $toggleButton.Background = $theme.ButtonInstallBackgroundColor
+ $toggleButton.Foreground = [Windows.Media.Brushes]::White
+ $toggleButton.FontWeight = [Windows.FontWeights]::Bold
+
+ $textBlock = New-Object Windows.Controls.TextBlock
+ $textBlock.FontSize = $theme.TabButtonFontSize
+ $textBlock.Background = [Windows.Media.Brushes]::Transparent
+ $textBlock.Foreground = $theme.ButtonInstallForegroundColor
+
+ $underline = New-Object Windows.Documents.Underline
+ $underline.Inlines.Add($entryInfo.name -replace "(.).*", "`$1")
+
+ $run = New-Object Windows.Documents.Run
+ $run.Text = $entryInfo.name -replace "^.", ""
+
+ $textBlock.Inlines.Add($underline)
+ $textBlock.Inlines.Add($run)
+
+ $toggleButton.Content = $textBlock
+
+ $stackPanel.Children.Add($toggleButton) | Out-Null
+
+ $sync[$entryInfo.Name] = $toggleButton
+ }
+
+ "Combobox" {
+ $horizontalStackPanel = New-Object Windows.Controls.StackPanel
+ $horizontalStackPanel.Orientation = "Horizontal"
+ $horizontalStackPanel.Margin = "0,5,0,0"
+
+ $label = New-Object Windows.Controls.Label
+ $label.Content = $entryInfo.Content
+ $label.HorizontalAlignment = "Left"
+ $label.VerticalAlignment = "Center"
+ $label.FontSize = $theme.ButtonFontSize
+ $horizontalStackPanel.Children.Add($label) | Out-Null
+
+ $comboBox = New-Object Windows.Controls.ComboBox
+ $comboBox.Name = $entryInfo.Name
+ $comboBox.Height = $theme.ButtonHeight
+ $comboBox.Width = $theme.ButtonWidth
+ $comboBox.HorizontalAlignment = "Left"
+ $comboBox.VerticalAlignment = "Center"
+ $comboBox.Margin = $theme.ButtonMargin
+
+ foreach ($comboitem in ($entryInfo.ComboItems -split " ")) {
+ $comboBoxItem = New-Object Windows.Controls.ComboBoxItem
+ $comboBoxItem.Content = $comboitem
+ $comboBoxItem.FontSize = $theme.ButtonFontSize
+ $comboBox.Items.Add($comboBoxItem) | Out-Null
+ }
+
+ $horizontalStackPanel.Children.Add($comboBox) | Out-Null
+ $stackPanel.Children.Add($horizontalStackPanel) | Out-Null
+
+ $comboBox.SelectedIndex = 0
+
+ $sync[$entryInfo.Name] = $comboBox
+ }
+
+ "Button" {
+ $button = New-Object Windows.Controls.Button
+ $button.Name = $entryInfo.Name
+ $button.Content = $entryInfo.Content
+ $button.HorizontalAlignment = "Left"
+ $button.Margin = $theme.ButtonMargin
+ $button.FontSize = $theme.ButtonFontSize
+ if ($entryInfo.ButtonWidth) {
+ $button.Width = $entryInfo.ButtonWidth
+ }
+ $stackPanel.Children.Add($button) | Out-Null
+
+ $sync[$entryInfo.Name] = $button
+ }
+
+ default {
+ $horizontalStackPanel = New-Object Windows.Controls.StackPanel
+ $horizontalStackPanel.Orientation = "Horizontal"
+
+ $checkBox = New-Object Windows.Controls.CheckBox
+ $checkBox.Name = $entryInfo.Name
+ $checkBox.Content = $entryInfo.Content
+ $checkBox.FontSize = $theme.FontSize
+ $checkBox.ToolTip = $entryInfo.Description
+ $checkBox.Margin = $theme.CheckBoxMargin
+ if ($entryInfo.Checked) {
+ $checkBox.IsChecked = $entryInfo.Checked
+ }
+ $horizontalStackPanel.Children.Add($checkBox) | Out-Null
+
+ if ($entryInfo.Link) {
+ $textBlock = New-Object Windows.Controls.TextBlock
+ $textBlock.Name = $checkBox.Name + "Link"
+ $textBlock.Text = "(?)"
+ $textBlock.ToolTip = $entryInfo.Link
+ $textBlock.Style = $HoverTextBlockStyle
+
+ # Add event handler for click to open link
+ $handler = [System.Windows.Input.MouseButtonEventHandler]{
+ param($sender, $e)
+ Start-Process $sender.ToolTip.ToString()
+ }
+ $textBlock.AddHandler([Windows.Controls.TextBlock]::MouseLeftButtonUpEvent, $handler)
+
+ $horizontalStackPanel.Children.Add($textBlock) | Out-Null
+
+ $sync[$textBlock.Name] = $textBlock
+ }
+
+ $stackPanel.Children.Add($horizontalStackPanel) | Out-Null
+ $sync[$entryInfo.Name] = $checkBox
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/scripts/main.ps1 b/scripts/main.ps1
index 412f218f..5f93cd39 100644
--- a/scripts/main.ps1
+++ b/scripts/main.ps1
@@ -95,6 +95,12 @@ try {
Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
}
+# Load the configuration files
+#Invoke-WPFUIElements -configVariable $sync.configs.nav -targetGridName "WPFMainGrid"
+Invoke-WPFUIElements -configVariable $sync.configs.applications -targetGridName "appspanel" -columncount 5
+Invoke-WPFUIElements -configVariable $sync.configs.tweaks -targetGridName "tweakspanel" -columncount 2
+Invoke-WPFUIElements -configVariable $sync.configs.feature -targetGridName "featurespanel" -columncount 2
+
if (-NOT ($readerOperationSuccessful)) {
Write-Host "Failed to parse xaml content using Windows.Markup.XamlReader's Load Method." -ForegroundColor Red
Write-Host "Quitting winutil..." -ForegroundColor Red
@@ -112,16 +118,6 @@ $xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"]
$sync.keys | ForEach-Object {
if($sync.$psitem) {
- if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "CheckBox" `
- -and $sync["$psitem"].Name -like "WPFToggle*") {
- $sync["$psitem"].IsChecked = Get-WinUtilToggleStatus $sync["$psitem"].Name
-
- $sync["$psitem"].Add_Click({
- [System.Object]$Sender = $args[0]
- Invoke-WPFToggle $Sender.name
- })
- }
-
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "ToggleButton") {
$sync["$psitem"].Add_Click({
[System.Object]$Sender = $args[0]
@@ -390,7 +386,6 @@ $labels = @{}
$allCategories = $checkBoxes.Name | ForEach-Object {$sync.configs.applications.$_} | Select-Object -Unique -ExpandProperty category
$sync["SearchBar"].Add_TextChanged({
-
if ($sync.SearchBar.Text -ne "") {
$sync.SearchBarClearButton.Visibility = "Visible"
} else {
@@ -399,13 +394,14 @@ $sync["SearchBar"].Add_TextChanged({
$activeApplications = @()
+ $textToSearch = $sync.SearchBar.Text.ToLower()
+
foreach ($CheckBox in $CheckBoxes) {
# Check if the checkbox is null or if it doesn't have content
if ($CheckBox -eq $null -or $CheckBox.Value -eq $null -or $CheckBox.Value.Content -eq $null) {
continue
}
- $textToSearch = $sync.SearchBar.Text.ToLower()
$checkBoxName = $CheckBox.Key
$textBlockName = $checkBoxName + "Link"
@@ -415,23 +411,23 @@ $sync["SearchBar"].Add_TextChanged({
if ($CheckBox.Value.Content.ToLower().Contains($textToSearch)) {
$CheckBox.Value.Visibility = "Visible"
$activeApplications += $sync.configs.applications.$checkboxName
- # Set the corresponding text block visibility
- if ($textBlock -ne $null) {
+ # Set the corresponding text block visibility
+ if ($textBlock -ne $null -and $textBlock -is [System.Windows.Controls.TextBlock]) {
$textBlock.Visibility = "Visible"
}
} else {
- $CheckBox.Value.Visibility = "Collapsed"
+ $CheckBox.Value.Visibility = "Collapsed"
# Set the corresponding text block visibility
- if ($textBlock -ne $null) {
+ if ($textBlock -ne $null -and $textBlock -is [System.Windows.Controls.TextBlock]) {
$textBlock.Visibility = "Collapsed"
}
}
}
+
$activeCategories = $activeApplications | Select-Object -ExpandProperty category -Unique
foreach ($category in $activeCategories) {
- $label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
- $label.Visibility = "Visible"
+ $sync[$category].Visibility = "Visible"
}
if ($activeCategories) {
$inactiveCategories = Compare-Object -ReferenceObject $allCategories -DifferenceObject $activeCategories -PassThru
@@ -439,8 +435,8 @@ $sync["SearchBar"].Add_TextChanged({
$inactiveCategories = $allCategories
}
foreach ($category in $inactiveCategories) {
- $label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
- $label.Visibility = "Collapsed"}
+ $sync[$category].Visibility = "Collapsed"
+ }
})
# Initialize the hashtable
diff --git a/xaml/inputXML.xaml b/xaml/inputXML.xaml
index acedd9cb..db4be1a9 100644
--- a/xaml/inputXML.xaml
+++ b/xaml/inputXML.xaml
@@ -284,12 +284,12 @@
-
+
@@ -502,7 +502,7 @@
-