mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2025-07-01 02:22:34 -05:00
Compare commits
7 Commits
3be1999c22
...
24.08.03
Author | SHA1 | Date | |
---|---|---|---|
547e433b0b | |||
4ee41cf198 | |||
c2addcfedf | |||
09575b0f8d | |||
5a89053534 | |||
1350013b3e | |||
80675b4c3f |
25
.github/workflows/compile.yaml
vendored
25
.github/workflows/compile.yaml
vendored
@ -10,6 +10,8 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build-runspace:
|
build-runspace:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
env:
|
||||||
|
CERTIFICATE_BASE64: ${{ secrets.CERTIFICATE_BASE64 }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@ -19,7 +21,28 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1
|
Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1
|
||||||
continue-on-error: false # Directly fail the job on error, removing the need for a separate check
|
continue-on-error: false # Directly fail the job on error, removing the need for a separate check
|
||||||
|
- name: Create and import code signing certificate
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
[System.IO.File]::WriteAllBytes("$env:USERPROFILE\code-signing-cert.pfx", [System.Convert]::FromBase64String("$env:CERTIFICATE_BASE64"))
|
||||||
|
Import-PfxCertificate -FilePath "$env:USERPROFILE\code-signing-cert.pfx" -CertStoreLocation Cert:\CurrentUser\My
|
||||||
|
- name: Code sign winutil.ps1
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
|
||||||
|
if ($null -eq $cert) { throw "Code signing certificate not found" }
|
||||||
|
Set-AuthenticodeSignature -FilePath ./winutil.ps1 -Certificate $cert
|
||||||
|
- name: Verify code signature
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$signature = Get-AuthenticodeSignature -FilePath ./winutil.ps1
|
||||||
|
if ($signature.Status -ne 'Valid') { throw "Code signing failed" }
|
||||||
|
- name: Upload winutil.ps1 as artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: winutil
|
||||||
|
path: ./winutil.ps1
|
||||||
- uses: stefanzweifel/git-auto-commit-action@v5
|
- uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
with:
|
with:
|
||||||
commit_message: Compile Winutil
|
commit_message: Compile Winutil
|
||||||
if: success()
|
if: success()
|
13
Compile.ps1
13
Compile.ps1
@ -97,7 +97,20 @@ Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-
|
|||||||
|
|
||||||
$xaml = (Get-Content .\xaml\inputXML.xaml).replace("'","''")
|
$xaml = (Get-Content .\xaml\inputXML.xaml).replace("'","''")
|
||||||
|
|
||||||
|
# Dot-source the Get-TabXaml function
|
||||||
|
. .\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
|
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'"))
|
$script_content.Add($(Write-output "`$inputXML = '$xaml'"))
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
"HeaderFontFamily": "Consolas, Monaco",
|
"HeaderFontFamily": "Consolas, Monaco",
|
||||||
|
|
||||||
"CheckBoxBulletDecoratorFontSize": "14",
|
"CheckBoxBulletDecoratorFontSize": "14",
|
||||||
"CheckBoxMargin": "5,0,0,2",
|
"CheckBoxMargin": "15,0,0,2",
|
||||||
|
|
||||||
"TabButtonFontSize": "14",
|
"TabButtonFontSize": "14",
|
||||||
"TabButtonWidth": "100",
|
"TabButtonWidth": "100",
|
||||||
@ -86,7 +86,7 @@
|
|||||||
"HeaderFontFamily": "Consolas, Monaco",
|
"HeaderFontFamily": "Consolas, Monaco",
|
||||||
|
|
||||||
"CheckBoxBulletDecoratorFontSize": "14",
|
"CheckBoxBulletDecoratorFontSize": "14",
|
||||||
"CheckBoxMargin": "5,0,0,2",
|
"CheckBoxMargin": "15,0,0,2",
|
||||||
|
|
||||||
"TabButtonFontSize": "14",
|
"TabButtonFontSize": "14",
|
||||||
"TabButtonWidth": "100",
|
"TabButtonWidth": "100",
|
||||||
@ -158,7 +158,7 @@
|
|||||||
"HeaderFontFamily": "Consolas, Monaco",
|
"HeaderFontFamily": "Consolas, Monaco",
|
||||||
|
|
||||||
"CheckBoxBulletDecoratorFontSize": "14",
|
"CheckBoxBulletDecoratorFontSize": "14",
|
||||||
"CheckBoxMargin": "5,0,0,2",
|
"CheckBoxMargin": "15,0,0,2",
|
||||||
|
|
||||||
"TabButtonFontSize": "14",
|
"TabButtonFontSize": "14",
|
||||||
"TabButtonWidth": "100",
|
"TabButtonWidth": "100",
|
||||||
|
217
functions/private/Get-TabXaml.ps1
Normal file
217
functions/private/Get-TabXaml.ps1
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
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 = "<Grid.ColumnDefinitions>"
|
||||||
|
$blockXml += $("`r`n" + " " * ($spaces_per_tab * $tab_repeat) +
|
||||||
|
"<ColumnDefinition Width=""*""/>") * $paneltotal
|
||||||
|
$blockXml += $("`r`n" + " " * ($spaces_per_tab * ($tab_repeat - 1))) +
|
||||||
|
"</Grid.ColumnDefinitions>" + "`r`n"
|
||||||
|
|
||||||
|
# Iterate through 'organizedData' by panel, category, and application
|
||||||
|
$count = 0
|
||||||
|
foreach ($panel in ($organizedData.Keys | Sort-Object)) {
|
||||||
|
$blockXml += $precal_indent_m1 + "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">" + "`r`n"
|
||||||
|
$blockXml += $precal_indent + "<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">" + "`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 + "</StackPanel>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_p1 + "</Border>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_p1 + "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_p2 + "<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">" + "`r`n"
|
||||||
|
$panelcount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dot-source the Get-WPFObjectName function
|
||||||
|
. .\functions\private\Get-WPFObjectName
|
||||||
|
|
||||||
|
$categorycontent = $($category -replace '^.__', '')
|
||||||
|
$categoryname = Get-WPFObjectName -type "Label" -name $categorycontent
|
||||||
|
$blockXml += $("`r`n" + " " * ($spaces_per_tab * $tab_repeat)) +
|
||||||
|
"<Label Name=""$categoryname"" Content=""$categorycontent""" + " " +
|
||||||
|
"FontSize=""{FontSizeHeading}"" FontFamily=""{HeaderFontFamily}""/>" + "`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 +
|
||||||
|
"</StackPanel>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_m2 +
|
||||||
|
"</Border>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_m2 +
|
||||||
|
"<Border Grid.Row=""1"" Grid.Column=""$panelcount"">" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_m1 +
|
||||||
|
"<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">" + "`r`n"
|
||||||
|
$panelcount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$appInfo = $organizedData[$panel][$category][$appName]
|
||||||
|
switch ($appInfo.Type) {
|
||||||
|
"Toggle" {
|
||||||
|
$blockXml += $precal_indent_m1 +
|
||||||
|
"<DockPanel LastChildFill=""True"">" + "`r`n"
|
||||||
|
$blockXml += $precal_indent +
|
||||||
|
"<CheckBox Name=""$($appInfo.Name)"" Style=""{StaticResource ColorfulToggleSwitchStyle}"" Margin=""4,0""" + " " +
|
||||||
|
"HorizontalAlignment=""Right"" FontSize=""{FontSize}""/>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent +
|
||||||
|
"<Label Content=""$($appInfo.Content)"" ToolTip=""$($appInfo.Description)""" + " " +
|
||||||
|
"HorizontalAlignment=""Left"" FontSize=""{FontSize}""/>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_m1 +
|
||||||
|
"</DockPanel>" + "`r`n"
|
||||||
|
}
|
||||||
|
|
||||||
|
"Combobox" {
|
||||||
|
$blockXml += $precal_indent_m1 +
|
||||||
|
"<StackPanel Orientation=""Horizontal"" Margin=""0,5,0,0"">" + "`r`n"
|
||||||
|
$blockXml += $precal_indent + "<Label Content=""$($appInfo.Content)"" HorizontalAlignment=""Left""" + " " +
|
||||||
|
"VerticalAlignment=""Center"" FontSize=""{FontSize}""/>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent +
|
||||||
|
"<ComboBox Name=""$($appInfo.Name)"" Height=""32"" Width=""186"" HorizontalAlignment=""Left""" + " " +
|
||||||
|
"VerticalAlignment=""Center"" Margin=""5,5"" FontSize=""{FontSize}"">" + "`r`n"
|
||||||
|
|
||||||
|
$addfirst="IsSelected=""True"""
|
||||||
|
foreach ($comboitem in ($appInfo.ComboItems -split " ")) {
|
||||||
|
$blockXml += $precal_indent_p1 +
|
||||||
|
"<ComboBoxItem $addfirst Content=""$comboitem"" FontSize=""{FontSize}""/>" + "`r`n"
|
||||||
|
$addfirst=""
|
||||||
|
}
|
||||||
|
|
||||||
|
$blockXml += $precal_indent_p1 + "</ComboBox>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent + "</StackPanel>" + "`r`n"
|
||||||
|
}
|
||||||
|
|
||||||
|
"Button" {
|
||||||
|
if ($appInfo.ButtonWidth -ne $null) {
|
||||||
|
$ButtonWidthStr = "Width=""$($appInfo.ButtonWidth)"""
|
||||||
|
}
|
||||||
|
$blockXml += $precal_indent +
|
||||||
|
"<Button Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)""" + " " +
|
||||||
|
"HorizontalAlignment=""Left"" Margin=""5"" Padding=""20,5"" $($ButtonWidthStr)/>" + "`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 +
|
||||||
|
"<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)""$($checkedStatus) Margin=""5,0""" + " " +
|
||||||
|
"ToolTip=""$($appInfo.Description)""/>" + "`r`n"
|
||||||
|
} else {
|
||||||
|
$blockXml += $precal_indent +
|
||||||
|
"<StackPanel Orientation=""Horizontal"">" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_p1 +
|
||||||
|
"<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)""$($checkedStatus)" + " " +
|
||||||
|
"ToolTip=""$($appInfo.Description)"" Margin=""0,0,2,0""/>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent_p1 +
|
||||||
|
"<TextBlock Name=""$($appInfo.Name)Link"" Style=""{StaticResource HoverTextBlockStyle}"" Text=""(?)""" + " " +
|
||||||
|
"ToolTip=""$($appInfo.Link)""/>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent +
|
||||||
|
"</StackPanel>" + "`r`n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$blockXml += $precal_indent_p1 + "</StackPanel>" + "`r`n"
|
||||||
|
$blockXml += $precal_indent + "</Border>" + "`r`n"
|
||||||
|
}
|
||||||
|
return ($blockXml)
|
||||||
|
}
|
@ -1,275 +0,0 @@
|
|||||||
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
|
|
||||||
$categoryPanelMap = @{
|
|
||||||
"Essential Tweaks" = 0
|
|
||||||
"Customize Preferences" = 1
|
|
||||||
}
|
|
||||||
Invoke-WPFUIElements -configVariable $sync.configs.applications -targetGridName "install" -columncount 5
|
|
||||||
#>
|
|
||||||
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory)]
|
|
||||||
[PSCustomObject]$configVariable,
|
|
||||||
|
|
||||||
[Parameter(Mandatory)]
|
|
||||||
[string]$targetGridName,
|
|
||||||
|
|
||||||
[Parameter(Mandatory)]
|
|
||||||
[int]$columncount
|
|
||||||
)
|
|
||||||
|
|
||||||
$theme = $sync.configs.themes.$ctttheme
|
|
||||||
|
|
||||||
# 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.Name
|
|
||||||
Category = $entryInfo.Category
|
|
||||||
Content = $entryInfo.Content
|
|
||||||
Choco = $entryInfo.choco
|
|
||||||
Winget = $entryInfo.winget
|
|
||||||
Panel = if ($entryInfo.Panel -ne $null) { $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 a sub-array under the category
|
|
||||||
$organizedData[$entryObject.Panel][$entryInfo.Category]["$($entryInfo.order)$entry"] = $entryObject
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# Retrieve the main window and the target Grid by name
|
|
||||||
$window = $sync["Form"]
|
|
||||||
$targetGrid = $window.FindName($targetGridName)
|
|
||||||
|
|
||||||
# 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
|
|
||||||
}
|
|
||||||
|
|
||||||
# Only apply the logic for distributing entries across columns if the targetGridName is "appspanel"
|
|
||||||
if ($targetGridName -eq "appspanel") {
|
|
||||||
$panelcount = 0
|
|
||||||
$paneltotal = $columncount # Use columncount for even distribution
|
|
||||||
$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.BorderBrush = [Windows.Media.Brushes]::Gray
|
|
||||||
$border.BorderThickness = [Windows.Thickness]::new(1)
|
|
||||||
$border.Margin = [Windows.Thickness]::new(5)
|
|
||||||
$border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
|
|
||||||
[System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
|
|
||||||
$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.BorderBrush = [Windows.Media.Brushes]::Gray
|
|
||||||
$border.BorderThickness = [Windows.Thickness]::new(1)
|
|
||||||
$border.Margin = [Windows.Thickness]::new(5)
|
|
||||||
$border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
|
|
||||||
[System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
|
|
||||||
$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
|
|
||||||
|
|
||||||
$entries = $organizedData[$panelKey][$category].Keys | Sort-Object
|
|
||||||
foreach ($entry 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.BorderBrush = [Windows.Media.Brushes]::Gray
|
|
||||||
$border.BorderThickness = [Windows.Thickness]::new(1)
|
|
||||||
$border.Margin = [Windows.Thickness]::new(5)
|
|
||||||
$border.VerticalAlignment = "Stretch" # Ensure the border stretches vertically
|
|
||||||
[System.Windows.Controls.Grid]::SetColumn($border, $panelcount)
|
|
||||||
$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++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$entryInfo = $organizedData[$panelKey][$category][$entry]
|
|
||||||
switch ($entryInfo.Type) {
|
|
||||||
"Toggle" {
|
|
||||||
$dockPanel = New-Object Windows.Controls.DockPanel
|
|
||||||
$checkBox = New-Object Windows.Controls.CheckBox
|
|
||||||
$checkBox.Name = $entryInfo.Name
|
|
||||||
write-host $entryInfo.Name
|
|
||||||
$checkBox.HorizontalAlignment = "Right"
|
|
||||||
$dockPanel.Children.Add($checkBox) | Out-Null
|
|
||||||
$checkBox.Style = $window.FindResource("ColorfulToggleSwitchStyle")
|
|
||||||
|
|
||||||
$label = New-Object Windows.Controls.Label
|
|
||||||
$label.Content = $entryInfo.Content
|
|
||||||
$label.ToolTip = $entryInfo.Description
|
|
||||||
$label.HorizontalAlignment = "Left"
|
|
||||||
$label.FontSize = $theme.FontSize
|
|
||||||
# Implement for consistent theming later on $label.Style = $window.FindResource("labelfortweaks")
|
|
||||||
$dockPanel.Children.Add($label) | Out-Null
|
|
||||||
|
|
||||||
$stackPanel.Children.Add($dockPanel) | Out-Null
|
|
||||||
}
|
|
||||||
|
|
||||||
"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 = "5,5"
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
"Button" {
|
|
||||||
$button = New-Object Windows.Controls.Button
|
|
||||||
$button.Name = $entryInfo.Name
|
|
||||||
$button.Content = $entryInfo.Content
|
|
||||||
$button.HorizontalAlignment = "Left"
|
|
||||||
$button.Margin = "5"
|
|
||||||
$button.Padding = "20,5"
|
|
||||||
$button.FontSize = $theme.ButtonFontSize
|
|
||||||
if ($entryInfo.ButtonWidth -ne $null) {
|
|
||||||
$button.Width = $entryInfo.ButtonWidth
|
|
||||||
}
|
|
||||||
$stackPanel.Children.Add($button) | Out-Null
|
|
||||||
}
|
|
||||||
|
|
||||||
default {
|
|
||||||
$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 -ne $null) {
|
|
||||||
$checkBox.IsChecked = $entryInfo.Checked
|
|
||||||
}
|
|
||||||
if ($entryInfo.Link -ne $null) {
|
|
||||||
$horizontalStackPanel = New-Object Windows.Controls.StackPanel
|
|
||||||
$horizontalStackPanel.Orientation = "Horizontal"
|
|
||||||
$horizontalStackPanel.Children.Add($checkBox) | Out-Null
|
|
||||||
|
|
||||||
$textBlock = New-Object Windows.Controls.TextBlock
|
|
||||||
$textBlock.Text = "(?)"
|
|
||||||
$textBlock.ToolTip = $entryInfo.Link
|
|
||||||
$textBlock.Style = $window.FindResource("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
|
|
||||||
|
|
||||||
$stackPanel.Children.Add($horizontalStackPanel) | Out-Null
|
|
||||||
} else {
|
|
||||||
$stackPanel.Children.Add($checkBox) | Out-Null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -83,13 +83,6 @@ try {
|
|||||||
Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
|
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.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
|
|
||||||
|
|
||||||
|
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
# Store Form Objects In PowerShell
|
# Store Form Objects In PowerShell
|
||||||
#===========================================================================
|
#===========================================================================
|
||||||
|
94
winutil.ps1
94
winutil.ps1
@ -8,7 +8,7 @@
|
|||||||
Author : Chris Titus @christitustech
|
Author : Chris Titus @christitustech
|
||||||
Runspace Author: @DeveloperDurp
|
Runspace Author: @DeveloperDurp
|
||||||
GitHub : https://github.com/ChrisTitusTech
|
GitHub : https://github.com/ChrisTitusTech
|
||||||
Version : 24.07.31
|
Version : 24.08.03
|
||||||
#>
|
#>
|
||||||
param (
|
param (
|
||||||
[switch]$Debug,
|
[switch]$Debug,
|
||||||
@ -45,7 +45,7 @@ Add-Type -AssemblyName System.Windows.Forms
|
|||||||
# Variable to sync between runspaces
|
# Variable to sync between runspaces
|
||||||
$sync = [Hashtable]::Synchronized(@{})
|
$sync = [Hashtable]::Synchronized(@{})
|
||||||
$sync.PSScriptRoot = $PSScriptRoot
|
$sync.PSScriptRoot = $PSScriptRoot
|
||||||
$sync.version = "24.07.31"
|
$sync.version = "24.08.03"
|
||||||
$sync.configs = @{}
|
$sync.configs = @{}
|
||||||
$sync.ProcessRunning = $false
|
$sync.ProcessRunning = $false
|
||||||
|
|
||||||
@ -15889,3 +15889,93 @@ $sync["SponsorMenuItem"].Add_Click({
|
|||||||
})
|
})
|
||||||
$sync["Form"].ShowDialog() | out-null
|
$sync["Form"].ShowDialog() | out-null
|
||||||
Stop-Transcript
|
Stop-Transcript
|
||||||
|
|
||||||
|
# SIG # Begin signature block
|
||||||
|
# MIIQRwYJKoZIhvcNAQcCoIIQODCCEDQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||||
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||||
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCpr3PCAiIU+717
|
||||||
|
# XjBk+klB20McRwzbj5pzZuVN6LMCqqCCDIMwggYaMIIEAqADAgECAhBiHW0MUgGe
|
||||||
|
# O5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQK
|
||||||
|
# Ew9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENvZGUg
|
||||||
|
# U2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5NTla
|
||||||
|
# MFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNV
|
||||||
|
# BAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0GCSqG
|
||||||
|
# SIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjIztNs
|
||||||
|
# fvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NVDgFi
|
||||||
|
# gOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/36F09
|
||||||
|
# fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05ZwmRmT
|
||||||
|
# nAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm+qxp
|
||||||
|
# 4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUedyz8
|
||||||
|
# rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz44MPZ
|
||||||
|
# 1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBMdlyh
|
||||||
|
# 2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaA
|
||||||
|
# FDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritUpimq
|
||||||
|
# F6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUE
|
||||||
|
# DDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsGA1Ud
|
||||||
|
# HwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1Ymxp
|
||||||
|
# Y0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsGAQUF
|
||||||
|
# BzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2ln
|
||||||
|
# bmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdv
|
||||||
|
# LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURhw1aV
|
||||||
|
# cdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0ZdOaWT
|
||||||
|
# syNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajjcw5+
|
||||||
|
# w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNcWbWD
|
||||||
|
# RF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalOhOfC
|
||||||
|
# ipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJszkye
|
||||||
|
# iaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z76mKn
|
||||||
|
# zAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5JKdGv
|
||||||
|
# spbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHHj95E
|
||||||
|
# jza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2Bev6
|
||||||
|
# SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/L9Uo
|
||||||
|
# 2bC5a4CH2RwwggZhMIIEyaADAgECAhAmzTnZ/yhC019IbbKDBpvFMA0GCSqGSIb3
|
||||||
|
# DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQx
|
||||||
|
# KzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwHhcN
|
||||||
|
# MjIwNTMwMDAwMDAwWhcNMjUwNTI5MjM1OTU5WjBVMQswCQYDVQQGEwJVUzEOMAwG
|
||||||
|
# A1UECAwFVGV4YXMxGjAYBgNVBAoMEUNUIFRFQ0ggR1JPVVAgTExDMRowGAYDVQQD
|
||||||
|
# DBFDVCBURUNIIEdST1VQIExMQzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
|
||||||
|
# ggIBALDxiKQHPvjYMWMVlH40AhqVOaVq9mWPSezrfgN3UAeuJFj1zwOzQfHD1WZj
|
||||||
|
# +eQtej48zIt3YHLKpy0VEHvtkFL7yqmuTrXbhGv55PggiMYp0hh0jv7vpFSsnShv
|
||||||
|
# wsaneTWBy0v6EaK/qQ8a7tZCwEnfVE4cRepdPdfdpMG0AaiK+GWjfqh/lUdtJT9K
|
||||||
|
# W2/SyTOuEFhb/+1ltsnmdoBSqj6mzk5FYXJIWH4193Gdq65j6EZeSFv0ev7tN3Zp
|
||||||
|
# 1w7oc/J7odI0zxNZJW/E6v3cG3oBfdwy2mmfl6KBzP7ulzCh/oj1vYFGxpiBvy4w
|
||||||
|
# fyblnhYnmk+VU2vwt5RobQYpFpOU2+b7v6RC8DlCScsFt16QtA7l6sBgf2Sg8OOe
|
||||||
|
# Be6x29lRwHvcBni9Ih1VFnRJ5T5QkEIqgT18fY5+SLXmMj495fJbEwZkUr1NKIwn
|
||||||
|
# ivZgnp66ImKgYSwwB7U/A4vdCqnAlo8po28vYq+yzuBsaOjUFhi9MWRpPPaaI4aw
|
||||||
|
# 8UkzwVwdTxYBl1JXYrwTxsEA6dIiVxBhKnT3uKJcN6EwEHO3wnQGrWAgxQZWuHXQ
|
||||||
|
# +gX5lQb6bdalEdXc0hiIQx7g/Fu2pQTcmzT7Lk//vu43RAOmxJOUOo6rkNmLuzkk
|
||||||
|
# aSpPdJftm9GOnQ6J+pbs+mZGq07A+EqbX3gwCD2o2fbDkE6PAgMBAAGjggGsMIIB
|
||||||
|
# qDAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4EFgQUjnXb
|
||||||
|
# LNZOgoZYQySE6eTTsyBbMYYwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAw
|
||||||
|
# EwYDVR0lBAwwCgYIKwYBBQUHAwMwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIBAwIw
|
||||||
|
# JTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQQB
|
||||||
|
# MEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGln
|
||||||
|
# b1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUFBwEBBG0wazBEBggr
|
||||||
|
# BgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29k
|
||||||
|
# ZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3Rp
|
||||||
|
# Z28uY29tMCEGA1UdEQQaMBiBFmNvbnRhY3RAY2hyaXN0aXR1cy5jb20wDQYJKoZI
|
||||||
|
# hvcNAQEMBQADggGBADkTnvLMHdIb3hPzKixR3B7XaLL/92r0e7mQU6N4p8IZriTi
|
||||||
|
# 6j0PjZGm9HN7K7UNJjTysnBsdeZGat517qfC9BLn6OZyiZjKXSW6EEhTm37Ryg/k
|
||||||
|
# mfG+GsolkcY/4QnUz5hizj7Q3HVrIX5RduY1QwrlD/nkwAdycMvEXzHTNH7as9kN
|
||||||
|
# 3vpWZr6VBy11gXOLLS7+kKaxwzndY/0xQER6RozNoKsRW6Vx08qF2nHDXygeXHla
|
||||||
|
# iBz17QpqYZQ+i4aMkkG2xMkjzQIjwxOAANbpWEGmSBV4fw/JtEOlBGfEw/kadPsT
|
||||||
|
# rUpVf+a+BMMY+QFGV/tYBkTYTnIUGEpiR/OgZ6pZLo2uIri4KLYLjwIgV6lip5+Q
|
||||||
|
# VxdSTYQKuUhWqpUILtnGYluaYd4PLgBgMSpYBNS5NEqqMVqbhhwRluPKEPySjwYG
|
||||||
|
# pRKP9RT6ke5BHVxuq+FWixnCSoIIXPh/NvCa0eqtRqdCiAy15bi+FkV/Ag5fPoxF
|
||||||
|
# FAEDM6FnXN5M3H53bDGCAxowggMWAgEBMGgwVDELMAkGA1UEBhMCR0IxGDAWBgNV
|
||||||
|
# BAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29k
|
||||||
|
# ZSBTaWduaW5nIENBIFIzNgIQJs052f8oQtNfSG2ygwabxTANBglghkgBZQMEAgEF
|
||||||
|
# AKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgor
|
||||||
|
# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3
|
||||||
|
# DQEJBDEiBCBksIhprWGO//zFcDUtab07MIdidY5PBTZLCjP4yEt1nTANBgkqhkiG
|
||||||
|
# 9w0BAQEFAASCAgCEDYnFHtAMbkhtCzhKM8Ic2zNdo44on8+MfFSbBBfE87X+II12
|
||||||
|
# XkSr/L/bbErIRmOCTf3QYQ+EmbRxv9q0i9p5UWos54kp81xga1lSE6riab9++tMS
|
||||||
|
# a6kp+4z9JrPb0T0I5efJfmoF7hS/ydkzupyvxGjq6Xq59Oj4c2/fqBEOFNssTiru
|
||||||
|
# QM2dusKgYUfCw2iThpbF+UyPtZRU3xh+ycRW2HNOMHdaBa92CY3SyzubGRKgz3qp
|
||||||
|
# X5WBY+8VqMJaAIlY4ZrhMMEzVul+QytL75ms8fg0CT1unkyawRGhpb/FyqBQBsS3
|
||||||
|
# ORDe3TyROZ6jvGNb3qLJy1TH9VfPRx8XzTmFBlNrZAGs86BpVPtHfgaChza5AIv3
|
||||||
|
# IywTr4qgBux4Q2MXY5dBMEahGZn9edtF0FLkj/yV0US3fPgAQ2vMnXsStW+GmXs9
|
||||||
|
# wxj1WKEIGhzYfMmuiuW8Jr3rAABIZBx1F4HM3+0vsBXsGg/ZLf17wNTB/UC8iePX
|
||||||
|
# YVOB0KrO1GkzZzrZXGdmYNYbxlEJNRaVVcXj9jTU+zFEUWKN90xO3IErGVQBprnQ
|
||||||
|
# t3Y00j3gnI08K0tuvg+7QwFPNi3gn7DZ4LBX0n4LZvD9cvMar3VS4TEHqAPkPqkG
|
||||||
|
# BgRSLMjIbSeQnLJfIBe2/1GJwKqpM8NPthc2rsBxzmKFqRc7vqNT9ROFzw==
|
||||||
|
# SIG # End signature block
|
||||||
|
@ -764,7 +764,8 @@
|
|||||||
|
|
||||||
<ScrollViewer x:Name="scrollViewer" Grid.Row="1" Grid.Column="0" Padding="-1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
|
<ScrollViewer x:Name="scrollViewer" Grid.Row="1" Grid.Column="0" Padding="-1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
|
||||||
BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
<Grid Name="appspanel" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
|
{{InstallPanel_applications}}
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
@ -780,6 +781,7 @@
|
|||||||
<RowDefinition Height=".70*"/>
|
<RowDefinition Height=".70*"/>
|
||||||
<RowDefinition Height=".10*"/>
|
<RowDefinition Height=".10*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
{{InstallPanel_tweaks}}
|
||||||
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="5">
|
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="5">
|
||||||
<Label Content="Recommended Selections:" FontSize="{FontSize}" VerticalAlignment="Center" Margin="2"/>
|
<Label Content="Recommended Selections:" FontSize="{FontSize}" VerticalAlignment="Center" Margin="2"/>
|
||||||
<Button Name="WPFstandard" Content=" Standard " Margin="2"/>
|
<Button Name="WPFstandard" Content=" Standard " Margin="2"/>
|
||||||
@ -787,8 +789,6 @@
|
|||||||
<Button Name="WPFclear" Content=" Clear " Margin="2"/>
|
<Button Name="WPFclear" Content=" Clear " Margin="2"/>
|
||||||
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="2"/>
|
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="2"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Grid Name="tweakspanel" Grid.Row="1">
|
|
||||||
</Grid>
|
|
||||||
<Border Grid.ColumnSpan="2" Grid.Row="2" Grid.Column="0">
|
<Border Grid.ColumnSpan="2" Grid.Row="2" Grid.Column="0">
|
||||||
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left">
|
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left">
|
||||||
<TextBlock Padding="10">
|
<TextBlock Padding="10">
|
||||||
@ -797,12 +797,14 @@
|
|||||||
</TextBlock>
|
</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem Header="Config" Visibility="Collapsed" Name="WPFTab3">
|
<TabItem Header="Config" Visibility="Collapsed" Name="WPFTab3">
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
<Grid Name="featurespanel" Grid.Row="1" Background="Transparent">
|
<Grid Background="Transparent">
|
||||||
|
{{InstallPanel_features}}
|
||||||
</Grid>
|
</Grid>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
Reference in New Issue
Block a user