Compare commits

...

25 Commits

Author SHA1 Message Date
986376c44a Revert "Refactor preferChocolatey system to handle other package managers eas…"
This reverts commit 89919494e5.
2025-04-14 13:57:10 -05:00
89919494e5 Refactor preferChocolatey system to handle other package managers easier (#3296)
* Easier to add more package managers changes

* style fixes
2025-04-14 13:33:16 -05:00
5f6bdb2e48 Update tweaks.json 2025-04-14 13:27:02 -05:00
f614eea435 Add "Disable news and interest" tweak (#3289) 2025-04-14 13:22:29 -05:00
82447a1e7b Remove Balena Etcher due to privacy concerns (#3268) 2025-04-14 13:19:19 -05:00
51424abfad Update preset.json 2025-04-14 13:08:55 -05:00
3caa3be9a3 Update tweaks.json 2025-04-14 13:08:01 -05:00
7769a328bb feat: disable explorer automatic folder discovery (#3262)
* feat: add tweak "Disable Explorer automatic folder discovery"

* refactor: add comments

* feat: add undo script

* refactor: add output comment

* fix: use correct registry key
2025-04-14 13:03:00 -05:00
425f11d787 Fix Double Click problem by using UIElement Names instead of Types (#3246)
* Fix Double Click problem by using UIElement Names instead of Types

* Use lower case 'or' to follow project's common conventions
2025-04-14 12:55:52 -05:00
6df94df594 Delete Invoke-WinUtilInteractiveNerdFontInstall.ps1 2025-04-14 12:49:59 -05:00
29e2c4d197 Action on application right click (#3243)
* implement right click logic

- right click clears selection and only selects right clicked app

* simplify logic
2025-04-14 12:40:20 -05:00
b63a17b7dd Create Invoke-WinUtilInteractiveNerdFontInstall.ps1 (#3183)
Using this script, we could integrate inside of the XAML, a list of all current nerdfonts, and user can choose which to install.

https://raw.githubusercontent.com/jpawlowski/nerd-fonts-installer-PS/main/Invoke-NerdFontInstaller.ps1

I am not sure how to add it into xaml :  - (
2025-04-14 12:37:00 -05:00
abe059917c Optimize UI Performance (#3277)
* Optimize UI Load performance

* remove timers

* Formatting

* Remove unused Collapsed Checkbox Style from inputXML.xaml
2025-04-02 15:54:44 -05:00
698f1644c3 [Toggle] Hide Settings Homepage (#3245)
* addHideSettingsToggle

* set OriginalValue & DefaultState
2025-03-19 14:32:16 -05:00
zy
fd03f33c50 Correct description for Prism Launcher (#3256) 2025-03-19 14:07:21 -05:00
8f9e7d1b7c Correct the Header Font Size (#3257)
* Correct the Header Font Size naming and simplify the creation of the Selected Apps Button

* Adjust HeaderFontSize from 18 to 16 for improved readability
2025-03-19 14:05:55 -05:00
b3dd1a1a50 Add God Mode panel to Legacy Windows Panels (#3264) 2025-03-19 14:00:30 -05:00
4acad32a38 Add Badge to Link to the Documentation at the Top of the Readme (#3265) 2025-03-19 13:59:10 -05:00
0f4fca31b9 [DOCS] Remove old Announcement about not adding any new applications to the app list (#3269)
* Remove old Announcement about not adding any new applications to the app list

* Update '.gitignore' file

The generated 'site' folder, which contains the docs build result by 'mkdocs', in the same folder as 'mkdocs.yml' (i.e. under '.github' folder), so I've temporarily excluded with '.gitignore' file until we've fully migrated the docs site into another repo.
2025-03-19 13:56:00 -05:00
36c984b66c Deploying to main from @ ChrisTitusTech/winutil@d215d0fc2c 🚀 2025-03-19 15:33:49 +00:00
d215d0fc2c Deploying to main from @ ChrisTitusTech/winutil@52de4690ab 🚀 2025-03-07 15:32:54 +00:00
52de4690ab Update start.ps1 (#3223)
- use join method to parse $argList
- use $PSCommandPath instead of $MyInvocation.MyCommand.Path
- use ScriptBlock method to create request for latest winutil.ps1 with join $argList 
- condition for $processCmd because in case when wt.exe is not available, there was double/redundant declaration of shell which lead to code mishmash (incorrect interpretation of quotes from Start-Process ArgumentList parameters 
- changes in quotes and escape characters because command where not interpreted correctly in all possible cases of $powershellCmd and $processCmd
2025-03-05 12:15:13 -06:00
ef97a8da24 [WinGet] Fix install loop (#3235)
Only this parameter was missing
2025-03-05 12:13:39 -06:00
18a7f17a0b [APP addition] Zen Browser (#3231)
* add Zen to Browsers for Applications

* remove choco option since it currently needs the --pre flag
2025-03-04 14:31:28 -06:00
5a8cf5deb6 Removing Github and Nuget method. Revamp of Version check to use DesktopAppInstaller (#3233) 2025-03-04 14:30:54 -06:00
19 changed files with 310 additions and 281 deletions

5
.gitignore vendored
View File

@ -47,4 +47,7 @@ True
test.ps1 test.ps1
winutil.ps1 winutil.ps1
binary/ # temporary excludes for docs
.github/site/
binary/

View File

@ -3,6 +3,7 @@
[![Version](https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge)](https://github.com/ChrisTitusTech/winutil/releases/latest) [![Version](https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge)](https://github.com/ChrisTitusTech/winutil/releases/latest)
![GitHub Downloads (specific asset, all releases)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge) ![GitHub Downloads (specific asset, all releases)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge)
[![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ) [![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)
[![Static Badge](https://img.shields.io/badge/Documentation-_?style=for-the-badge&logo=bookstack&color=grey)](https://christitustech.github.io/winutil/)
This utility is a compilation of Windows tasks I perform on each Windows system I use. It is meant to streamline *installs*, debloat with *tweaks*, troubleshoot with *config*, and fix Windows *updates*. I am extremely picky about any contributions to keep this project clean and efficient. This utility is a compilation of Windows tasks I perform on each Windows system I use. It is meant to streamline *installs*, debloat with *tweaks*, troubleshoot with *config*, and fix Windows *updates*. I am extremely picky about any contributions to keep this project clean and efficient.
@ -52,7 +53,7 @@ If you have Issues, refer to [Known Issues](https://christitustech.github.io/win
These are the sponsors that help keep this project alive with monthly contributions. These are the sponsors that help keep this project alive with monthly contributions.
<!-- sponsors --><a href="https://github.com/TriHydera"><img src="https:&#x2F;&#x2F;github.com&#x2F;TriHydera.png" width="60px" alt="User avatar: TriHydera" /></a><a href="https://github.com/jozozovko"><img src="https:&#x2F;&#x2F;github.com&#x2F;jozozovko.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/DelDongo"><img src="https:&#x2F;&#x2F;github.com&#x2F;DelDongo.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/markamos"><img src="https:&#x2F;&#x2F;github.com&#x2F;markamos.png" width="60px" alt="User avatar: Mark Amos" /></a><a href="https://github.com/dwelfusius"><img src="https:&#x2F;&#x2F;github.com&#x2F;dwelfusius.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/mews-se"><img src="https:&#x2F;&#x2F;github.com&#x2F;mews-se.png" width="60px" alt="User avatar: Martin Stockzell" /></a><a href="https://github.com/jdiegmueller"><img src="https:&#x2F;&#x2F;github.com&#x2F;jdiegmueller.png" width="60px" alt="User avatar: Jason A. Diegmueller" /></a><a href="https://github.com/altugtekiner"><img src="https:&#x2F;&#x2F;github.com&#x2F;altugtekiner.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/robertsandrock"><img src="https:&#x2F;&#x2F;github.com&#x2F;robertsandrock.png" width="60px" alt="User avatar: RMS" /></a><a href="https://github.com/KenichiQaz"><img src="https:&#x2F;&#x2F;github.com&#x2F;KenichiQaz.png" width="60px" alt="User avatar: Stefan" /></a><a href="https://github.com/paulsheets"><img src="https:&#x2F;&#x2F;github.com&#x2F;paulsheets.png" width="60px" alt="User avatar: Paul" /></a><a href="https://github.com/djones369"><img src="https:&#x2F;&#x2F;github.com&#x2F;djones369.png" width="60px" alt="User avatar: Dave Jones" /></a><a href="https://github.com/anthonymendez"><img src="https:&#x2F;&#x2F;github.com&#x2F;anthonymendez.png" width="60px" alt="User avatar: Anthony Mendez" /></a><a href="https://github.com/claudemods"><img src="https:&#x2F;&#x2F;github.com&#x2F;claudemods.png" width="60px" alt="User avatar: Claudemods" /></a><a href="https://github.com/FatBastard0"><img src="https:&#x2F;&#x2F;github.com&#x2F;FatBastard0.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/Ascent7910"><img src="https:&#x2F;&#x2F;github.com&#x2F;Ascent7910.png" width="60px" alt="User avatar: Max" /></a><a href="https://github.com/DursleyGuy"><img src="https:&#x2F;&#x2F;github.com&#x2F;DursleyGuy.png" width="60px" alt="User avatar: DursleyGuy" /></a><a href="https://github.com/realmuddy"><img src="https:&#x2F;&#x2F;github.com&#x2F;realmuddy.png" width="60px" alt="User avatar: Phillip Waters" /></a><a href="https://github.com/quaszi"><img src="https:&#x2F;&#x2F;github.com&#x2F;quaszi.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/DwayneTheRockLobster1"><img src="https:&#x2F;&#x2F;github.com&#x2F;DwayneTheRockLobster1.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/KieraKujisawa"><img src="https:&#x2F;&#x2F;github.com&#x2F;KieraKujisawa.png" width="60px" alt="User avatar: Kiera Meredith" /></a><!-- sponsors --> <!-- sponsors --><a href="https://github.com/TriHydera"><img src="https:&#x2F;&#x2F;github.com&#x2F;TriHydera.png" width="60px" alt="User avatar: TriHydera" /></a><a href="https://github.com/DelDongo"><img src="https:&#x2F;&#x2F;github.com&#x2F;DelDongo.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/markamos"><img src="https:&#x2F;&#x2F;github.com&#x2F;markamos.png" width="60px" alt="User avatar: Mark Amos" /></a><a href="https://github.com/dwelfusius"><img src="https:&#x2F;&#x2F;github.com&#x2F;dwelfusius.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/mews-se"><img src="https:&#x2F;&#x2F;github.com&#x2F;mews-se.png" width="60px" alt="User avatar: Martin Stockzell" /></a><a href="https://github.com/jdiegmueller"><img src="https:&#x2F;&#x2F;github.com&#x2F;jdiegmueller.png" width="60px" alt="User avatar: Jason A. Diegmueller" /></a><a href="https://github.com/altugtekiner"><img src="https:&#x2F;&#x2F;github.com&#x2F;altugtekiner.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/robertsandrock"><img src="https:&#x2F;&#x2F;github.com&#x2F;robertsandrock.png" width="60px" alt="User avatar: RMS" /></a><a href="https://github.com/KenichiQaz"><img src="https:&#x2F;&#x2F;github.com&#x2F;KenichiQaz.png" width="60px" alt="User avatar: Stefan" /></a><a href="https://github.com/paulsheets"><img src="https:&#x2F;&#x2F;github.com&#x2F;paulsheets.png" width="60px" alt="User avatar: Paul" /></a><a href="https://github.com/djones369"><img src="https:&#x2F;&#x2F;github.com&#x2F;djones369.png" width="60px" alt="User avatar: Dave Jones" /></a><a href="https://github.com/anthonymendez"><img src="https:&#x2F;&#x2F;github.com&#x2F;anthonymendez.png" width="60px" alt="User avatar: Anthony Mendez" /></a><a href="https://github.com/claudemods"><img src="https:&#x2F;&#x2F;github.com&#x2F;claudemods.png" width="60px" alt="User avatar: claudemods" /></a><a href="https://github.com/FatBastard0"><img src="https:&#x2F;&#x2F;github.com&#x2F;FatBastard0.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/Ascent7910"><img src="https:&#x2F;&#x2F;github.com&#x2F;Ascent7910.png" width="60px" alt="User avatar: Max" /></a><a href="https://github.com/DursleyGuy"><img src="https:&#x2F;&#x2F;github.com&#x2F;DursleyGuy.png" width="60px" alt="User avatar: DursleyGuy" /></a><a href="https://github.com/realmuddy"><img src="https:&#x2F;&#x2F;github.com&#x2F;realmuddy.png" width="60px" alt="User avatar: Phillip Waters" /></a><a href="https://github.com/quaszi"><img src="https:&#x2F;&#x2F;github.com&#x2F;quaszi.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/DwayneTheRockLobster1"><img src="https:&#x2F;&#x2F;github.com&#x2F;DwayneTheRockLobster1.png" width="60px" alt="User avatar: " /></a><a href="https://github.com/KieraKujisawa"><img src="https:&#x2F;&#x2F;github.com&#x2F;KieraKujisawa.png" width="60px" alt="User avatar: Kiera Meredith" /></a><!-- sponsors -->
## 🏅 Thanks to all Contributors ## 🏅 Thanks to all Contributors
Thanks a lot for spending your time helping Winutil grow. Thanks a lot! Keep rocking 🍻. Thanks a lot for spending your time helping Winutil grow. Thanks a lot! Keep rocking 🍻.

View File

@ -527,14 +527,6 @@
"link": "https://espanso.org/", "link": "https://espanso.org/",
"winget": "Espanso.Espanso" "winget": "Espanso.Espanso"
}, },
"etcher": {
"category": "Utilities",
"choco": "etcher",
"content": "Etcher USB Creator",
"description": "Etcher is a powerful tool for creating bootable USB drives with ease.",
"link": "https://www.balena.io/etcher/",
"winget": "Balena.Etcher"
},
"falkon": { "falkon": {
"category": "Browsers", "category": "Browsers",
"choco": "falkon", "choco": "falkon",
@ -1699,7 +1691,7 @@
"category": "Games", "category": "Games",
"choco": "prismlauncher", "choco": "prismlauncher",
"content": "Prism Launcher", "content": "Prism Launcher",
"description": "Prism Launcher is a game launcher and manager designed to provide a clean and intuitive interface for organizing and launching your games.", "description": "Prism Launcher is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods.",
"link": "https://prismlauncher.org/", "link": "https://prismlauncher.org/",
"winget": "PrismLauncher.PrismLauncher" "winget": "PrismLauncher.PrismLauncher"
}, },
@ -2934,5 +2926,13 @@
"description": "Fork - a fast and friendly git client.", "description": "Fork - a fast and friendly git client.",
"link": "https://git-fork.com/", "link": "https://git-fork.com/",
"winget": "Fork.Fork" "winget": "Fork.Fork"
},
"ZenBrowser": {
"category": "Browsers",
"choco": "na",
"content": "Zen Browser",
"description": "The modern, privacy-focused, performance-driven browser built on Firefox",
"link": "https://zen-browser.app/",
"winget": "Zen-Team.Zen-Browser"
} }
} }

View File

@ -306,6 +306,13 @@
"ButtonWidth": "300", "ButtonWidth": "300",
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/user" "link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/user"
}, },
"WPFPanelGodMode": {
"Content": "God Mode",
"category": "Legacy Windows Panels",
"panel": "2",
"Type": "Button",
"ButtonWidth": "300"
},
"WPFWinUtilInstallPSProfile": { "WPFWinUtilInstallPSProfile": {
"Content": "Install CTT PowerShell Profile", "Content": "Install CTT PowerShell Profile",
"category": "Powershell Profile", "category": "Powershell Profile",

View File

@ -2,6 +2,7 @@
"Standard": [ "Standard": [
"WPFTweaksAH", "WPFTweaksAH",
"WPFTweaksConsumerFeatures", "WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksDVR", "WPFTweaksDVR",
"WPFTweaksHiber", "WPFTweaksHiber",
"WPFTweaksHome", "WPFTweaksHome",
@ -18,6 +19,7 @@
], ],
"Minimal": [ "Minimal": [
"WPFTweaksConsumerFeatures", "WPFTweaksConsumerFeatures",
"WPFTweaksDisableExplorerAutoDiscovery",
"WPFTweaksHome", "WPFTweaksHome",
"WPFTweaksServices", "WPFTweaksServices",
"WPFTweaksTele" "WPFTweaksTele"

View File

@ -7,7 +7,7 @@
"CustomDialogHeight": "200", "CustomDialogHeight": "200",
"FontSize": "12", "FontSize": "12",
"FontFamily": "Arial", "FontFamily": "Arial",
"HeadingFontSize": "16", "HeaderFontSize": "16",
"HeaderFontFamily": "Consolas, Monaco", "HeaderFontFamily": "Consolas, Monaco",
"CheckBoxBulletDecoratorSize": "14", "CheckBoxBulletDecoratorSize": "14",
"CheckBoxMargin": "15,0,0,2", "CheckBoxMargin": "15,0,0,2",
@ -35,7 +35,8 @@
"CheckboxMouseOverColor": "#999999", "CheckboxMouseOverColor": "#999999",
"ButtonBorderThickness": "1", "ButtonBorderThickness": "1",
"ButtonMargin": "1", "ButtonMargin": "1",
"ButtonCornerRadius": "2" "ButtonCornerRadius": "2",
"AppTileImageSize": "40"
}, },
"Light": { "Light": {
"AppInstallUnselectedColor": "#F0F0F0", "AppInstallUnselectedColor": "#F0F0F0",

View File

@ -3414,12 +3414,30 @@
], ],
"link": "https://christitustech.github.io/winutil/dev/tweaks/Customize-Preferences/WPFToggleStartMenuRecommendations" "link": "https://christitustech.github.io/winutil/dev/tweaks/Customize-Preferences/WPFToggleStartMenuRecommendations"
}, },
"WPFToggleHideSettingsHome": {
"Content": "Remove Settings Home Page",
"Description": "Removes the Home page in the Windows Settings app.",
"category": "Customize Preferences",
"panel": "2",
"Order": "a105_",
"Type": "Toggle",
"registry": [
{
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
"Name": "SettingsPageVisibility",
"Type": "String",
"Value": "hide:home",
"OriginalValue": "show:home",
"DefaultState": "false"
}
]
},
"WPFToggleSnapWindow": { "WPFToggleSnapWindow": {
"Content": "Snap Window", "Content": "Snap Window",
"Description": "If enabled you can align windows by dragging them. | Relogin Required", "Description": "If enabled you can align windows by dragging them. | Relogin Required",
"category": "Customize Preferences", "category": "Customize Preferences",
"panel": "2", "panel": "2",
"Order": "a105_", "Order": "a106_",
"Type": "Toggle", "Type": "Toggle",
"registry": [ "registry": [
{ {
@ -3438,7 +3456,7 @@
"Description": "If enabled then Snap preview is disabled when maximize button is hovered.", "Description": "If enabled then Snap preview is disabled when maximize button is hovered.",
"category": "Customize Preferences", "category": "Customize Preferences",
"panel": "2", "panel": "2",
"Order": "a106_", "Order": "a107_",
"Type": "Toggle", "Type": "Toggle",
"registry": [ "registry": [
{ {
@ -3467,7 +3485,7 @@
"Description": "If enabled then you will get suggestions to snap other applications in the left over spaces.", "Description": "If enabled then you will get suggestions to snap other applications in the left over spaces.",
"category": "Customize Preferences", "category": "Customize Preferences",
"panel": "2", "panel": "2",
"Order": "a107_", "Order": "a108_",
"Type": "Toggle", "Type": "Toggle",
"registry": [ "registry": [
{ {
@ -3496,7 +3514,7 @@
"Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.", "Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.",
"category": "Customize Preferences", "category": "Customize Preferences",
"panel": "2", "panel": "2",
"Order": "a108_", "Order": "a109_",
"Type": "Toggle", "Type": "Toggle",
"registry": [ "registry": [
{ {
@ -3531,7 +3549,7 @@
"Description": "If Enabled then Sticky Keys is activated - Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.", "Description": "If Enabled then Sticky Keys is activated - Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.",
"category": "Customize Preferences", "category": "Customize Preferences",
"panel": "2", "panel": "2",
"Order": "a109_", "Order": "a110_",
"Type": "Toggle", "Type": "Toggle",
"registry": [ "registry": [
{ {
@ -3740,5 +3758,60 @@
"Type": "Button", "Type": "Button",
"ButtonWidth": "300", "ButtonWidth": "300",
"link": "https://christitustech.github.io/winutil/dev/tweaks/Performance-Plans/RemoveUltPerf" "link": "https://christitustech.github.io/winutil/dev/tweaks/Performance-Plans/RemoveUltPerf"
} },
"WPFTweaksDisableExplorerAutoDiscovery": {
"Content": "Disable Explorer Automatic Folder Discovery",
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience.",
"category": "Essential Tweaks",
"panel": "1",
"Order": "a005_",
"InvokeScript": [
"
# Previously detected folders
$bags = \"HKCU:\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\Bags\"
# Folder types lookup table
$bagMRU = \"HKCU:\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\BagMRU\"
# Flush explorer view database
Remove-Item -Path $bags -Recurse -Force
Write-Host \"Removed $bags\"
Remove-Item -Path $bagMRU -Recurse -Force
Write-Host \"Removed $bagMRU\"
# Every folder
$allFolders = \"HKCU:\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\Bags\\AllFolders\\Shell\"
if (!(Test-Path $allFolders)) {
New-Item -Path $allFolders -Force
Write-Host \"Created $allFolders\"
}
# Generic view
New-ItemProperty -Path $allFolders -Name \"FolderType\" -Value \"NotSpecified\" -PropertyType String -Force
Write-Host \"Set FolderType to NotSpecified\"
Write-Host Please sign out and back in, or restart your computer to apply the changes!
"
],
"UndoScript": [
"
# Previously detected folders
$bags = \"HKCU:\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\Bags\"
# Folder types lookup table
$bagMRU = \"HKCU:\\Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\BagMRU\"
# Flush explorer view database
Remove-Item -Path $bags -Recurse -Force
Write-Host \"Removed $bags\"
Remove-Item -Path $bagMRU -Recurse -Force
Write-Host \"Removed $bagMRU\"
Write-Host Please sign out and back in, or restart your computer to apply the changes!
"
],
},
} }

View File

@ -5,28 +5,23 @@ function Initialize-InstallAppEntry {
Used to as part of the Install Tab UI generation Used to as part of the Install Tab UI generation
.PARAMETER TargetElement .PARAMETER TargetElement
The Element into which the Apps should be placed The Element into which the Apps should be placed
.PARAMETER AppKey .PARAMETER appKey
The Key of the app inside the $sync.configs.applicationsHashtable The Key of the app inside the $sync.configs.applicationsHashtable
#> #>
param( param(
[Windows.Controls.WrapPanel]$TargetElement, [Windows.Controls.WrapPanel]$TargetElement,
$AppKey $appKey
) )
$App = $sync.configs.applicationsHashtable.$AppKey
# Create the outer Border for the application type # Create the outer Border for the application type
$border = New-Object Windows.Controls.Border $border = New-Object Windows.Controls.Border
$border.BorderBrush = [Windows.Media.Brushes]::Gray $border.Style = $sync.Form.Resources.AppTileBorderStyle
$border.SetResourceReference([Windows.Controls.Control]::BorderThicknessProperty, "AppTileBorderThickness") $border.Tag = $appKey
$border.CornerRadius = 5 $border.ToolTip = $Apps.$appKey.description
$border.SetResourceReference([Windows.Controls.Control]::PaddingProperty, "AppTileMargins")
$border.SetResourceReference([Windows.Controls.Control]::WidthProperty, "AppTileWidth")
$border.VerticalAlignment = "Top"
$border.SetResourceReference([Windows.Controls.Control]::MarginProperty, "AppTileMargins")
$border.Cursor = [System.Windows.Input.Cursors]::Hand
$border.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, "AppInstallUnselectedColor")
$border.Tag = $Appkey
$border.ToolTip = $App.description
$border.Add_MouseUp({ $border.Add_MouseUp({
if ($_.ChangedButton -eq [System.Windows.Input.MouseButton]::Right) {
Invoke-WPFPresets -imported $true -checkboxfilterpattern "WPFInstall*";
}
$childCheckbox = ($this.Child.Children | Where-Object {$_.Template.TargetType -eq [System.Windows.Controls.Checkbox]})[0] $childCheckbox = ($this.Child.Children | Where-Object {$_.Template.TargetType -eq [System.Windows.Controls.Checkbox]})[0]
$childCheckBox.isChecked = -not $childCheckbox.IsChecked $childCheckBox.isChecked = -not $childCheckbox.IsChecked
}) })
@ -47,12 +42,8 @@ function Initialize-InstallAppEntry {
# Create the CheckBox, vertically centered # Create the CheckBox, vertically centered
$checkBox = New-Object Windows.Controls.CheckBox $checkBox = New-Object Windows.Controls.CheckBox
$checkBox.Name = $AppKey $checkBox.Name = $appKey
$checkBox.Background = "Transparent" $checkbox.Style = $sync.Form.Resources.AppTileCheckboxStyle
$checkBox.HorizontalAlignment = "Left"
$checkBox.VerticalAlignment = "Center"
$checkBox.SetResourceReference([Windows.Controls.Control]::MarginProperty, "AppTileMargins")
$checkBox.SetResourceReference([Windows.Controls.Control]::StyleProperty, "CollapsedCheckBoxStyle")
$checkbox.Add_Checked({ $checkbox.Add_Checked({
Invoke-WPFSelectedAppsUpdate -type "Add" -checkbox $this Invoke-WPFSelectedAppsUpdate -type "Add" -checkbox $this
$borderElement = $this.Parent.Parent $borderElement = $this.Parent.Parent
@ -64,7 +55,7 @@ function Initialize-InstallAppEntry {
$borderElement = $this.Parent.Parent $borderElement = $this.Parent.Parent
$borderElement.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, "AppInstallUnselectedColor") $borderElement.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, "AppInstallUnselectedColor")
}) })
$sync.$($checkBox.Name) = $checkBox
# Create a StackPanel for the image and name # Create a StackPanel for the image and name
$imageAndNamePanel = New-Object Windows.Controls.StackPanel $imageAndNamePanel = New-Object Windows.Controls.StackPanel
$imageAndNamePanel.Orientation = "Horizontal" $imageAndNamePanel.Orientation = "Horizontal"
@ -73,29 +64,15 @@ function Initialize-InstallAppEntry {
# Create the Image and set a placeholder # Create the Image and set a placeholder
$image = New-Object Windows.Controls.Image $image = New-Object Windows.Controls.Image
# $image.Name = "wpfapplogo" + $App.Name # $image.Name = "wpfapplogo" + $App.Name
$image.Width = 40 $image.Style = $sync.Form.Resources.AppTileImageStyle
$image.Height = 40
$image.Margin = New-Object Windows.Thickness(0, 0, 10, 0)
$image.Source = $noimage # Ensure $noimage is defined in your script $image.Source = $noimage # Ensure $noimage is defined in your script
# Clip the image corners
$image.Clip = New-Object Windows.Media.RectangleGeometry
$image.Clip.Rect = New-Object Windows.Rect(0, 0, $image.Width, $image.Height)
$image.Clip.RadiusX = 5
$image.Clip.RadiusY = 5
$image.SetResourceReference([Windows.Controls.Control]::VisibilityProperty, "AppTileCompactVisibility")
$imageAndNamePanel.Children.Add($image) | Out-Null $imageAndNamePanel.Children.Add($image) | Out-Null
# Create the TextBlock for the application name # Create the TextBlock for the application name
$appName = New-Object Windows.Controls.TextBlock $appName = New-Object Windows.Controls.TextBlock
$appName.Text = $App.Content $appName.Style = $sync.Form.Resources.AppTileNameStyle
$appName.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, "AppTileFontSize") $appName.Text = $Apps.$appKey.content
$appName.FontWeight = [Windows.FontWeights]::Bold
$appName.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, "MainForegroundColor")
$appName.VerticalAlignment = "Center"
$appName.SetResourceReference([Windows.Controls.Control]::MarginProperty, "AppTileMargins")
$appName.Background = "Transparent"
$imageAndNamePanel.Children.Add($appName) | Out-Null $imageAndNamePanel.Children.Add($appName) | Out-Null
# Add the image and name panel to the Checkbox # Add the image and name panel to the Checkbox
@ -107,91 +84,53 @@ function Initialize-InstallAppEntry {
# Create the StackPanel for the buttons and dock it to the right # Create the StackPanel for the buttons and dock it to the right
$buttonPanel = New-Object Windows.Controls.StackPanel $buttonPanel = New-Object Windows.Controls.StackPanel
$buttonPanel.Orientation = "Horizontal" $buttonPanel.Style = $sync.Form.Resources.AppTileButtonPanelStyle
$buttonPanel.HorizontalAlignment = "Right"
$buttonPanel.VerticalAlignment = "Center"
$buttonPanel.SetResourceReference([Windows.Controls.Control]::MarginProperty, "AppTileMargins")
$buttonPanel.SetResourceReference([Windows.Controls.Control]::VisibilityProperty, "AppTileCompactVisibility")
[Windows.Controls.DockPanel]::SetDock($buttonPanel, [Windows.Controls.Dock]::Right) [Windows.Controls.DockPanel]::SetDock($buttonPanel, [Windows.Controls.Dock]::Right)
# Create the "Install" button # Define the button properties
$installButton = New-Object Windows.Controls.Button $buttons = @(
$installButton.Width = 45 [PSCustomObject]@{ Name = "Install"; Description = "Install or Upgrade the application"; Tooltip = "Install or Upgrade the application"; Icon = [char]0xE118 },
$installButton.Height = 35 [PSCustomObject]@{ Name = "Uninstall"; Description = "Uninstall the application"; Tooltip = "Uninstall the application"; Icon = [char]0xE74D },
$installButton.Margin = New-Object Windows.Thickness(0, 0, 10, 0) [PSCustomObject]@{ Name = "Info"; Description = "Open the application's website in your default browser"; Tooltip = "Open the application's website in your default browser"; Icon = [char]0xE946 }
)
$installIcon = New-Object Windows.Controls.TextBlock # Iterate over each button and create it
$installIcon.Text = [char]0xE118 # Install Icon foreach ($button in $buttons) {
$installIcon.FontFamily = "Segoe MDL2 Assets" $newButton = New-Object Windows.Controls.Button
$installIcon.FontSize = 20 $newButton.Style = $sync.Form.Resources.AppTileButtonStyle
$installIcon.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, "MainForegroundColor") $newButton.Content = $button.Icon
$installIcon.Background = "Transparent" $newButton.ToolTip = $button.Tooltip
$installIcon.HorizontalAlignment = "Center" $buttonPanel.Children.Add($newButton) | Out-Null
$installIcon.VerticalAlignment = "Center"
$installButton.Content = $installIcon switch ($button.Name) {
$installButton.ToolTip = "Install or Upgrade the application" "Install" {
$buttonPanel.Children.Add($installButton) | Out-Null $newButton.Add_Click({
$appKey = $this.Parent.Parent.Parent.Tag
# Add Click event for the "Install" button $appObject = $sync.configs.applicationsHashtable.$appKey
$installButton.Add_Click({ Invoke-WPFInstall -PackagesToInstall $appObject
$appKey = $this.Parent.Parent.Parent.Tag })
$appObject = $sync.configs.applicationsHashtable.$appKey }
Invoke-WPFInstall -PackagesToInstall $appObject "Uninstall" {
}) $newButton.Add_Click({
$appKey = $this.Parent.Parent.Parent.Tag
# Create the "Uninstall" button $appObject = $sync.configs.applicationsHashtable.$appKey
$uninstallButton = New-Object Windows.Controls.Button Invoke-WPFUnInstall -PackagesToUninstall $appObject
$uninstallButton.Width = 45 })
$uninstallButton.Height = 35 }
"Info" {
$uninstallIcon = New-Object Windows.Controls.TextBlock $newButton.Add_Click({
$uninstallIcon.Text = [char]0xE74D # Uninstall Icon $appKey = $this.Parent.Parent.Parent.Tag
$uninstallIcon.FontFamily = "Segoe MDL2 Assets" $appObject = $sync.configs.applicationsHashtable.$appKey
$uninstallIcon.FontSize = 20 Start-Process $appObject.link
$uninstallIcon.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, "MainForegroundColor") })
$uninstallIcon.Background = "Transparent" }
$uninstallIcon.HorizontalAlignment = "Center" }
$uninstallIcon.VerticalAlignment = "Center" }
$uninstallButton.Content = $uninstallIcon
$buttonPanel.Children.Add($uninstallButton) | Out-Null
$uninstallButton.ToolTip = "Uninstall the application"
$uninstallButton.Add_Click({
$appKey = $this.Parent.Parent.Parent.Tag
$appObject = $sync.configs.applicationsHashtable.$appKey
Invoke-WPFUnInstall -PackagesToUninstall $appObject
})
# Create the "Info" button
$infoButton = New-Object Windows.Controls.Button
$infoButton.Width = 45
$infoButton.Height = 35
$infoButton.Margin = New-Object Windows.Thickness(10, 0, 0, 0)
$infoIcon = New-Object Windows.Controls.TextBlock
$infoIcon.Text = [char]0xE946 # Info Icon
$infoIcon.FontFamily = "Segoe MDL2 Assets"
$infoIcon.FontSize = 20
$infoIcon.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, "MainForegroundColor")
$infoIcon.Background = "Transparent"
$infoIcon.HorizontalAlignment = "Center"
$infoIcon.VerticalAlignment = "Center"
$infoButton.Content = $infoIcon
$infoButton.ToolTip = "Open the application's website in your default browser"
$buttonPanel.Children.Add($infoButton) | Out-Null
$infoButton.Add_Click({
$appKey = $this.Parent.Parent.Parent.Tag
$appObject = $sync.configs.applicationsHashtable.$appKey
Start-Process $appObject.link
})
# Add the button panel to the DockPanel # Add the button panel to the DockPanel
$dockPanel.Children.Add($buttonPanel) | Out-Null $dockPanel.Children.Add($buttonPanel) | Out-Null
# Add the border to the corresponding Category # Add the border to the corresponding Category
$TargetElement.Children.Add($border) | Out-Null $TargetElement.Children.Add($border) | Out-Null
return $checkbox
} }

View File

@ -42,7 +42,7 @@ function Initialize-InstallCategoryAppList {
$loadingLabel.Content = "Loading, please wait..." $loadingLabel.Content = "Loading, please wait..."
$loadingLabel.HorizontalAlignment = "Center" $loadingLabel.HorizontalAlignment = "Center"
$loadingLabel.VerticalAlignment = "Center" $loadingLabel.VerticalAlignment = "Center"
$loadingLabel.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, "FontSizeHeading") $loadingLabel.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, "HeaderFontSize")
$loadingLabel.FontWeight = [Windows.FontWeights]::Bold $loadingLabel.FontWeight = [Windows.FontWeights]::Bold
$loadingLabel.Foreground = [Windows.Media.Brushes]::Gray $loadingLabel.Foreground = [Windows.Media.Brushes]::Gray
$sync.LoadingLabel = $loadingLabel $sync.LoadingLabel = $loadingLabel
@ -53,8 +53,17 @@ function Initialize-InstallCategoryAppList {
$TargetElement.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{ $TargetElement.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{
$TargetElement.Items.Clear() # Remove the loading message $TargetElement.Items.Clear() # Remove the loading message
$categories = $Apps.Values | Select-Object -ExpandProperty category -Unique | Sort-Object
foreach ($category in $categories) { # Pre-group apps by category
$appsByCategory = @{}
foreach ($appKey in $Apps.Keys) {
$category = $Apps.$appKey.Category
if (-not $appsByCategory.ContainsKey($category)) {
$appsByCategory[$category] = @()
}
$appsByCategory[$category] += $appKey
}
foreach ($category in $($appsByCategory.Keys | Sort-Object)) {
Add-Category -Category $category -TargetElement $TargetElement Add-Category -Category $category -TargetElement $TargetElement
$wrapPanel = New-Object Windows.Controls.WrapPanel $wrapPanel = New-Object Windows.Controls.WrapPanel
$wrapPanel.Orientation = "Horizontal" $wrapPanel.Orientation = "Horizontal"
@ -64,9 +73,9 @@ function Initialize-InstallCategoryAppList {
$wrapPanel.Visibility = [Windows.Visibility]::Collapsed $wrapPanel.Visibility = [Windows.Visibility]::Collapsed
$wrapPanel.Tag = "CategoryWrapPanel_$category" $wrapPanel.Tag = "CategoryWrapPanel_$category"
$null = $TargetElement.Items.Add($wrapPanel) $null = $TargetElement.Items.Add($wrapPanel)
$Apps.Keys | Where-Object { $Apps.$_.Category -eq $category } | Sort-Object | ForEach-Object { $appsByCategory[$category] | ForEach-Object {
Initialize-InstallAppEntry -TargetElement $wrapPanel -AppKey $_ $sync.$_ = $(Initialize-InstallAppEntry -TargetElement $wrapPanel -AppKey $_)
}
} }
}) }
})
} }

View File

@ -29,7 +29,8 @@ function Initialize-InstallHeader {
$buttonConfigs = @( $buttonConfigs = @(
@{Name="WPFInstall"; Content="Install/Upgrade Selected"}, @{Name="WPFInstall"; Content="Install/Upgrade Selected"},
@{Name="WPFInstallUpgrade"; Content="Upgrade All"}, @{Name="WPFInstallUpgrade"; Content="Upgrade All"},
@{Name="WPFUninstall"; Content="Uninstall Selected"} @{Name="WPFUninstall"; Content="Uninstall Selected"},
@{Name="WPFselectedAppsButton"; Content="Selected Apps: 0"}
) )
foreach ($config in $buttonConfigs) { foreach ($config in $buttonConfigs) {
@ -38,18 +39,9 @@ function Initialize-InstallHeader {
$sync[$config.Name] = $button $sync[$config.Name] = $button
} }
$selectedAppsButton = New-Object Windows.Controls.Button
$selectedAppsButton.Name = "WPFselectedAppsButton"
$selectedAppsButton.Content = "Selected Apps: 0"
$selectedAppsButton.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, "FontSizeHeading")
$selectedAppsButton.SetResourceReference([Windows.Controls.Control]::MarginProperty, "TabContentMargin")
$selectedAppsButton.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, "MainForegroundColor")
$selectedAppsButton.HorizontalAlignment = "Center"
$selectedAppsButton.VerticalAlignment = "Center"
$selectedAppsPopup = New-Object Windows.Controls.Primitives.Popup $selectedAppsPopup = New-Object Windows.Controls.Primitives.Popup
$selectedAppsPopup.IsOpen = $false $selectedAppsPopup.IsOpen = $false
$selectedAppsPopup.PlacementTarget = $selectedAppsButton $selectedAppsPopup.PlacementTarget = $sync.WPFselectedAppsButton
$selectedAppsPopup.Placement = [System.Windows.Controls.Primitives.PlacementMode]::Bottom $selectedAppsPopup.Placement = [System.Windows.Controls.Primitives.PlacementMode]::Bottom
$selectedAppsPopup.AllowsTransparency = $true $selectedAppsPopup.AllowsTransparency = $true
@ -66,24 +58,21 @@ function Initialize-InstallHeader {
$selectedAppsBorder.Child = $sync.selectedAppsstackPanel $selectedAppsBorder.Child = $sync.selectedAppsstackPanel
# Toggle selectedAppsPopup open/close with button # Toggle selectedAppsPopup open/close with button
$selectedAppsButton.Add_Click({ $sync.WPFselectedAppsButton.Add_Click({
$sync.selectedAppsPopup.IsOpen = -not $sync.selectedAppsPopup.IsOpen $sync.selectedAppsPopup.IsOpen = -not $sync.selectedAppsPopup.IsOpen
}) })
# Close selectedAppsPopup when mouse leaves both button and selectedAppsPopup # Close selectedAppsPopup when mouse leaves both button and selectedAppsPopup
$selectedAppsButton.Add_MouseLeave({ $sync.WPFselectedAppsButton.Add_MouseLeave({
if (-not $sync.selectedAppsPopup.IsMouseOver) { if (-not $sync.selectedAppsPopup.IsMouseOver) {
$sync.selectedAppsPopup.IsOpen = $false $sync.selectedAppsPopup.IsOpen = $false
} }
}) })
$selectedAppsPopup.Add_MouseLeave({ $selectedAppsPopup.Add_MouseLeave({
if (-not $selectedAppsButton.IsMouseOver) { if (-not $sync.WPFselectedAppsButton.IsMouseOver) {
$sync.selectedAppsPopup.IsOpen = $false $sync.selectedAppsPopup.IsOpen = $false
} }
}) })
$null = $wrapPanelTop.Children.Add($selectedAppsButton)
$sync.$($selectedAppsButton.Name) = $selectedAppsButton
[Windows.Controls.DockPanel]::SetDock($wrapPanelTop, [Windows.Controls.Dock]::Top) [Windows.Controls.DockPanel]::SetDock($wrapPanelTop, [Windows.Controls.Dock]::Top)
$null = $TargetElement.Children.Add($wrapPanelTop) $null = $TargetElement.Children.Add($wrapPanelTop)
} }

View File

@ -48,103 +48,29 @@ function Install-WinUtilWinget {
Write-Information "WinGet not found or update failed. Attempting to install from Microsoft Store..." Write-Information "WinGet not found or update failed. Attempting to install from Microsoft Store..."
} }
try { try {
# Try to close any running WinGet processes Write-Host "Attempting to repair WinGet using Repair-WinGetPackageManager..." -ForegroundColor Yellow
Get-Process -Name "DesktopAppInstaller", "winget" -ErrorAction SilentlyContinue | ForEach-Object {
Write-Information "Stopping running WinGet process..."
$_.Kill()
Start-Sleep -Seconds 2
}
# Try to load Windows Runtime assemblies more reliably # Check if Windows version supports Repair-WinGetPackageManager (24H2 and above)
$null = [System.Runtime.WindowsRuntime.WindowsRuntimeSystemExtensions] if ([System.Environment]::OSVersion.Version.Build -ge 26100) {
Add-Type -AssemblyName System.Runtime.WindowsRuntime Repair-WinGetPackageManager -Force -Latest -Verbose
# Verify if repair was successful
# Load required assemblies from Windows SDK $wingetCmd = Get-Command winget -ErrorAction Stop
$null = @( Write-Host "WinGet repair successful!" -ForegroundColor Green
[Windows.Management.Deployment.PackageManager, Windows.Management.Deployment, ContentType = WindowsRuntime]
[Windows.Foundation.Uri, Windows.Foundation, ContentType = WindowsRuntime]
[Windows.Management.Deployment.DeploymentOptions, Windows.Management.Deployment, ContentType = WindowsRuntime]
)
# Initialize PackageManager
$packageManager = New-Object Windows.Management.Deployment.PackageManager
# Rest of the Microsoft Store installation logic
$appxPackage = "https://aka.ms/getwinget"
$uri = New-Object Windows.Foundation.Uri($appxPackage)
$deploymentOperation = $packageManager.AddPackageAsync($uri, $null, "Add")
# Add timeout check for deployment operation
$timeout = 300
$timer = [System.Diagnostics.Stopwatch]::StartNew()
while ($deploymentOperation.Status -eq 0) {
if ($timer.Elapsed.TotalSeconds -gt $timeout) {
throw "Installation timed out after $timeout seconds"
}
Start-Sleep -Milliseconds 100
}
if ($deploymentOperation.Status -eq 1) {
Write-Information "Successfully installed WinGet from Microsoft Store"
Write-Output "Refreshing Environment Variables...`n"
$ENV:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
return
} else { } else {
throw "Installation failed with status: $($deploymentOperation.Status)" Write-Host "Repair-WinGetPackageManager is only available on Windows 24H2 and above. Your version doesn't support this method." -ForegroundColor Yellow
throw "Windows version not supported for repair method"
} }
} catch {
Write-Information "Microsoft Store installation failed. Attempting to install from Nuget..."
}
try {
## Nuget Method
Write-Host "Enabling NuGet and Module..."
# Enable TLS 1.2 for the PowerShell session
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Try to register the NuGet package source if not present
if (-not (Get-PackageSource -Name "NuGet" -ErrorAction SilentlyContinue)) {
Register-PackageSource -Name "NuGet" -Location "https://www.nuget.org/api/v2" -ProviderName NuGet -Force
}
# Install NuGet provider with error handling
try {
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Confirm:$false -ErrorAction Stop
} catch {
Write-Warning "Failed to install NuGet provider through standard method. Trying alternative approach..."
Install-PackageProvider -Name NuGet -Source "https://www.powershellgallery.com/api/v2" -Force -Confirm:$false
}
Install-Module -Name Microsoft.WinGet.Client -Confirm:$false -Force
# Check if WinGet was installed successfully through NuGet
$wingetCmd = Get-Command winget -ErrorAction Stop
Write-Information "Successfully installed WinGet through NuGet"
Write-Output "Refreshing Environment Variables...`n" Write-Output "Refreshing Environment Variables...`n"
$ENV:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") $ENV:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
return return
} catch { } catch {
Write-Warning "NuGet installation failed. Attempting to install from GitHub..." Write-Error "All installation methods failed. Unable to install WinGet."
throw
} }
# GitHub fallback installation method
$releases_url = "https://api.github.com/repos/microsoft/winget-cli/releases/latest"
$asset = (Invoke-RestMethod -Uri $releases_url).assets |
Where-Object { $_.name -match "\.msixbundle$" } |
Select-Object -First 1
$download_url = $asset.browser_download_url
$output_path = Join-Path $env:TEMP $asset.name
Invoke-WebRequest -Uri $download_url -OutFile $output_path
Add-AppxPackage -Path $output_path -ErrorAction Stop
# Verify installation
$wingetCmd = Get-Command winget -ErrorAction Stop
Write-Information "Successfully installed WinGet through GitHub"
Write-Output "Refreshing Environment Variables...`n"
$ENV:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
return
} catch { } catch {
Write-Error "All installation methods failed. Unable to install WinGet." Write-Error "An error occurred during WinGet installation: $_"
throw throw
} }
} }

View File

@ -23,14 +23,22 @@ function Test-WinUtilPackageManager {
# Check if Winget is available while getting it's Version if it's available # Check if Winget is available while getting it's Version if it's available
$wingetExists = $true $wingetExists = $true
try { try {
$wingetVersionFull = winget --version $wingetInfo = winget --info
# Extract the package version from the output
$wingetVersionFull = ($wingetInfo | Select-String -Pattern 'Microsoft\.DesktopAppInstaller v\d+\.\d+\.\d+\.\d+').Matches.Value
if ($wingetVersionFull) {
$wingetVersionFull = $wingetVersionFull.Split(' ')[-1].TrimStart('v')
} else {
# Fallback in case the pattern isn't found
$wingetVersionFull = ($wingetInfo | Select-String -Pattern 'Package Manager v\d+\.\d+\.\d+').Matches.Value.Split(' ')[-1]
}
} catch [System.Management.Automation.CommandNotFoundException], [System.Management.Automation.ApplicationFailedException] { } catch [System.Management.Automation.CommandNotFoundException], [System.Management.Automation.ApplicationFailedException] {
Write-Warning "Winget was not found due to un-availablity reasons" Write-Warning "Winget was not found due to un-availablity reasons"
$wingetExists = $false $wingetExists = $false
} catch { } catch {
Write-Warning "Winget was not found due to un-known reasons, The Stack Trace is:`n$($psitem.Exception.StackTrace)" Write-Warning "Winget was not found due to un-known reasons, The Stack Trace is:`n$($psitem.Exception.StackTrace)"
$wingetExists = $false $wingetExists = $false
} }
# If Winget is available, Parse it's Version and give proper information to Terminal Output. # If Winget is available, Parse it's Version and give proper information to Terminal Output.
# If it isn't available, the return of this funtion will be "not-installed", indicating that # If it isn't available, the return of this funtion will be "not-installed", indicating that
@ -48,13 +56,14 @@ function Test-WinUtilPackageManager {
# Check if Winget's Version is too old. # Check if Winget's Version is too old.
$wingetCurrentVersion = [System.Version]::Parse($wingetVersion.Trim('v')) $wingetCurrentVersion = [System.Version]::Parse($wingetVersion.Trim('v'))
# Grabs the latest release of Winget from the Github API for version check process. # Grabs the latest release of Winget from the Github API for version check process.
$response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop $response = winget search -e Microsoft.AppInstaller --accept-source-agreements
$wingetLatestVersion = [System.Version]::Parse(($response.tag_name).Trim('v')) #Stores version number of latest release. $wingetLatestVersion = ($response | Select-String -Pattern '\d+\.\d+\.\d+\.\d+').Matches.Value
$wingetOutdated = $wingetCurrentVersion -lt $wingetLatestVersion Write-Host "Latest Search Version: $wingetLatestVersion" -ForegroundColor White
Write-Host "Current Installed Version: $wingetCurrentVersion" -ForegroundColor White
$wingetOutdated = $wingetCurrentVersion -lt [System.Version]::Parse($wingetLatestVersion)
Write-Host "===========================================" -ForegroundColor Green Write-Host "===========================================" -ForegroundColor Green
Write-Host "--- Winget is installed ---" -ForegroundColor Green Write-Host "--- Winget is installed ---" -ForegroundColor Green
Write-Host "===========================================" -ForegroundColor Green Write-Host "===========================================" -ForegroundColor Green
Write-Host "Version: $wingetVersionFull" -ForegroundColor White
if (!$wingetPreview) { if (!$wingetPreview) {
Write-Host " - Winget is a release version." -ForegroundColor Green Write-Host " - Winget is a release version." -ForegroundColor Green

View File

@ -44,6 +44,7 @@ function Invoke-WPFButton {
"WPFPanelprinter" {Invoke-WPFControlPanel -Panel $button} "WPFPanelprinter" {Invoke-WPFControlPanel -Panel $button}
"WPFPanelsystem" {Invoke-WPFControlPanel -Panel $button} "WPFPanelsystem" {Invoke-WPFControlPanel -Panel $button}
"WPFPaneluser" {Invoke-WPFControlPanel -Panel $button} "WPFPaneluser" {Invoke-WPFControlPanel -Panel $button}
"WPFPanelGodMode" {Invoke-WPFControlPanel -Panel $button}
"WPFUpdatesdefault" {Invoke-WPFFixesUpdate} "WPFUpdatesdefault" {Invoke-WPFFixesUpdate}
"WPFFixesUpdate" {Invoke-WPFFixesUpdate} "WPFFixesUpdate" {Invoke-WPFFixesUpdate}
"WPFFixesWinget" {Invoke-WPFFixesWinget} "WPFFixesWinget" {Invoke-WPFFixesWinget}

View File

@ -19,5 +19,6 @@ function Invoke-WPFControlPanel {
"WPFPanelprinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"} "WPFPanelprinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
"WPFPanelsystem" {cmd /c sysdm.cpl} "WPFPanelsystem" {cmd /c sysdm.cpl}
"WPFPaneluser" {cmd /c "control userpasswords2"} "WPFPaneluser" {cmd /c "control userpasswords2"}
"WPFPanelGodMode" {Start-Process "shell:::{ED7BA470-8E54-465E-825C-99712043E01C}"}
} }
} }

View File

@ -144,7 +144,7 @@ function Invoke-WPFUIElements {
$label = New-Object Windows.Controls.Label $label = New-Object Windows.Controls.Label
$label.Content = $category -replace ".*__", "" $label.Content = $category -replace ".*__", ""
$label.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, "FontSizeHeading") $label.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, "HeaderFontSize")
$label.SetResourceReference([Windows.Controls.Control]::FontFamilyProperty, "HeaderFontFamily") $label.SetResourceReference([Windows.Controls.Control]::FontFamilyProperty, "HeaderFontFamily")
$itemsControl.Items.Add($label) | Out-Null $itemsControl.Items.Add($label) | Out-Null
$sync[$category] = $label $sync[$category] = $label

View File

@ -3,7 +3,6 @@
{% block header %} {% block header %}
{{ super() }} {{ super() }}
<div style="color: red; text-align: center; padding: 10px; font-size: 20px;"> <div style="color: red; text-align: center; padding: 10px; font-size: 20px;">
<strong>Announcement:</strong> We are currently not adding any applications to WinUtil and any apps that will be added through a PR will be declined by the maintainer.
<strong>Announcement:</strong> We are currently reworking the docs to use Hugo rather then mkdocs. <strong>Announcement:</strong> We are currently reworking the docs to use Hugo rather then mkdocs.
</div> </div>
{% endblock %} {% endblock %}

View File

@ -46,7 +46,6 @@ class GenericException : Exception {
GenericException($Message) : base($Message) {} GenericException($Message) : base($Message) {}
} }
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window' $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework') [void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
@ -119,6 +118,7 @@ $sync.configs.applications.PSObject.Properties | ForEach-Object {
# Now call the function with the final merged config # Now call the function with the final merged config
Invoke-WPFUIElements -configVariable $sync.configs.appnavigation -targetGridName "appscategory" -columncount 1 Invoke-WPFUIElements -configVariable $sync.configs.appnavigation -targetGridName "appscategory" -columncount 1
# Add logic to handle click to the ToggleView Button on the Install Tab # Add logic to handle click to the ToggleView Button on the Install Tab
$sync.WPFToggleView.Add_Click({ $sync.WPFToggleView.Add_Click({
$sync.CompactView = -not $sync.CompactView $sync.CompactView = -not $sync.CompactView
@ -130,7 +130,9 @@ $sync.WPFToggleView.Add_Click({
Invoke-WPFUIApps -Apps $sync.configs.applicationsHashtable -targetGridName "appspanel" Invoke-WPFUIApps -Apps $sync.configs.applicationsHashtable -targetGridName "appspanel"
Invoke-WPFUIElements -configVariable $sync.configs.tweaks -targetGridName "tweakspanel" -columncount 2 Invoke-WPFUIElements -configVariable $sync.configs.tweaks -targetGridName "tweakspanel" -columncount 2
Invoke-WPFUIElements -configVariable $sync.configs.feature -targetGridName "featurespanel" -columncount 2 Invoke-WPFUIElements -configVariable $sync.configs.feature -targetGridName "featurespanel" -columncount 2
# Future implementation: Add Windows Version to updates panel # Future implementation: Add Windows Version to updates panel
#Invoke-WPFUIElements -configVariable $sync.configs.updates -targetGridName "updatespanel" -columncount 1 #Invoke-WPFUIElements -configVariable $sync.configs.updates -targetGridName "updatespanel" -columncount 1
@ -303,8 +305,8 @@ $sync["Form"].Add_MouseLeftButtonDown({
}) })
$sync["Form"].Add_MouseDoubleClick({ $sync["Form"].Add_MouseDoubleClick({
if ($_.OriginalSource -is [System.Windows.Controls.Grid] -or if ($_.OriginalSource.Name -eq "NavDockPanel" -or
$_.OriginalSource -is [System.Windows.Controls.StackPanel]) { $_.OriginalSource.Name -eq "GridBesideNavDockPanel") {
if ($sync["Form"].WindowState -eq [Windows.WindowState]::Normal) { if ($sync["Form"].WindowState -eq [Windows.WindowState]::Normal) {
$sync["Form"].WindowState = [Windows.WindowState]::Maximized $sync["Form"].WindowState = [Windows.WindowState]::Maximized
} }
@ -579,7 +581,5 @@ $sync["SponsorMenuItem"].Add_Click({
Show-CustomDialog -Title "Sponsors" -Message $authorInfo -EnableScroll $true Show-CustomDialog -Title "Sponsors" -Message $authorInfo -EnableScroll $true
}) })
$sync["Form"].ShowDialog() | out-null $sync["Form"].ShowDialog() | out-null
Stop-Transcript Stop-Transcript

View File

@ -54,21 +54,27 @@ if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]:
$PSBoundParameters.GetEnumerator() | ForEach-Object { $PSBoundParameters.GetEnumerator() | ForEach-Object {
$argList += if ($_.Value -is [switch] -and $_.Value) { $argList += if ($_.Value -is [switch] -and $_.Value) {
"-$($_.Key)" "-$($_.Key)"
} elseif ($_.Value -is [array]) {
"-$($_.Key) $($_.Value -join ',')"
} elseif ($_.Value) { } elseif ($_.Value) {
"-$($_.Key) `"$($_.Value)`"" "-$($_.Key) '$($_.Value)'"
} }
} }
$script = if ($MyInvocation.MyCommand.Path) { $script = if ($PSCommandPath) {
"& { & '$($MyInvocation.MyCommand.Path)' $argList }" "& { & `'$($PSCommandPath)`' $($argList -join ' ') }"
} else { } else {
"iex '& { $(irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1) } $argList'" "&([ScriptBlock]::Create((irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1))) $($argList -join ' ')"
} }
$powershellcmd = if (Get-Command pwsh -ErrorAction SilentlyContinue) { "pwsh" } else { "powershell" } $powershellCmd = if (Get-Command pwsh -ErrorAction SilentlyContinue) { "pwsh" } else { "powershell" }
$processCmd = if (Get-Command wt.exe -ErrorAction SilentlyContinue) { "wt.exe" } else { $powershellcmd } $processCmd = if (Get-Command wt.exe -ErrorAction SilentlyContinue) { "wt.exe" } else { "$powershellCmd" }
Start-Process $processCmd -ArgumentList "$powershellcmd -ExecutionPolicy Bypass -NoProfile -Command $script" -Verb RunAs if ($processCmd -eq "wt.exe") {
Start-Process $processCmd -ArgumentList "$powershellCmd -ExecutionPolicy Bypass -NoProfile -Command `"$script`"" -Verb RunAs
} else {
Start-Process $processCmd -ArgumentList "-ExecutionPolicy Bypass -NoProfile -Command `"$script`"" -Verb RunAs
}
break break
} }

View File

@ -67,6 +67,82 @@
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<Style x:Key="AppTileBorderStyle" TargetType="Border">
<Setter Property="BorderBrush" Value="Gray"/>
<Setter Property="BorderThickness" Value="{DynamicResource AppTileBorderThickness}"/>
<Setter Property="CornerRadius" Value="5"/>
<Setter Property="Padding" Value="{DynamicResource AppTileMargins}"/>
<Setter Property="Width" Value="{DynamicResource AppTileWidth}"/>
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="Margin" Value="{DynamicResource AppTileMargins}"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Background" Value="{DynamicResource AppInstallUnselectedColor}"/>
</Style>
<Style x:Key="AppTileCheckboxStyle" TargetType="CheckBox">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="{DynamicResource AppTileMargins}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox">
<ContentPresenter Content="{TemplateBinding Content}"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="AppTileImageStyle" TargetType="Image">
<Setter Property="Width" Value="{DynamicResource AppTileImageSize}"/>
<Setter Property="Height" Value="{DynamicResource AppTileImageSize}"/>
<Setter Property="Margin">
<Setter.Value>
<Thickness Left="0" Top="0" Right="10" Bottom="0"/>
</Setter.Value>
</Setter>
<Setter Property="Clip">
<Setter.Value>
<RectangleGeometry Rect="0,0,40,40" RadiusX="5" RadiusY="5"/>
</Setter.Value>
</Setter>
<Setter Property="Visibility" Value="{DynamicResource AppTileCompactVisibility}"/>
</Style>
<Style x:Key="AppTileNameStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="{DynamicResource AppTileFontSize}"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="{DynamicResource MainForegroundColor}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="{DynamicResource AppTileMargins}"/>
<Setter Property="Background" Value="Transparent"/>
</Style>
<Style x:Key="AppTileButtonPanelStyle" TargetType="StackPanel">
<Setter Property="Orientation" Value="Horizontal"/>
<Setter Property="HorizontalAlignment" Value="Right"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="{DynamicResource AppTileMargins}"/>
<Setter Property="Visibility" Value="{DynamicResource AppTileCompactVisibility}"/>
</Style>
<Style x:Key="AppTileButtonStyle" TargetType="Button">
<Setter Property="Width" Value="45"/>
<Setter Property="Height" Value="35"/>
<Setter Property="Margin" Value="0,0,10,0"/>
<Setter Property="Foreground" Value="{DynamicResource ButtonForegroundColor}"/>
<Setter Property="Background" Value="{DynamicResource ButtonBackgroundColor}"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}" FontFamily="Segoe MDL2 Assets" FontSize="20"
Foreground="{DynamicResource MainForegroundColor}"
Background="Transparent" HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Button" x:Key="HoverButtonStyle"> <Style TargetType="Button" x:Key="HoverButtonStyle">
<Setter Property="Foreground" Value="{DynamicResource MainForegroundColor}" /> <Setter Property="Foreground" Value="{DynamicResource MainForegroundColor}" />
@ -202,7 +278,7 @@
<Setter Property="Foreground" Value="{DynamicResource LabelboxForegroundColor}"/> <Setter Property="Foreground" Value="{DynamicResource LabelboxForegroundColor}"/>
<Setter Property="Background" Value="{DynamicResource MainBackgroundColor}"/> <Setter Property="Background" Value="{DynamicResource MainBackgroundColor}"/>
<Setter Property="FontFamily" Value="{DynamicResource HeaderFontFamily}"/> <Setter Property="FontFamily" Value="{DynamicResource HeaderFontFamily}"/>
<Setter Property="FontSize" Value="{DynamicResource FontSizeHeading}"/> <Setter Property="FontSize" Value="{DynamicResource HeaderFontSize}"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/> <Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/> <Setter Property="HorizontalContentAlignment" Value="Left"/>
@ -502,19 +578,6 @@
</Setter.Value> </Setter.Value>
</Setter> </Setter>
</Style> </Style>
<!-- Collapsed Checkbox Style -->
<Style x:Key="CollapsedCheckBoxStyle" TargetType="CheckBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox">
<ContentPresenter Content="{TemplateBinding Content}"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="RadioButton"> <Style TargetType="RadioButton">
<Setter Property="Foreground" Value="{DynamicResource MainForegroundColor}"/> <Setter Property="Foreground" Value="{DynamicResource MainForegroundColor}"/>
<Setter Property="Background" Value="{DynamicResource MainBackgroundColor}"/> <Setter Property="Background" Value="{DynamicResource MainBackgroundColor}"/>
@ -851,7 +914,7 @@
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<DockPanel HorizontalAlignment="Stretch" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="0" Width="Auto"> <DockPanel Name="NavDockPanel" HorizontalAlignment="Stretch" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="0" Width="Auto">
<StackPanel Name="NavLogoPanel" Orientation="Horizontal" HorizontalAlignment="Left" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Margin="10,0,20,0"> <StackPanel Name="NavLogoPanel" Orientation="Horizontal" HorizontalAlignment="Left" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Margin="10,0,20,0">
</StackPanel> </StackPanel>
<ToggleButton Margin="0,0,5,0" HorizontalAlignment="Left" Height="{DynamicResource TabButtonHeight}" Width="{DynamicResource TabButtonWidth}" <ToggleButton Margin="0,0,5,0" HorizontalAlignment="Left" Height="{DynamicResource TabButtonHeight}" Width="{DynamicResource TabButtonWidth}"
@ -894,7 +957,7 @@
</TextBlock> </TextBlock>
</ToggleButton.Content> </ToggleButton.Content>
</ToggleButton> </ToggleButton>
<Grid Background="{DynamicResource MainBackgroundColor}" ShowGridLines="False" Width="Auto" Height="Auto" HorizontalAlignment="Stretch"> <Grid Name="GridBesideNavDockPanel" Background="{DynamicResource MainBackgroundColor}" ShowGridLines="False" Width="Auto" Height="Auto" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <!-- Main content area --> <ColumnDefinition Width="*"/> <!-- Main content area -->
<ColumnDefinition Width="Auto"/><!-- Space for options button --> <ColumnDefinition Width="Auto"/><!-- Space for options button -->