Compare commits

...

2 Commits

Author SHA1 Message Date
ChrisTitusTech
8101a68c1e Compile Winutil 2023-04-24 02:55:57 +00:00
DeveloperDurp
31a47543e9
Preload Winget and tweaks with already installed (#682)
* winget

* updated runspaces and winget to update gui outside of main thread

* registry check for tweaks

* add impex to winget

* add uninstall button

* tweaks done

* update tests

---------

Co-authored-by: Chris Titus <contact@christitus.com>
2023-04-23 21:54:09 -05:00
20 changed files with 1051 additions and 758 deletions

View File

@ -703,7 +703,7 @@
"Path": "HKLM:\\SYSTEM\\ControlSet001\\Services\\Ndu",
"OriginalValue": "1",
"name": "Start",
"value": "00000004",
"value": "4",
"type": "Dword"
},
{

View File

@ -22,10 +22,11 @@ Function Get-WinUtilCheckBoxes {
$Output = New-Object System.Collections.Generic.List[System.Object]
if($Group -eq "WPFInstall"){
$CheckBoxes = get-variable | Where-Object {$psitem.name -like "WPFInstall*" -and $psitem.value.GetType().name -eq "CheckBox"}
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
$CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
Foreach ($CheckBox in $CheckBoxes){
if($CheckBox.value.ischecked -eq $true){
$sync.configs.applications.$($CheckBox.name).winget -split ";" | ForEach-Object {
$sync.configs.applications.$($CheckBox.Name).winget -split ";" | ForEach-Object {
$Output.Add($psitem)
}
if ($uncheck -eq $true){
@ -37,7 +38,8 @@ Function Get-WinUtilCheckBoxes {
}
if($Group -eq "WPFTweaks"){
$CheckBoxes = get-variable | Where-Object {$psitem.name -like "WPF*Tweaks*" -and $psitem.value.GetType().name -eq "CheckBox"}
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Tweaks*"}
$CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
Foreach ($CheckBox in $CheckBoxes){
if($CheckBox.value.ischecked -eq $true){
$Output.Add($Checkbox.Name)
@ -50,7 +52,8 @@ Function Get-WinUtilCheckBoxes {
}
if($Group -eq "WPFFeature"){
$CheckBoxes = get-variable | Where-Object {$psitem.name -like "WPF*Feature*" -and $psitem.value.GetType().name -eq "CheckBox"}
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Feature*"}
$CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
Foreach ($CheckBox in $CheckBoxes){
if($CheckBox.value.ischecked -eq $true){
$Output.Add($Checkbox.Name)

View File

@ -0,0 +1,29 @@
function Get-WinUtilVariables {
<#
.DESCRIPTION
palceholder
#>
param (
[Parameter()]
[ValidateSet("CheckBox", "Button")]
[string]$Type
)
$keys = $sync.keys | Where-Object {$psitem -like "WPF*"}
if($type){
$output = $keys | ForEach-Object {
Try{
if ($sync["$psitem"].GetType() -like "*$type*"){
Write-Output $psitem
}
}
Catch{<#I am here so errors don't get outputted for a couple variables that don't have the .GetType() attribute#>}
}
return $output
}
return $keys
}

View File

@ -9,20 +9,29 @@ Function Install-WinUtilProgramWinget {
#>
param($ProgramsToInstall)
param(
$ProgramsToInstall,
$manage = "Installing"
)
$x = 0
$count = $($ProgramsToInstall -split ",").Count
Write-Progress -Activity "Installing Applications" -Status "Starting" -PercentComplete 0
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
Foreach ($Program in $($ProgramsToInstall -split ",")){
Write-Progress -Activity "Installing Applications" -Status "Installing $Program $($x + 1) of $count" -PercentComplete $($x/$count*100)
Start-Process -FilePath winget -ArgumentList "install -e --accept-source-agreements --accept-package-agreements --silent $Program" -NoNewWindow -Wait;
Write-Progress -Activity "$manage Applications" -Status "$manage $Program $($x + 1) of $count" -PercentComplete $($x/$count*100)
if($manage -eq "Installing"){
Start-Process -FilePath winget -ArgumentList "install -e --accept-source-agreements --accept-package-agreements --silent $Program" -NoNewWindow -Wait
}
if($manage -eq "Uninstalling"){
Start-Process -FilePath winget -ArgumentList "remove -e --purge --force --silent $Program" -NoNewWindow -Wait
}
$X++
}
Write-Progress -Activity "Installing Applications" -Status "Finished" -Completed
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
}

View File

@ -1,46 +0,0 @@
Function Invoke-WinUtilCurrentSystem {
<#
.DESCRIPTION
Function is meant to read existing system registry and check according configuration.
Example: Is telemetry enabled? check the box.
.EXAMPLE
Get-WinUtilCheckBoxes "WPFInstall"
#>
param(
$CheckBox,
$undo = $false
)
if($undo){
$Values = @{
Registry = "OriginalValue"
ScheduledTask = "OriginalState"
Service = "OriginalType"
}
}
Else{
$Values = @{
Registry = "Value"
ScheduledTask = "State"
Service = "StartupType"
}
}
if($sync.configs.tweaks.$CheckBox.registry){
$sync.configs.tweaks.$CheckBox.registry | ForEach-Object {
Get-WinUtilRegistry -Name $psitem.Name -Path $psitem.Path -Type $psitem.Type -Value $psitem.$($values.registry)
if ($psitem.$($values.registry) -eq $syscheckvalue) {
$sync.configs.tweaks.$CheckBox.$($values.registry) = $true
}
else {
$sync.configs.tweaks.$CheckBox.$($values.registry) = $false
}
}
}
}

View File

@ -0,0 +1,100 @@
Function Invoke-WinUtilCurrentSystem {
<#
.DESCRIPTION
Function is meant to read existing system registry and check according configuration.
Example: Is telemetry enabled? check the box.
.EXAMPLE
Get-WinUtilCheckBoxes "WPFInstall"
#>
param(
$CheckBox
)
if ($checkbox -eq "winget"){
$originalEncoding = [Console]::OutputEncoding
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
$Sync.InstalledPrograms = winget list -s winget | Select-Object -skip 3 | ConvertFrom-String -PropertyNames "Name", "Id", "Version", "Available" -Delimiter '\s{2,}'
[Console]::OutputEncoding = $originalEncoding
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
$sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
if($sync.configs.applications.$($psitem.Key).winget -in $sync.InstalledPrograms.Id){
Write-Output $psitem.name
}
}
}
if($CheckBox -eq "tweaks"){
if(!(Test-Path 'HKU:\')){New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS}
$ScheduledTasks = Get-ScheduledTask
$sync.configs.tweaks | Get-Member -MemberType NoteProperty | ForEach-Object {
$Config = $psitem.Name
#WPFEssTweaksTele
$registryKeys = $sync.configs.tweaks.$Config.registry
$scheduledtaskKeys = $sync.configs.tweaks.$Config.scheduledtask
$serviceKeys = $sync.configs.tweaks.$Config.service
if($registryKeys -or $scheduledtaskKeys -or $serviceKeys){
$Values = @()
Foreach ($tweaks in $registryKeys){
Foreach($tweak in $tweaks){
if(test-path $tweak.Path){
$actualValue = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name)
$expectedValue = $tweak.Value
if ($expectedValue -notlike $actualValue){
$values += $False
}
}
}
}
Foreach ($tweaks in $scheduledtaskKeys){
Foreach($tweak in $tweaks){
$task = $ScheduledTasks | Where-Object {$($psitem.TaskPath + $psitem.TaskName) -like "\$($tweak.name)"}
if($task){
$actualValue = $task.State
$expectedValue = $tweak.State
if ($expectedValue -ne $actualValue){
$values += $False
}
}
}
}
Foreach ($tweaks in $serviceKeys){
Foreach($tweak in $tweaks){
$Service = Get-Service -Name $tweak.Name
if($Service){
$actualValue = $Service.StartType
$expectedValue = $tweak.StartupType
if ($expectedValue -ne $actualValue){
$values += $False
}
}
}
}
if($values -notcontains $false){
Write-Output $Config
}
}
}
}
}

View File

@ -18,13 +18,17 @@ function Invoke-WPFButton {
"WPFTab?BT" {Invoke-WPFTab $Button}
"WPFinstall" {Invoke-WPFInstall}
"WPFuninstall" {Invoke-WPFUnInstall}
"WPFInstallUpgrade" {Invoke-WPFInstallUpgrade}
"WPFdesktop" {Invoke-WPFPresets "Desktop"}
"WPFlaptop" {Invoke-WPFPresets "laptop"}
"WPFminimal" {Invoke-WPFPresets "minimal"}
"WPFexport" {Invoke-WPFImpex -type "export"}
"WPFimport" {Invoke-WPFImpex -type "import"}
"WPFexport" {Invoke-WPFImpex -type "export" -CheckBox "WPFTweaks"}
"WPFimport" {Invoke-WPFImpex -type "import" -CheckBox "WPFTweaks"}
"WPFexportWinget" {Invoke-WPFImpex -type "export" -CheckBox "WPFInstall"}
"WPFimportWinget" {Invoke-WPFImpex -type "import" -CheckBox "WPFInstall"}
"WPFclear" {Invoke-WPFPresets -preset $null -imported $true}
"WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"}
"WPFtweaksbutton" {Invoke-WPFtweaksbutton}
"WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enabled"}
"WPFRemoveUltPerf" {Invoke-WPFUltimatePerformance -State "Disabled"}
@ -44,5 +48,7 @@ function Invoke-WPFButton {
"WPFUpdatesdisable" {Invoke-WPFUpdatesdisable}
"WPFUpdatessecurity" {Invoke-WPFUpdatessecurity}
"WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil"}
"WPFGetInstalled" {Invoke-WPFGetInstalled -CheckBox "winget"}
"WPFGetInstalledTweaks" {Invoke-WPFGetInstalled -CheckBox "tweaks"}
}
}

View File

@ -0,0 +1,46 @@
function Invoke-WPFGetInstalled {
<#
.DESCRIPTION
placeholder
#>
param($checkbox)
if($sync.ProcessRunning){
$msg = "Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
if(!(Test-WinUtilPackageManager -winget) -and $checkbox -eq "winget"){
Write-Host "==========================================="
Write-Host "-- Winget is not installed ---"
Write-Host "==========================================="
return
}
Invoke-WPFRunspace -ArgumentList $checkbox -ScriptBlock {
param($checkbox)
$sync.ProcessRunning = $true
if($checkbox -eq "winget"){
Write-Host "Getting Installed Programs..."
}
if($checkbox -eq "tweaks"){
Write-Host "Getting Installed Tweaks..."
}
$Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox
$sync.form.Dispatcher.invoke({
foreach($checkbox in $Checkboxes){
$sync.$checkbox.ischecked = $True
}
})
Write-Host "Done..."
$sync.ProcessRunning = $false
}
}

View File

@ -9,7 +9,10 @@ function Invoke-WPFImpex {
Invoke-WPFImpex -type "export"
#>
param($type)
param(
$type,
$checkbox
)
if ($type -eq "export"){
$FileBrowser = New-Object System.Windows.Forms.SaveFileDialog
@ -27,11 +30,11 @@ function Invoke-WPFImpex {
}
if ($type -eq "export"){
$jsonFile = Get-WinUtilCheckBoxes WPFTweaks -unCheck $false
$jsonFile = Get-WinUtilCheckBoxes $checkbox -unCheck $false
$jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force
}
if ($type -eq "import"){
$jsonFile = Get-Content $FileBrowser.FileName | ConvertFrom-Json
Invoke-WPFPresets -preset $jsonFile -imported $true
Invoke-WPFPresets -preset $jsonFile -imported $true -CheckBox $checkbox
}
}

View File

@ -8,8 +8,10 @@ function Invoke-WPFPresets {
param(
$preset,
[bool]$imported = $false
[bool]$imported = $false,
$checkbox = "WPFTeaks"
)
if($imported -eq $true){
$CheckBoxesToCheck = $preset
}
@ -17,15 +19,23 @@ function Invoke-WPFPresets {
$CheckBoxesToCheck = $sync.configs.preset.$preset
}
#Uncheck all
get-variable | Where-Object {$_.name -like "*tweaks*"} | ForEach-Object {
if ($psitem.value.gettype().name -eq "CheckBox"){
$CheckBox = Get-Variable $psitem.Name
if ($CheckBoxesToCheck -contains $CheckBox.name){
$checkbox.value.ischecked = $true
if($checkbox -eq "WPFTeaks"){
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "*tweaks*"}
$sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
if ($CheckBoxesToCheck -contains $PSItem.name){
$sync.$($PSItem.name).ischecked = $true
}
else{$checkbox.value.ischecked = $false}
else{$sync.$($PSItem.name).ischecked = $false}
}
}
if($checkbox -eq "WPFInstall"){
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"}
$sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {
if($($sync.configs.applications.$($psitem.name).winget) -in $CheckBoxesToCheck){
$sync.$($PSItem.name).ischecked = $true
}
else{$sync.$($PSItem.name).ischecked = $false}
}
}
}

View File

@ -23,40 +23,13 @@ function Invoke-WPFRunspace {
$ArgumentList
)
#Configure max thread count for RunspacePool.
$maxthreads = [int]$env:NUMBER_OF_PROCESSORS
#Create a new session state for parsing variables ie hashtable into our runspace.
$hashVars = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'sync',$sync,$Null
$InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
#Add the variable to the RunspacePool sessionstate
$InitialSessionState.Variables.Add($hashVars)
#Add functions
$functions = Get-ChildItem function:\ | Where-Object {$_.name -like "*winutil*" -or $_.name -like "*WPF*"}
foreach ($function in $functions){
$functionDefinition = Get-Content function:\$($function.name)
$functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition
# And add it to the iss object
$initialSessionState.Commands.Add($functionEntry)
}
#Create our runspace pool. We are entering three parameters here min thread count, max thread count and host machine of where these runspaces should be made.
$script:runspace = [runspacefactory]::CreateRunspacePool(1,$maxthreads,$InitialSessionState, $Host)
#Crate a PowerShell instance.
$script:powershell = [powershell]::Create()
#Open a RunspacePool instance.
$script:runspace.Open()
#Add Scriptblock and Arguments to runspace
$script:powershell.AddScript($ScriptBlock)
$script:powershell.AddArgument($ArgumentList)
$script:powershell.RunspacePool = $script:runspace
$script:powershell.RunspacePool = $sync.runspace
#Run our RunspacePool.
$script:handle = $script:powershell.BeginInvoke()
@ -66,8 +39,8 @@ function Invoke-WPFRunspace {
{
$script:powershell.EndInvoke($script:handle)
$script:powershell.Dispose()
$script:runspace.Dispose()
$script:runspace.Close()
$sync.runspace.Dispose()
$sync.runspace.Close()
[System.GC]::Collect()
}
}

View File

@ -8,17 +8,17 @@ function Invoke-WPFTab {
#>
Param ($ClickedTab)
$Tabs = Get-Variable WPFTab?BT
$TabNav = Get-Variable WPFTabNav
$Tabs = Get-WinUtilVariables | Where-Object {$psitem -like "WPFTab?BT"}
$TabNav = Get-WinUtilVariables | Where-Object {$psitem -like "WPFTabNav"}
$x = [int]($ClickedTab -replace "WPFTab","" -replace "BT","") - 1
0..($Tabs.Count -1 ) | ForEach-Object {
if ($x -eq $psitem){
$TabNav.value.Items[$psitem].IsSelected = $true
$sync.$TabNav.Items[$psitem].IsSelected = $true
}
else{
$TabNav.value.Items[$psitem].IsSelected = $false
$sync.$TabNav.Items[$psitem].IsSelected = $false
}
}
}

View File

@ -0,0 +1,58 @@
function Invoke-WPFUnInstall {
<#
.DESCRIPTION
PlaceHolder
#>
if($sync.ProcessRunning){
$msg = "Install process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
$WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall"
if ($wingetinstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install"
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
$ButtonType = [System.Windows.MessageBoxButton]::YesNo
$MessageboxTitle = "Are you sure?"
$Messageboxbody = ("This will install the following applications `n $WingetInstall")
$MessageIcon = [System.Windows.MessageBoxImage]::Information
$confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
if($confirm -eq "No"){return}
Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock {
param($WingetInstall)
try{
$sync.ProcessRunning = $true
# Install all winget programs in new window
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall -Manage "Uninstalling"
$ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Uninstalls are Finished "
$Messageboxbody = ("Done")
$MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "==========================================="
Write-Host "-- Uninstalls have finished ---"
Write-Host "==========================================="
}
Catch {
Write-Host "==========================================="
Write-Host "-- Winget failed to install ---"
Write-Host "==========================================="
}
$sync.ProcessRunning = $False
}
}

View File

@ -14,9 +14,9 @@ function Invoke-WPFtweaksbutton {
$Tweaks = Get-WinUtilCheckBoxes -Group "WPFTweaks"
Set-WinUtilDNS -DNSProvider $WPFchangedns.text
Set-WinUtilDNS -DNSProvider $sync["WPFchangedns"].text
if ($tweaks.count -eq 0 -and $WPFchangedns.text -eq "Default"){
if ($tweaks.count -eq 0 -and $sync["WPFchangedns"].text -eq "Default"){
$msg = "Please check the tweaks you wish to perform."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return

View File

@ -1,16 +1,3 @@
#region Configurable Variables
<#
.NOTES
Use this section to configure testing variables. IE if the number of tabs change in the GUI update that variable here.
All variables need to be global to be passed between contexts
#>
$global:FormName = "Chris Titus Tech's Windows Utility"
#endregion Configurable Variables
#region Load Variables needed for testing
#Config Files
@ -91,25 +78,4 @@ Describe "Config Files" -ForEach @(
}
}
}
#===========================================================================
# Tests - Functions
#===========================================================================
Describe "Functions" -ForEach @(Get-ChildItem .\functions -Recurse -File){
BeforeEach -Scriptblock {
. $psitem.FullName
}
Context "$($psitem.BaseName)" {
It "Imports with no errors" {
Get-ChildItem function:\$($psitem.BaseName) | should -Not -BeNullOrEmpty
}
It "Contains Description" {
get-help $($psitem.BaseName) -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Description | should -Not -BeNullOrEmpty
}
}
}
}

View File

@ -0,0 +1,28 @@
#===========================================================================
# Tests - Functions
#===========================================================================
Describe "Functions"{
Get-ChildItem .\functions -Recurse -File | ForEach-Object {
context "$($psitem.BaseName)" {
BeforeEach -Scriptblock {
. $fullname
}
It "Imports with no errors" -TestCases @{
basename = $($psitem.BaseName)
fullname = $psitem.FullName
} {
Get-ChildItem function:\$basename | should -Not -BeNullOrEmpty
}
It "Contains Description" -TestCases @{
basename = $($psitem.BaseName)
fullname = $psitem.FullName
} {
get-help $basename -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Description | should -Not -BeNullOrEmpty
}
}
}
}

View File

@ -1,208 +1,27 @@
#region Configurable Variables
<#
.NOTES
Use this section to configure testing variables. IE if the number of tabs change in the GUI update that variable here.
All variables need to be global to be passed between contexts
#>
$global:FormName = "Chris Titus Tech's Windows Utility"
#endregion Configurable Variables
#region Load Variables needed for testing
#Config Files
$global:configs = @{}
./Compile.ps1
(
"applications",
"preset"
) | ForEach-Object {
$global:configs["$PSItem"] = Get-Content .\config\$PSItem.json | ConvertFrom-Json
}
#GUI
$global:inputXML = get-content MainWindow.xaml
$global:inputXML = $global:inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
[xml]$global:XAML = $global:inputXML
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
$global:reader = (New-Object System.Xml.XmlNodeReader $global:xaml)
$global:Form = [Windows.Markup.XamlReader]::Load( $global:reader )
$global:xaml.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name "Global:WPF$($_.Name)" -Value $global:Form.FindName($_.Name) -Scope global }
#dotsource original script to pull in all variables and ensure no errors
$script = Get-Content .\winutil.ps1
$output = $script[0..($script.count - 14)] | Out-File .\pester.ps1
$script[0..($script.count - 21)] | Out-File .\pester.ps1
#endregion Load Variables needed for testing
#===========================================================================
# Tests - Application Installs
#===========================================================================
Describe "Application Installs" {
Context "Application installs" {
It "Imports with no errors" {
$global:configs.Applications | should -Not -BeNullOrEmpty
}
}
Context "Winget Install" {
$global:configs.applications | Get-Member -MemberType NoteProperty | ForEach-Object {
$TestCase = @{ name = $psitem.name }
It "$($psitem.name) should include Winget Install" -TestCases $TestCase{
param($name)
$null -eq $global:configs.applications.$name.winget | should -Befalse -because "$name Did not include a Winget Install"
}
}
}
Context "GUI Applications Checkbox" {
(get-variable | Where-Object {$psitem.name -like "*install*" -and $psitem.value.GetType().name -eq "CheckBox"}).name -replace 'Global:','' | ForEach-Object {
$TestCase = @{ name = $psitem }
It "$($psitem) should include application.json " -TestCases $TestCase{
param($name)
$null -eq $global:configs.applications.$name | should -Befalse -because "$name Does not have entry in applications.json"
}
}
}
BeforeAll {
. .\pester.ps1
}
#===========================================================================
# Tests - Tweak Presets
#===========================================================================
Describe "Tweak Presets" {
Context "Json Import" {
It "Imports with no errors" {
$global:configs.preset | should -Not -BeNullOrEmpty
}
}
}
#===========================================================================
# Tests - GUI
#===========================================================================
Describe "GUI" {
Context "XML" {
It "Imports with no errors" {
$global:XAML | should -Not -BeNullOrEmpty
}
It "Title should be $global:FormName" {
$global:XAML.window.Title | should -Be $global:FormName
$inputXML | should -Not -BeNullOrEmpty
}
}
Context "Form" {
It "Imports with no errors" {
$global:Form | should -Not -BeNullOrEmpty
}
It "Title should match XML" {
$global:Form.title | should -Be $global:XAML.window.Title
$sync.Form | should -Not -BeNullOrEmpty
}
}
}
#===========================================================================
# Tests - Functions
#===========================================================================
Describe "Functions" {
BeforeEach -Scriptblock {
. ./pester.ps1
$x = 0
while($sync.ConfigLoaded -ne $True -or $x -eq 100){
start-sleep -Milliseconds 100
$x ++
}
}
It "Get-InstallerProcess should return the correct values" {
Get-InstallerProcess | should -Befalse
$process = Start-Process powershell.exe -ArgumentList "-c start-sleep 5" -PassThru
Get-InstallerProcess $process | should -Not -Befalse
}
It "Runspace background load should have data" {
$sync.configs.applications | should -Not -BeNullOrEmpty
$sync.configs.tweaks | should -Not -BeNullOrEmpty
$sync.configs.preset | should -Not -BeNullOrEmpty
$sync.configs.feature | should -Not -BeNullOrEmpty
$sync.ComputerInfo | should -Not -BeNullOrEmpty
}
}
#===========================================================================
# Tests - GUI Functions
#===========================================================================
Describe "GUI Functions" {
BeforeEach -Scriptblock {
. ./pester.ps1
$x = 0
while($sync.ConfigLoaded -ne $True -or $x -eq 100){
start-sleep -Milliseconds 100
$x ++
}
}
It "GUI should load with no errors" {
$WPFTab1BT | should -Not -BeNullOrEmpty
$WPFundoall | should -Not -BeNullOrEmpty
$WPFPanelDISM | should -Not -BeNullOrEmpty
$WPFPanelAutologin | should -Not -BeNullOrEmpty
$WPFUpdatesdefault | should -Not -BeNullOrEmpty
$WPFFixesUpdate | should -Not -BeNullOrEmpty
$WPFUpdatesdisable | should -Not -BeNullOrEmpty
$WPFUpdatessecurity | should -Not -BeNullOrEmpty
$WPFFeatureInstall | should -Not -BeNullOrEmpty
$WPFundoall | should -Not -BeNullOrEmpty
$WPFtweaksbutton | should -Not -BeNullOrEmpty
$WPFminimal | should -Not -BeNullOrEmpty
$WPFlaptop | should -Not -BeNullOrEmpty
$WPFdesktop | should -Not -BeNullOrEmpty
$WPFInstallUpgrade | should -Not -BeNullOrEmpty
$WPFinstall | should -Not -BeNullOrEmpty
}
Context "Get-CheckBoxes" {
It "Get-CheckBoxes Install should return data" {
$TestCheckBoxes = @(
"WPFInstallvc2015_32"
"WPFInstallvscode"
"WPFInstallgit"
)
$OutputResult = New-Object System.Collections.Generic.List[System.Object]
$TestCheckBoxes | ForEach-Object {
$global:configs.applications.$psitem.winget -split ";" | ForEach-Object {
$OutputResult.Add($psitem)
}
}
$OutputResult = Sort-Object -InputObject $OutputResult
$TestCheckBoxes | ForEach-Object {(Get-Variable $PSItem).value.ischecked = $true}
$Output = Get-CheckBoxes -Group WPFInstall | Sort-Object
$Output | should -Not -BeNullOrEmpty -Because "Output did not contain applications to install"
$Output | Should -Not -Be $OutputResult -Because "Output contains duplicate values"
$Output | Should -Be $($OutputResult | Select-Object -Unique | Sort-Object) -Because "Output doesn't match"
$TestCheckBoxes | ForEach-Object {(Get-Variable $PSItem).value.ischecked | should -be $false}
}
}
Context "Set-Presets" {
$global:configs.preset | Get-Member -MemberType NoteProperty | ForEach-Object {
$TestCase = @{ name = $psitem.name }
It "preset $($psitem.name) should modify the correct values" -TestCases $TestCase {
param($name)
Set-Presets $name
get-variable $global:configs.preset.$name | Select-Object -ExpandProperty value | Select-Object -ExpandProperty ischecked | Where-Object {$psitem -eq $false} | should -BeNullOrEmpty
}
}
}
}

View File

@ -1,3 +1,29 @@
#Configure max thread count for RunspacePool.
$maxthreads = [int]$env:NUMBER_OF_PROCESSORS
#Create a new session state for parsing variables ie hashtable into our runspace.
$hashVars = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'sync',$sync,$Null
$InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
#Add the variable to the RunspacePool sessionstate
$InitialSessionState.Variables.Add($hashVars)
#Add functions
$functions = Get-ChildItem function:\ | Where-Object {$_.name -like "*winutil*" -or $_.name -like "*WPF*"}
foreach ($function in $functions){
$functionDefinition = Get-Content function:\$($function.name)
$functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition
# And add it to the iss object
$initialSessionState.Commands.Add($functionEntry)
}
#Create our runspace pool. We are entering three parameters here min thread count, max thread count and host machine of where these runspaces should be made.
$sync.runspace = [runspacefactory]::CreateRunspacePool(1,$maxthreads,$InitialSessionState, $Host)
#Open a RunspacePool instance.
$sync.runspace.Open()
#region exception classes
class WingetFailedInstall : Exception {
@ -26,7 +52,7 @@ $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -repla
#Read XAML
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
try { $Form = [Windows.Markup.XamlReader]::Load( $reader ) }
try { $sync["Form"] = [Windows.Markup.XamlReader]::Load( $reader ) }
catch [System.Management.Automation.MethodInvocationException] {
Write-Warning "We ran into a problem with the XAML code. Check the syntax for this control..."
Write-Host $error[0].Exception.Message -ForegroundColor Red
@ -43,21 +69,24 @@ catch {
# Store Form Objects In PowerShell
#===========================================================================
$xaml.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name) }
$xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"] = $sync["Form"].FindName($psitem.Name)}
$buttons = get-variable | Where-Object {$psitem.name -like "WPF*" -and $psitem.value -ne $null -and $psitem.value.GetType().name -eq "Button"}
foreach ($button in $buttons){
$button.value.Add_Click({
[System.Object]$Sender = $args[0]
Invoke-WPFButton "WPF$($Sender.name)"
})
$sync.keys | ForEach-Object {
if($sync.$psitem){
if($($sync["$psitem"].GetType() | Select-Object -ExpandProperty Name) -eq "Button"){
$sync["$psitem"].Add_Click({
[System.Object]$Sender = $args[0]
Invoke-WPFButton $Sender.name
})
}
}
}
$WPFToggleDarkMode.Add_Click({
$sync["WPFToggleDarkMode"].Add_Click({
Invoke-WPFDarkMode -DarkMoveEnabled $(Get-WinUtilDarkMode)
})
$WPFToggleDarkMode.IsChecked = Get-WinUtilDarkMode
$sync["WPFToggleDarkMode"].IsChecked = Get-WinUtilDarkMode
#===========================================================================
# Setup background config
@ -86,6 +115,12 @@ Catch [ChocoFailedInstall]{
Write-Host "-- Chocolatey failed to install ---"
Write-Host "==========================================="
}
$form.title = $form.title + " " + $sync.version
$Form.ShowDialog() | out-null
$sync["Form"].title = $sync["Form"].title + " " + $sync.version
$sync["Form"].Add_Closing({
$sync.runspace.Dispose()
$sync.runspace.Close()
[System.GC]::Collect()
})
$sync["Form"].ShowDialog() | out-null
Stop-Transcript

File diff suppressed because it is too large Load Diff

View File

@ -21,14 +21,14 @@
CornerRadius="10"
Margin="5,0"
/>
<Border Name="ToggleSwitchButton"
<Border Name="WPFToggleSwitchButton"
Width="25"
Height="25"
Background="Black"
CornerRadius="12.5"
HorizontalAlignment="Left"
/>
<ContentPresenter Name="ToggleSwitchContent"
<ContentPresenter Name="WPFToggleSwitchContent"
Margin="10,0,0,0"
Content="{TemplateBinding Content}"
VerticalAlignment="Center"
@ -38,11 +38,11 @@
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="false">
<Trigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="ToggleSwitchLeft" />
<BeginStoryboard x:Name="ToggleSwitchRight">
<RemoveStoryboard BeginStoryboardName="WPFToggleSwitchLeft" />
<BeginStoryboard x:Name="WPFToggleSwitchRight">
<Storyboard>
<ThicknessAnimation Storyboard.TargetProperty="Margin"
Storyboard.TargetName="ToggleSwitchButton"
Storyboard.TargetName="WPFToggleSwitchButton"
Duration="0:0:0:0"
From="0,0,0,0"
To="28,0,0,0">
@ -50,18 +50,18 @@
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
<Setter TargetName="ToggleSwitchButton"
<Setter TargetName="WPFToggleSwitchButton"
Property="Background"
Value="#fff9f4f4"
/>
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Trigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="ToggleSwitchRight" />
<BeginStoryboard x:Name="ToggleSwitchLeft">
<RemoveStoryboard BeginStoryboardName="WPFToggleSwitchRight" />
<BeginStoryboard x:Name="WPFToggleSwitchLeft">
<Storyboard>
<ThicknessAnimation Storyboard.TargetProperty="Margin"
Storyboard.TargetName="ToggleSwitchButton"
Storyboard.TargetName="WPFToggleSwitchButton"
Duration="0:0:0:0"
From="28,0,0,0"
To="0,0,0,0">
@ -69,7 +69,7 @@
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
<Setter TargetName="ToggleSwitchButton"
<Setter TargetName="WPFToggleSwitchButton"
Property="Background"
Value="#ff060600"
/>
@ -80,9 +80,9 @@
</Setter>
</Style>
</Window.Resources>
<Border Name="dummy" Grid.Column="0" Grid.Row="0">
<Border Name="WPFdummy" Grid.Column="0" Grid.Row="0">
<Viewbox Stretch="Uniform" VerticalAlignment="Top">
<Grid Background="#777777" ShowGridLines="False" Name="MainGrid">
<Grid Background="#777777" ShowGridLines="False" Name="WPFMainGrid">
<Grid.RowDefinitions>
<RowDefinition Height=".1*"/>
<RowDefinition Height=".9*"/>
@ -91,14 +91,14 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<DockPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="0" Width="1100">
<Image Height="50" Width="100" Name="Icon" SnapsToDevicePixels="True" Source="https://christitus.com/images/logo-full.png" Margin="0,10,0,10"/>
<Button Content="Install" HorizontalAlignment="Left" Height="40" Width="100" Background="#222222" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="Tab1BT"/>
<Button Content="Tweaks" HorizontalAlignment="Left" Height="40" Width="100" Background="#333333" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="Tab2BT"/>
<Button Content="Config" HorizontalAlignment="Left" Height="40" Width="100" Background="#444444" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="Tab3BT"/>
<Button Content="Updates" HorizontalAlignment="Left" Height="40" Width="100" Background="#555555" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="Tab4BT"/>
<Image Height="50" Width="100" Name="WPFIcon" SnapsToDevicePixels="True" Source="https://christitus.com/images/logo-full.png" Margin="0,10,0,10"/>
<Button Content="Install" HorizontalAlignment="Left" Height="40" Width="100" Background="#222222" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="WPFTab1BT"/>
<Button Content="Tweaks" HorizontalAlignment="Left" Height="40" Width="100" Background="#333333" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="WPFTab2BT"/>
<Button Content="Config" HorizontalAlignment="Left" Height="40" Width="100" Background="#444444" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="WPFTab3BT"/>
<Button Content="Updates" HorizontalAlignment="Left" Height="40" Width="100" Background="#555555" BorderThickness="0,0,0,0" FontWeight="Bold" Foreground="#ffffff" Name="WPFTab4BT"/>
</DockPanel>
<TabControl Grid.Row="1" Padding="-1" Name="TabNav" Background="#222222">
<TabItem Header="Install" Visibility="Collapsed" Name="Tab1">
<TabControl Grid.Row="1" Padding="-1" Name="WPFTabNav" Background="#222222">
<TabItem Header="Install" Visibility="Collapsed" Name="WPFTab1">
<Grid Background="#222222">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@ -108,34 +108,49 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height=".10*"/>
<RowDefinition Height=".90*"/>
</Grid.RowDefinitions>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="0" Margin="10">
<StackPanel Background="#777777" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Center" Grid.Column="0" Grid.ColumnSpan="3" Margin="10">
<Label Content="Winget:" FontSize="17" VerticalAlignment="Center"/>
<Button Name="WPFinstall" Content=" Install Selection " Margin="7"/>
<Button Name="WPFInstallUpgrade" Content=" Upgrade Selection " Margin="7"/>
<Button Name="WPFuninstall" Content=" Uninstall Selection " Margin="7"/>
<Button Name="WPFGetInstalled" Content=" Get Installed " Margin="7"/>
<Button Name="WPFclearWinget" Content=" Clear Selection " Margin="7"/>
</StackPanel>
<StackPanel Background="#777777" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Center" Grid.Column="3" Grid.ColumnSpan="2" Margin="10">
<Label Content="Configuration File:" FontSize="17" VerticalAlignment="Center"/>
<Button Name="WPFimportWinget" Content=" Import " Margin="7"/>
<Button Name="WPFexportWinget" Content=" Export " Margin="7"/>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="0" Margin="10">
<Label Content="Browsers" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installbrave" Content="Brave" Margin="5,0"/>
<CheckBox Name="Installchrome" Content="Chrome" Margin="5,0"/>
<CheckBox Name="Installchromium" Content="Chromium" Margin="5,0"/>
<CheckBox Name="Installedge" Content="Edge" Margin="5,0"/>
<CheckBox Name="Installfirefox" Content="Firefox" Margin="5,0"/>
<CheckBox Name="Installlibrewolf" Content="LibreWolf" Margin="5,0"/>
<CheckBox Name="Installtor" Content="Tor Browser" Margin="5,0"/>
<CheckBox Name="Installvivaldi" Content="Vivaldi" Margin="5,0"/>
<CheckBox Name="Installwaterfox" Content="Waterfox" Margin="5,0"/>
<CheckBox Name="WPFInstallbrave" Content="Brave" Margin="5,0"/>
<CheckBox Name="WPFInstallchrome" Content="Chrome" Margin="5,0"/>
<CheckBox Name="WPFInstallchromium" Content="Chromium" Margin="5,0"/>
<CheckBox Name="WPFInstalledge" Content="Edge" Margin="5,0"/>
<CheckBox Name="WPFInstallfirefox" Content="Firefox" Margin="5,0"/>
<CheckBox Name="WPFInstalllibrewolf" Content="LibreWolf" Margin="5,0"/>
<CheckBox Name="WPFInstalltor" Content="Tor Browser" Margin="5,0"/>
<CheckBox Name="WPFInstallvivaldi" Content="Vivaldi" Margin="5,0"/>
<CheckBox Name="WPFInstallwaterfox" Content="Waterfox" Margin="5,0"/>
<Label Content="Communications" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installdiscord" Content="Discord" Margin="5,0"/>
<CheckBox Name="Installhexchat" Content="Hexchat" Margin="5,0"/>
<CheckBox Name="Installjami" Content="Jami" Margin="5,0"/>
<CheckBox Name="Installmatrix" Content="Matrix" Margin="5,0"/>
<CheckBox Name="Installsignal" Content="Signal" Margin="5,0"/>
<CheckBox Name="Installskype" Content="Skype" Margin="5,0"/>
<CheckBox Name="Installslack" Content="Slack" Margin="5,0"/>
<CheckBox Name="Installteams" Content="Teams" Margin="5,0"/>
<CheckBox Name="Installtelegram" Content="Telegram" Margin="5,0"/>
<CheckBox Name="Installviber" Content="Viber" Margin="5,0"/>
<CheckBox Name="Installzoom" Content="Zoom" Margin="5,0"/>
<CheckBox Name="WPFInstalldiscord" Content="Discord" Margin="5,0"/>
<CheckBox Name="WPFInstallhexchat" Content="Hexchat" Margin="5,0"/>
<CheckBox Name="WPFInstalljami" Content="Jami" Margin="5,0"/>
<CheckBox Name="WPFInstallmatrix" Content="Matrix" Margin="5,0"/>
<CheckBox Name="WPFInstallsignal" Content="Signal" Margin="5,0"/>
<CheckBox Name="WPFInstallskype" Content="Skype" Margin="5,0"/>
<CheckBox Name="WPFInstallslack" Content="Slack" Margin="5,0"/>
<CheckBox Name="WPFInstallteams" Content="Teams" Margin="5,0"/>
<CheckBox Name="WPFInstalltelegram" Content="Telegram" Margin="5,0"/>
<CheckBox Name="WPFInstallviber" Content="Viber" Margin="5,0"/>
<CheckBox Name="WPFInstallzoom" Content="Zoom" Margin="5,0"/>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="1" Margin="10">
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="1" Margin="10">
<Label Content="Development" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installatom" Content="Atom" Margin="5,0"/>
<CheckBox Name="Installgit" Content="Git" Margin="5,0"/>
@ -158,20 +173,19 @@
<CheckBox Name="Installvscodium" Content="VS Codium" Margin="5,0"/>
<Label Content="Document" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installadobe" Content="Adobe Reader DC" Margin="5,0"/>
<CheckBox Name="Installfoxpdf" Content="Foxit PDF" Margin="5,0"/>
<CheckBox Name="Installjoplin" Content="Joplin (FOSS Notes)" Margin="5,0"/>
<CheckBox Name="Installlibreoffice" Content="LibreOffice" Margin="5,0"/>
<CheckBox Name="Installnotepadplus" Content="Notepad++" Margin="5,0"/>
<CheckBox Name="Installobsidian" Content="Obsidian" Margin="5,0"/>
<CheckBox Name="Installonlyoffice" Content="ONLYOffice Desktop" Margin="5,0"/>
<CheckBox Name="Installopenoffice" Content="Apache OpenOffice" Margin="5,0"/>
<CheckBox Name="Installsumatra" Content="Sumatra PDF" Margin="5,0"/>
<CheckBox Name="Installwinmerge" Content="WinMerge" Margin="5,0"/>
<CheckBox Name="WPFInstalladobe" Content="Adobe Reader DC" Margin="5,0"/>
<CheckBox Name="WPFInstallfoxpdf" Content="Foxit PDF" Margin="5,0"/>
<CheckBox Name="WPFInstalljoplin" Content="Joplin (FOSS Notes)" Margin="5,0"/>
<CheckBox Name="WPFInstalllibreoffice" Content="LibreOffice" Margin="5,0"/>
<CheckBox Name="WPFInstallnotepadplus" Content="Notepad++" Margin="5,0"/>
<CheckBox Name="WPFInstallobsidian" Content="Obsidian" Margin="5,0"/>
<CheckBox Name="WPFInstallonlyoffice" Content="ONLYOffice Desktop" Margin="5,0"/>
<CheckBox Name="WPFInstallopenoffice" Content="Apache OpenOffice" Margin="5,0"/>
<CheckBox Name="WPFInstallsumatra" Content="Sumatra PDF" Margin="5,0"/>
<CheckBox Name="WPFInstallwinmerge" Content="WinMerge" Margin="5,0"/>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="2" Margin="10">
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="2" Margin="10">
<Label Content="Games" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installbluestacks" Content="Bluestacks" Margin="5,0"/>
@ -182,56 +196,55 @@
<CheckBox Name="Installubisoft" Content="Ubisoft Connect" Margin="5,0"/>
<Label Content="Pro Tools" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installadvancedip" Content="Advanced IP Scanner" Margin="5,0"/>
<CheckBox Name="Installmremoteng" Content="mRemoteNG" Margin="5,0"/>
<CheckBox Name="Installputty" Content="Putty" Margin="5,0"/>
<CheckBox Name="Installrustdesk" Content="Rust Remote Desktop (FOSS)" Margin="5,0"/>
<CheckBox Name="Installsimplewall" Content="SimpleWall" Margin="5,0"/>
<CheckBox Name="Installscp" Content="WinSCP" Margin="5,0"/>
<CheckBox Name="Installwireshark" Content="WireShark" Margin="5,0"/>
<CheckBox Name="WPFInstalladvancedip" Content="Advanced IP Scanner" Margin="5,0"/>
<CheckBox Name="WPFInstallmremoteng" Content="mRemoteNG" Margin="5,0"/>
<CheckBox Name="WPFInstallputty" Content="Putty" Margin="5,0"/>
<CheckBox Name="WPFInstallrustdesk" Content="Rust Remote Desktop (FOSS)" Margin="5,0"/>
<CheckBox Name="WPFInstallsimplewall" Content="SimpleWall" Margin="5,0"/>
<CheckBox Name="WPFInstallscp" Content="WinSCP" Margin="5,0"/>
<CheckBox Name="WPFInstallwireshark" Content="WireShark" Margin="5,0"/>
<Label Content="Microsoft Tools" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installdotnet3" Content=".NET Desktop Runtime 3.1" Margin="5,0"/>
<CheckBox Name="Installdotnet5" Content=".NET Desktop Runtime 5" Margin="5,0"/>
<CheckBox Name="Installdotnet6" Content=".NET Desktop Runtime 6" Margin="5,0"/>
<CheckBox Name="Installnuget" Content="Nuget" Margin="5,0"/>
<CheckBox Name="Installonedrive" Content="OneDrive" Margin="5,0"/>
<CheckBox Name="Installpowershell" Content="PowerShell" Margin="5,0"/>
<CheckBox Name="Installpowertoys" Content="Powertoys" Margin="5,0"/>
<CheckBox Name="Installprocessmonitor" Content="SysInternals Process Monitor" Margin="5,0"/>
<CheckBox Name="Installvc2015_64" Content="Visual C++ 2015-2022 64-bit" Margin="5,0"/>
<CheckBox Name="Installvc2015_32" Content="Visual C++ 2015-2022 32-bit" Margin="5,0"/>
<CheckBox Name="Installterminal" Content="Windows Terminal" Margin="5,0"/>
<CheckBox Name="WPFInstalldotnet3" Content=".NET Desktop Runtime 3.1" Margin="5,0"/>
<CheckBox Name="WPFInstalldotnet5" Content=".NET Desktop Runtime 5" Margin="5,0"/>
<CheckBox Name="WPFInstalldotnet6" Content=".NET Desktop Runtime 6" Margin="5,0"/>
<CheckBox Name="WPFInstallnuget" Content="Nuget" Margin="5,0"/>
<CheckBox Name="WPFInstallonedrive" Content="OneDrive" Margin="5,0"/>
<CheckBox Name="WPFInstallpowershell" Content="PowerShell" Margin="5,0"/>
<CheckBox Name="WPFInstallpowertoys" Content="Powertoys" Margin="5,0"/>
<CheckBox Name="WPFInstallprocessmonitor" Content="SysInternals Process Monitor" Margin="5,0"/>
<CheckBox Name="WPFInstallvc2015_64" Content="Visual C++ 2015-2022 64-bit" Margin="5,0"/>
<CheckBox Name="WPFInstallvc2015_32" Content="Visual C++ 2015-2022 32-bit" Margin="5,0"/>
<CheckBox Name="WPFInstallterminal" Content="Windows Terminal" Margin="5,0"/>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="3" Margin="10">
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="3" Margin="10">
<Label Content="Multimedia Tools" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installaudacity" Content="Audacity" Margin="5,0"/>
<CheckBox Name="Installblender" Content="Blender (3D Graphics)" Margin="5,0"/>
<CheckBox Name="Installcider" Content="Cider (FOSS Music Player)" Margin="5,0"/>
<CheckBox Name="Installeartrumpet" Content="Eartrumpet (Audio)" Margin="5,0"/>
<CheckBox Name="Installflameshot" Content="Flameshot (Screenshots)" Margin="5,0"/>
<CheckBox Name="Installfoobar" Content="Foobar2000 (Music Player)" Margin="5,0"/>
<CheckBox Name="Installgimp" Content="GIMP (Image Editor)" Margin="5,0"/>
<CheckBox Name="Installgreenshot" Content="Greenshot (Screenshots)" Margin="5,0"/>
<CheckBox Name="Installhandbrake" Content="HandBrake" Margin="5,0"/>
<CheckBox Name="Installimageglass" Content="ImageGlass (Image Viewer)" Margin="5,0"/>
<CheckBox Name="Installinkscape" Content="Inkscape" Margin="5,0"/>
<CheckBox Name="Installitunes" Content="iTunes" Margin="5,0"/>
<CheckBox Name="Installkdenlive" Content="Kdenlive (Video Editor)" Margin="5,0"/>
<CheckBox Name="Installkodi" Content="Kodi Media Center" Margin="5,0"/>
<CheckBox Name="Installklite" Content="K-Lite Codec Standard" Margin="5,0"/>
<CheckBox Name="Installkrita" Content="Krita (Image Editor)" Margin="5,0"/>
<CheckBox Name="Installmpc" Content="Media Player Classic (Video Player)" Margin="5,0"/>
<CheckBox Name="Installobs" Content="OBS Studio" Margin="5,0"/>
<CheckBox Name="Installnglide" Content="nGlide (3dfx compatibility)" Margin="5,0"/>
<CheckBox Name="Installsharex" Content="ShareX (Screenshots)" Margin="5,0"/>
<CheckBox Name="Installstrawberry" Content="Strawberry (Music Player)" Margin="5,0"/>
<CheckBox Name="Installvlc" Content="VLC (Video Player)" Margin="5,0"/>
<CheckBox Name="Installvoicemeeter" Content="Voicemeeter (Audio)" Margin="5,0"/>
<CheckBox Name="WPFInstallaudacity" Content="Audacity" Margin="5,0"/>
<CheckBox Name="WPFInstallblender" Content="Blender (3D Graphics)" Margin="5,0"/>
<CheckBox Name="WPFInstallcider" Content="Cider (FOSS Music Player)" Margin="5,0"/>
<CheckBox Name="WPFInstalleartrumpet" Content="Eartrumpet (Audio)" Margin="5,0"/>
<CheckBox Name="WPFInstallflameshot" Content="Flameshot (Screenshots)" Margin="5,0"/>
<CheckBox Name="WPFInstallfoobar" Content="Foobar2000 (Music Player)" Margin="5,0"/>
<CheckBox Name="WPFInstallgimp" Content="GIMP (Image Editor)" Margin="5,0"/>
<CheckBox Name="WPFInstallgreenshot" Content="Greenshot (Screenshots)" Margin="5,0"/>
<CheckBox Name="WPFInstallhandbrake" Content="HandBrake" Margin="5,0"/>
<CheckBox Name="WPFInstallimageglass" Content="ImageGlass (Image Viewer)" Margin="5,0"/>
<CheckBox Name="WPFInstallinkscape" Content="Inkscape" Margin="5,0"/>
<CheckBox Name="WPFInstallitunes" Content="iTunes" Margin="5,0"/>
<CheckBox Name="WPFInstallkdenlive" Content="Kdenlive (Video Editor)" Margin="5,0"/>
<CheckBox Name="WPFInstallkodi" Content="Kodi Media Center" Margin="5,0"/>
<CheckBox Name="WPFInstallklite" Content="K-Lite Codec Standard" Margin="5,0"/>
<CheckBox Name="WPFInstallkrita" Content="Krita (Image Editor)" Margin="5,0"/>
<CheckBox Name="WPFInstallmpc" Content="Media Player Classic (Video Player)" Margin="5,0"/>
<CheckBox Name="WPFInstallobs" Content="OBS Studio" Margin="5,0"/>
<CheckBox Name="WPFInstallnglide" Content="nGlide (3dfx compatibility)" Margin="5,0"/>
<CheckBox Name="WPFInstallsharex" Content="ShareX (Screenshots)" Margin="5,0"/>
<CheckBox Name="WPFInstallstrawberry" Content="Strawberry (Music Player)" Margin="5,0"/>
<CheckBox Name="WPFInstallvlc" Content="VLC (Video Player)" Margin="5,0"/>
<CheckBox Name="WPFInstallvoicemeeter" Content="Voicemeeter (Audio)" Margin="5,0"/>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="4" Margin="10">
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="4" Margin="10">
<Label Content="Utilities" FontSize="16" Margin="5,0"/>
<CheckBox Name="Installsevenzip" Content="7-Zip" Margin="5,0"/>
<CheckBox Name="Installalacritty" Content="Alacritty Terminal" Margin="5,0"/>
@ -271,7 +284,7 @@
</StackPanel>
</Grid>
</TabItem>
<TabItem Header="Tweaks" Visibility="Collapsed" Name="Tab2">
<TabItem Header="Tweaks" Visibility="Collapsed" Name="WPFTab2">
<Grid Background="#333333">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@ -284,15 +297,16 @@
</Grid.RowDefinitions>
<StackPanel Background="#777777" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Center" Grid.Column="0" Margin="10">
<Label Content="Recommended Selections:" FontSize="17" VerticalAlignment="Center"/>
<Button Name="desktop" Content=" Desktop " Margin="7"/>
<Button Name="laptop" Content=" Laptop " Margin="7"/>
<Button Name="minimal" Content=" Minimal " Margin="7"/>
<Button Name="clear" Content=" Clear " Margin="7"/>
<Button Name="WPFdesktop" Content=" Desktop " Margin="7"/>
<Button Name="WPFlaptop" Content=" Laptop " Margin="7"/>
<Button Name="WPFminimal" Content=" Minimal " Margin="7"/>
<Button Name="WPFclear" Content=" Clear " Margin="7"/>
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="7"/>
</StackPanel>
<StackPanel Background="#777777" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Center" Grid.Column="1" Margin="10">
<Label Content="Configuration File:" FontSize="17" VerticalAlignment="Center"/>
<Button Name="import" Content=" Import " Margin="7"/>
<Button Name="export" Content=" Export " Margin="7"/>
<Button Name="WPFimport" Content=" Import " Margin="7"/>
<Button Name="WPFexport" Content=" Export " Margin="7"/>
</StackPanel>
<StackPanel Background="#777777" Orientation="Horizontal" Grid.Row="2" HorizontalAlignment="Center" Grid.ColumnSpan="2" Margin="10">
<TextBlock Padding="10">
@ -302,52 +316,52 @@
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="0" Margin="10,5">
<Label FontSize="16" Content="Essential Tweaks"/>
<CheckBox Name="EssTweaksRP" Content="Create Restore Point" Margin="5,0" ToolTip="Creates a Windows Restore point before modifying system. Can use Windows System Restore to rollback to before tweaks were applied"/>
<CheckBox Name="EssTweaksOO" Content="Run OO Shutup" Margin="5,0" ToolTip="Runs OO Shutup from https://www.oo-software.com/en/shutup10"/>
<CheckBox Name="EssTweaksTele" Content="Disable Telemetry" Margin="5,0" ToolTip="Disables Microsoft Telemetry. Note: This will lock many Edge Browser settings. Microsoft spys heavily on you when using the Edge browser."/>
<CheckBox Name="EssTweaksWifi" Content="Disable Wifi-Sense" Margin="5,0" ToolTip="Wifi Sense is a spying service that phones home all nearby scaned wifi networks and your current geo location."/>
<CheckBox Name="EssTweaksAH" Content="Disable Activity History" Margin="5,0" ToolTip="This erases recent docs, clipboard, and run history."/>
<CheckBox Name="EssTweaksDeleteTempFiles" Content="Delete Temporary Files" Margin="5,0" ToolTip="Erases TEMP Folders"/>
<CheckBox Name="EssTweaksDiskCleanup" Content="Run Disk Cleanup" Margin="5,0" ToolTip="Runs Disk Cleanup on Drive C: and removes old Windows Updates."/>
<CheckBox Name="EssTweaksLoc" Content="Disable Location Tracking" Margin="5,0" ToolTip="Disables Location Tracking...DUH!"/>
<CheckBox Name="EssTweaksHome" Content="Disable Homegroup" Margin="5,0" ToolTip="Disables HomeGroup - Windows 11 doesn't have this, it was awful."/>
<CheckBox Name="EssTweaksStorage" Content="Disable Storage Sense" Margin="5,0" ToolTip="Storage Sense is supposed to delete temp files automatically, but often runs at wierd times and mostly doesn't do much. Although when it was introduced in Win 10 (1809 Version) it deleted people's documents... So there is that."/>
<CheckBox Name="EssTweaksHiber" Content="Disable Hibernation" Margin="5,0" ToolTip="Hibernation is really meant for laptops as it saves whats in memory before turning the pc off. It really should never be used, but some people are lazy and rely on it. Don't be like Bob. Bob likes hibernation."/>
<CheckBox Name="EssTweaksDVR" Content="Disable GameDVR" Margin="5,0" ToolTip="GameDVR is a Windows App that is a dependancy for some Store Games. I've never met someone that likes it, but it's there for the XBOX crowd."/>
<CheckBox Name="EssTweaksServices" Content="Set Services to Manual" Margin="5,0" ToolTip="Turns a bunch of system services to manual that don't need to be running all the time. This is pretty harmless as if the service is needed, it will simply start on demand."/>
<CheckBox Name="WPFEssTweaksRP" Content="Create Restore Point" Margin="5,0" ToolTip="Creates a Windows Restore point before modifying system. Can use Windows System Restore to rollback to before tweaks were applied"/>
<CheckBox Name="WPFEssTweaksOO" Content="Run OO Shutup" Margin="5,0" ToolTip="Runs OO Shutup from https://www.oo-software.com/en/shutup10"/>
<CheckBox Name="WPFEssTweaksTele" Content="Disable Telemetry" Margin="5,0" ToolTip="Disables Microsoft Telemetry. Note: This will lock many Edge Browser settings. Microsoft spys heavily on you when using the Edge browser."/>
<CheckBox Name="WPFEssTweaksWifi" Content="Disable Wifi-Sense" Margin="5,0" ToolTip="Wifi Sense is a spying service that phones home all nearby scaned wifi networks and your current geo location."/>
<CheckBox Name="WPFEssTweaksAH" Content="Disable Activity History" Margin="5,0" ToolTip="This erases recent docs, clipboard, and run history."/>
<CheckBox Name="WPFEssTweaksDeleteTempFiles" Content="Delete Temporary Files" Margin="5,0" ToolTip="Erases TEMP Folders"/>
<CheckBox Name="WPFEssTweaksDiskCleanup" Content="Run Disk Cleanup" Margin="5,0" ToolTip="Runs Disk Cleanup on Drive C: and removes old Windows Updates."/>
<CheckBox Name="WPFEssTweaksLoc" Content="Disable Location Tracking" Margin="5,0" ToolTip="Disables Location Tracking...DUH!"/>
<CheckBox Name="WPFEssTweaksHome" Content="Disable Homegroup" Margin="5,0" ToolTip="Disables HomeGroup - Windows 11 doesn't have this, it was awful."/>
<CheckBox Name="WPFEssTweaksStorage" Content="Disable Storage Sense" Margin="5,0" ToolTip="Storage Sense is supposed to delete temp files automatically, but often runs at wierd times and mostly doesn't do much. Although when it was introduced in Win 10 (1809 Version) it deleted people's documents... So there is that."/>
<CheckBox Name="WPFEssTweaksHiber" Content="Disable Hibernation" Margin="5,0" ToolTip="Hibernation is really meant for laptops as it saves whats in memory before turning the pc off. It really should never be used, but some people are lazy and rely on it. Don't be like Bob. Bob likes hibernation."/>
<CheckBox Name="WPFEssTweaksDVR" Content="Disable GameDVR" Margin="5,0" ToolTip="GameDVR is a Windows App that is a dependancy for some Store Games. I've never met someone that likes it, but it's there for the XBOX crowd."/>
<CheckBox Name="WPFEssTweaksServices" Content="Set Services to Manual" Margin="5,0" ToolTip="Turns a bunch of system services to manual that don't need to be running all the time. This is pretty harmless as if the service is needed, it will simply start on demand."/>
<Label Content="Dark Theme" />
<StackPanel Orientation="Horizontal">
<Label Content="Off" />
<CheckBox Name="ToggleDarkMode" Style="{StaticResource ToggleSwitchStyle}" Margin="2.5,0"/>
<CheckBox Name="WPFToggleDarkMode" Style="{StaticResource ToggleSwitchStyle}" Margin="2.5,0"/>
<Label Content="On" />
</StackPanel>
<Label Content="Performance Plans" />
<Button Name="AddUltPerf" Background="AliceBlue" Content="Add Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="300"/>
<Button Name="RemoveUltPerf" Background="AliceBlue" Content="Remove Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,0,0,5" Padding="20,5" Width="300"/>
<Button Name="WPFAddUltPerf" Background="AliceBlue" Content="Add Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="300"/>
<Button Name="WPFRemoveUltPerf" Background="AliceBlue" Content="Remove Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,0,0,5" Padding="20,5" Width="300"/>
<Label Content="Shortcuts" />
<Button Name="WinUtilShortcut" Background="AliceBlue" Content="Create WinUtil Shortcut" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="300"/>
<Button Name="WPFWinUtilShortcut" Background="AliceBlue" Content="Create WinUtil Shortcut" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="300"/>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="1" Margin="10,5">
<Label FontSize="16" Content="Misc. Tweaks"/>
<CheckBox Name="MiscTweaksPower" Content="Disable Power Throttling" Margin="5,0" ToolTip="This is mainly for Laptops, It disables Power Throttling and will use more battery."/>
<CheckBox Name="MiscTweaksLapPower" Content="Enable Power Throttling" Margin="5,0" ToolTip="ONLY FOR LAPTOPS! Do not use on a desktop."/>
<CheckBox Name="MiscTweaksNum" Content="Enable NumLock on Startup" Margin="5,0" ToolTip="This creates a time vortex and send you back to the past... or it simply turns numlock on at startup"/>
<CheckBox Name="MiscTweaksLapNum" Content="Disable Numlock on Startup" Margin="5,0" ToolTip="Disables Numlock... Very useful when you are on a laptop WITHOUT 9-key and this fixes that issue when the numlock is enabled!"/>
<CheckBox Name="MiscTweaksExt" Content="Show File Extensions" Margin="5,0"/>
<CheckBox Name="MiscTweaksDisplay" Content="Set Display for Performance" Margin="5,0" ToolTip="Sets the system preferences to performance. You can do this manually with sysdm.cpl as well."/>
<CheckBox Name="MiscTweaksUTC" Content="Set Time to UTC (Dual Boot)" Margin="5,0" ToolTip="Essential for computers that are dual booting. Fixes the time sync with Linux Systems."/>
<CheckBox Name="MiscTweaksDisableUAC" Content="Disable UAC" Margin="5,0" ToolTip="Disables User Account Control. Only recommended for Expert Users."/>
<CheckBox Name="MiscTweaksDisableNotifications" Content="Disable Notification Tray/Calendar" Margin="5,0" ToolTip="Disables all Notifications INCLUDING Calendar"/>
<CheckBox Name="MiscTweaksDisableTPMCheck" Content="Disable TPM on Update" Margin="5,0" ToolTip="Add the Windows 11 Bypass for those that want to upgrade their Windows 10."/>
<CheckBox Name="EssTweaksDeBloat" Content="Remove ALL MS Store Apps" Margin="5,0" ToolTip="USE WITH CAUTION!!!!! This will remove ALL Microsoft store apps other than the essentials to make winget work. Games installed by MS Store ARE INCLUDED!"/>
<CheckBox Name="EssTweaksRemoveCortana" Content="Remove Cortana" Margin="5,0" ToolTip="Removes Cortana, but often breaks search... if you are a heavy windows search users, this is NOT recommended."/>
<CheckBox Name="EssTweaksRemoveEdge" Content="Remove Microsoft Edge" Margin="5,0" ToolTip="Removes MS Edge when it gets reinstalled by updates."/>
<CheckBox Name="MiscTweaksRightClickMenu" Content="Set Classic Right-Click Menu " Margin="5,0" ToolTip="Great Windows 11 tweak to bring back good context menus when right clicking things in explorer."/>
<CheckBox Name="MiscTweaksDisableMouseAcceleration" Content="Disable Mouse Acceleration" Margin="5,0" ToolTip="Disables Mouse Acceleration."/>
<CheckBox Name="MiscTweaksEnableMouseAcceleration" Content="Enable Mouse Acceleration" Margin="5,0" ToolTip="Enables Mouse Acceleration."/>
<CheckBox Name="WPFMiscTweaksPower" Content="Disable Power Throttling" Margin="5,0" ToolTip="This is mainly for Laptops, It disables Power Throttling and will use more battery."/>
<CheckBox Name="WPFMiscTweaksLapPower" Content="Enable Power Throttling" Margin="5,0" ToolTip="ONLY FOR LAPTOPS! Do not use on a desktop."/>
<CheckBox Name="WPFMiscTweaksNum" Content="Enable NumLock on Startup" Margin="5,0" ToolTip="This creates a time vortex and send you back to the past... or it simply turns numlock on at startup"/>
<CheckBox Name="WPFMiscTweaksLapNum" Content="Disable Numlock on Startup" Margin="5,0" ToolTip="Disables Numlock... Very useful when you are on a laptop WITHOUT 9-key and this fixes that issue when the numlock is enabled!"/>
<CheckBox Name="WPFMiscTweaksExt" Content="Show File Extensions" Margin="5,0"/>
<CheckBox Name="WPFMiscTweaksDisplay" Content="Set Display for Performance" Margin="5,0" ToolTip="Sets the system preferences to performance. You can do this manually with sysdm.cpl as well."/>
<CheckBox Name="WPFMiscTweaksUTC" Content="Set Time to UTC (Dual Boot)" Margin="5,0" ToolTip="Essential for computers that are dual booting. Fixes the time sync with Linux Systems."/>
<CheckBox Name="WPFMiscTweaksDisableUAC" Content="Disable UAC" Margin="5,0" ToolTip="Disables User Account Control. Only recommended for Expert Users."/>
<CheckBox Name="WPFMiscTweaksDisableNotifications" Content="Disable Notification Tray/Calendar" Margin="5,0" ToolTip="Disables all Notifications INCLUDING Calendar"/>
<CheckBox Name="WPFMiscTweaksDisableTPMCheck" Content="Disable TPM on Update" Margin="5,0" ToolTip="Add the Windows 11 Bypass for those that want to upgrade their Windows 10."/>
<CheckBox Name="WPFEssTweaksDeBloat" Content="Remove ALL MS Store Apps" Margin="5,0" ToolTip="USE WITH CAUTION!!!!! This will remove ALL Microsoft store apps other than the essentials to make winget work. Games installed by MS Store ARE INCLUDED!"/>
<CheckBox Name="WPFEssTweaksRemoveCortana" Content="Remove Cortana" Margin="5,0" ToolTip="Removes Cortana, but often breaks search... if you are a heavy windows search users, this is NOT recommended."/>
<CheckBox Name="WPFEssTweaksRemoveEdge" Content="Remove Microsoft Edge" Margin="5,0" ToolTip="Removes MS Edge when it gets reinstalled by updates."/>
<CheckBox Name="WPFMiscTweaksRightClickMenu" Content="Set Classic Right-Click Menu " Margin="5,0" ToolTip="Great Windows 11 tweak to bring back good context menus when right clicking things in explorer."/>
<CheckBox Name="WPFMiscTweaksDisableMouseAcceleration" Content="Disable Mouse Acceleration" Margin="5,0" ToolTip="Disables Mouse Acceleration."/>
<CheckBox Name="WPFMiscTweaksEnableMouseAcceleration" Content="Enable Mouse Acceleration" Margin="5,0" ToolTip="Enables Mouse Acceleration."/>
<Label Content="DNS" />
<ComboBox Name="changedns" Height = "20" Width = "150" HorizontalAlignment = "Left" Margin="5,5">
<ComboBox Name="WPFchangedns" Height = "20" Width = "150" HorizontalAlignment = "Left" Margin="5,5">
<ComboBoxItem IsSelected="True" Content = "Default"/>
<ComboBoxItem Content = "DHCP"/>
<ComboBoxItem Content = "Google"/>
@ -358,12 +372,12 @@
<ComboBoxItem Content = "Open_DNS"/>
<ComboBoxItem Content = "Quad9"/>
</ComboBox>
<Button Name="tweaksbutton" Background="AliceBlue" Content="Run Tweaks " HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="150"/>
<Button Name="undoall" Background="AliceBlue" Content="Undo Selected Tweaks" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="150"/>
<Button Name="WPFtweaksbutton" Background="AliceBlue" Content="Run Tweaks " HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="150"/>
<Button Name="WPFundoall" Background="AliceBlue" Content="Undo Selected Tweaks" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="150"/>
</StackPanel>
</Grid>
</TabItem>
<TabItem Header="Config" Visibility="Collapsed" Name="Tab3">
<TabItem Header="Config" Visibility="Collapsed" Name="WPFTab3">
<Grid Background="#444444">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@ -371,29 +385,29 @@
</Grid.ColumnDefinitions>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="0" Margin="10,5">
<Label Content="Features" FontSize="16"/>
<CheckBox Name="Featuresdotnet" Content="All .Net Framework (2,3,4)" Margin="5,0"/>
<CheckBox Name="Featureshyperv" Content="HyperV Virtualization" Margin="5,0"/>
<CheckBox Name="Featureslegacymedia" Content="Legacy Media (WMP, DirectPlay)" Margin="5,0"/>
<CheckBox Name="Featurenfs" Content="NFS - Network File System" Margin="5,0"/>
<CheckBox Name="Featurewsl" Content="Windows Subsystem for Linux" Margin="5,0"/>
<Button Name="FeatureInstall" FontSize="14" Background="AliceBlue" Content="Install Features" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="150"/>
<CheckBox Name="WPFFeaturesdotnet" Content="All .Net Framework (2,3,4)" Margin="5,0"/>
<CheckBox Name="WPFFeatureshyperv" Content="HyperV Virtualization" Margin="5,0"/>
<CheckBox Name="WPFFeatureslegacymedia" Content="Legacy Media (WMP, DirectPlay)" Margin="5,0"/>
<CheckBox Name="WPFFeaturenfs" Content="NFS - Network File System" Margin="5,0"/>
<CheckBox Name="WPFFeaturewsl" Content="Windows Subsystem for Linux" Margin="5,0"/>
<Button Name="WPFFeatureInstall" FontSize="14" Background="AliceBlue" Content="Install Features" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="150"/>
<Label Content="Fixes" FontSize="16"/>
<Button Name="PanelAutologin" FontSize="14" Background="AliceBlue" Content="Set Up Autologin" HorizontalAlignment = "Left" Margin="5,2" Padding="20,5" Width="300"/>
<Button Name="FixesUpdate" FontSize="14" Background="AliceBlue" Content="Reset Windows Update" HorizontalAlignment = "Left" Margin="5,2" Padding="20,5" Width="300"/>
<Button Name="PanelDISM" FontSize="14" Background="AliceBlue" Content="System Corruption Scan" HorizontalAlignment = "Left" Margin="5,2" Padding="20,5" Width="300"/>
<Button Name="WPFPanelAutologin" FontSize="14" Background="AliceBlue" Content="Set Up Autologin" HorizontalAlignment = "Left" Margin="5,2" Padding="20,5" Width="300"/>
<Button Name="WPFFixesUpdate" FontSize="14" Background="AliceBlue" Content="Reset Windows Update" HorizontalAlignment = "Left" Margin="5,2" Padding="20,5" Width="300"/>
<Button Name="WPFPanelDISM" FontSize="14" Background="AliceBlue" Content="System Corruption Scan" HorizontalAlignment = "Left" Margin="5,2" Padding="20,5" Width="300"/>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="1" Margin="10,5">
<Label Content="Legacy Windows Panels" FontSize="16"/>
<Button Name="Panelcontrol" FontSize="14" Background="AliceBlue" Content="Control Panel" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="Panelnetwork" FontSize="14" Background="AliceBlue" Content="Network Connections" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="Panelpower" FontSize="14" Background="AliceBlue" Content="Power Panel" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="Panelsound" FontSize="14" Background="AliceBlue" Content="Sound Settings" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="Panelsystem" FontSize="14" Background="AliceBlue" Content="System Properties" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="Paneluser" FontSize="14" Background="AliceBlue" Content="User Accounts" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="WPFPanelcontrol" FontSize="14" Background="AliceBlue" Content="Control Panel" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="WPFPanelnetwork" FontSize="14" Background="AliceBlue" Content="Network Connections" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="WPFPanelpower" FontSize="14" Background="AliceBlue" Content="Power Panel" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="WPFPanelsound" FontSize="14" Background="AliceBlue" Content="Sound Settings" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="WPFPanelsystem" FontSize="14" Background="AliceBlue" Content="System Properties" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
<Button Name="WPFPaneluser" FontSize="14" Background="AliceBlue" Content="User Accounts" HorizontalAlignment = "Left" Margin="5" Padding="20,5" Width="200"/>
</StackPanel>
</Grid>
</TabItem>
<TabItem Header="Updates" Visibility="Collapsed" Name="Tab4">
<TabItem Header="Updates" Visibility="Collapsed" Name="WPFTab4">
<Grid Background="#555555">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@ -401,15 +415,15 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="0" Margin="10,5">
<Button Name="Updatesdefault" FontSize="16" Background="AliceBlue" Content="Default (Out of Box) Settings" Margin="20,0,20,10" Padding="10"/>
<Button Name="WPFUpdatesdefault" FontSize="16" Background="AliceBlue" Content="Default (Out of Box) Settings" Margin="20,0,20,10" Padding="10"/>
<TextBlock Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This is the default settings that come with Windows. <LineBreak/><LineBreak/> No modifications are made and will remove any custom windows update settings.<LineBreak/><LineBreak/>Note: If you still encounter update errors, reset all updates in the config tab. That will restore ALL Microsoft Update Services from their servers and reinstall them to default settings.</TextBlock>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="1" Margin="10,5">
<Button Name="Updatessecurity" FontSize="16" Background="AliceBlue" Content="Security (Recommended) Settings" Margin="20,0,20,10" Padding="10"/>
<Button Name="WPFUpdatessecurity" FontSize="16" Background="AliceBlue" Content="Security (Recommended) Settings" Margin="20,0,20,10" Padding="10"/>
<TextBlock Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This is my recommended setting I use on all computers.<LineBreak/><LineBreak/> It will delay feature updates by 2 years and will install security updates 4 days after release.<LineBreak/><LineBreak/>Feature Updates: Adds features and often bugs to systems when they are released. You want to delay these as long as possible.<LineBreak/><LineBreak/>Security Updates: Typically these are pressing security flaws that need to be patched quickly. You only want to delay these a couple of days just to see if they are safe and don't break other systems. You don't want to go without these for ANY extended periods of time.</TextBlock>
</StackPanel>
<StackPanel Background="#777777" SnapsToDevicePixels="True" Grid.Column="2" Margin="10,5">
<Button Name="Updatesdisable" FontSize="16" Background="AliceBlue" Content="Disable ALL Updates (NOT RECOMMENDED!)" Margin="20,0,20,10" Padding="10,10,10,10"/>
<Button Name="WPFUpdatesdisable" FontSize="16" Background="AliceBlue" Content="Disable ALL Updates (NOT RECOMMENDED!)" Margin="20,0,20,10" Padding="10,10,10,10"/>
<TextBlock Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300">This completely disables ALL Windows Updates and is NOT RECOMMENDED.<LineBreak/><LineBreak/> However, it can be suitable if you use your system for a select purpose and do not actively browse the internet. <LineBreak/><LineBreak/>Note: Your system will be easier to hack and infect without security updates.</TextBlock>
<TextBlock Text=" " Margin="20,0,20,0" Padding="10" TextWrapping="WrapWithOverflow" MaxWidth="300"/>