From 322d527a0c015b7da27dad8f540b71ee265509e0 Mon Sep 17 00:00:00 2001 From: "Mr.k" Date: Wed, 28 Aug 2024 19:08:39 +0300 Subject: [PATCH] [02] Refactoring code (Reopening of PR #2469, plus some modifications to make PR #2629 merge easily without any problem) (#2630) * Remove leftover comment & update another comment in 'Get-TabXaml' Private Function * Add new 'CloseIconFontSize' Theme Option This's done to fix the Visual Issue of the Close Button being smaller than the Settings Button. * Rename 'CheckBoxBulletDecoratorFontSize' to 'CheckBoxBulletDecoratorSize' * Experiment with DPI Aware Units * Remove extra whitespace characters in 'theme.json' * Implement Default Theming - Add Error Checking & Quitting Early upon XML Related Failures - Simple Code Formatting here & there * Replace Tabs with Spaces to follow the conventions * Fix some logic issue in 'Set-WinUtilUITheme.ps1' Private Function - Rename 'Set-WinUtilUiTheme.ps1' -> 'Set-WinUtilUITheme.ps1' * Change output info from 'Write-Warning' to 'Write-Host' to make sure it's displayed even in RunSpaces as well as PowerShell 5 Environments * Revert back to default Unit of Measuring for WPF (1/96 in) * Revert "Remove leftover comment & update another comment in 'Get-TabXaml' Private Function" This reverts commit 368e5980df9810a180b8df2f657345c210ffbfe6. * Update 'themes.json' so the general changes will work with PR #2629 * Support the fallback to default theme (if it exists) * Update 'Set-WinUtilUITheme' Documentation --------- Co-authored-by: MyDrift --- config/themes.json | 351 ++++++++++------------- functions/private/Set-WinUtilUITheme.ps1 | 83 ++++++ functions/private/Set-WinUtilUiTheme.ps1 | 50 ---- scripts/main.ps1 | 25 +- xaml/inputXML.xaml | 8 +- 5 files changed, 261 insertions(+), 256 deletions(-) create mode 100644 functions/private/Set-WinUtilUITheme.ps1 delete mode 100644 functions/private/Set-WinUtilUiTheme.ps1 diff --git a/config/themes.json b/config/themes.json index 2c11a09d..90615e8f 100644 --- a/config/themes.json +++ b/config/themes.json @@ -1,220 +1,169 @@ { - "Classic": { - "CustomDialogFontSize": "12", - "CustomDialogFontSizeHeader": "14", - "CustomDialogIconSize": "25", - "CustomDialogWidth": "400", - "CustomDialogHeight": "200", + "_default": { + "CustomDialogFontSize": "12", + "CustomDialogFontSizeHeader": "14", + "CustomDialogIconSize": "25", + "CustomDialogWidth": "400", + "CustomDialogHeight": "200", - "FontSize": "12", - "FontFamily": "Arial", - "FontSizeHeading": "14", - "HeaderFontFamily": "Consolas, Monaco", + "FontSize": "14", + "FontFamily": "Arial", + "FontSizeHeading": "16", + "HeaderFontFamily": "Consolas, Monaco", - "CheckBoxBulletDecoratorFontSize": "14", - "CheckBoxMargin": "15,0,0,2", + "CheckBoxBulletDecoratorSize": "14", + "CheckBoxMargin": "15,0,0,2", - "TabButtonFontSize": "14", - "TabButtonWidth": "100", - "TabButtonHeight": "25", - "TabRowHeightInPixels": "50", - "IconFontSize": "14", - "IconButtonSize": "35", - "WinUtilIconSize": "Auto", - "SettingsIconFontSize": "18", + "TabContentMargin": "5", + "TabButtonFontSize": "14", + "TabButtonWidth": "100", + "TabButtonHeight": "25", + "TabRowHeightInPixels": "50", + "IconFontSize": "14", + "IconButtonSize": "35", + "WinUtilIconSize": "Auto", + "SettingsIconFontSize": "18", + "CloseIconFontSize": "18", - "MicroWinLogoSize": "10", + "MicroWinLogoSize": "10", - "ProgressBarForegroundColor": "#FFAC1C", - "ProgressBarBackgroundColor": "Transparent", - "ProgressBarTextColor": "#000000", + "ProgressBarForegroundColor": "#FFAC1C", + "ProgressBarBackgroundColor": "Transparent", + "ProgressBarTextColor": "#000000", - "ComboBoxBackgroundColor": "#FFFFFF", - "LabelboxForegroundColor": "#000000", - "MainForegroundColor": "#000000", - "MainBackgroundColor": "#FFFFFF", - "LabelBackgroundColor": "#FAFAFA", - "LinkForegroundColor": "#000000", - "LinkHoverForegroundColor": "#000000", - "GroupBorderBackgroundColor": "#000000", - "ComboBoxForegroundColor": "#000000", + "ComboBoxBackgroundColor": "#FFFFFF", + "LabelboxForegroundColor": "#000000", + "MainForegroundColor": "#000000", + "MainBackgroundColor": "#FFFFFF", + "LabelBackgroundColor": "#FAFAFA", + "LinkForegroundColor": "#000000", + "LinkHoverForegroundColor": "#000000", + "GroupBorderBackgroundColor": "#000000", + "ComboBoxForegroundColor": "#000000", - "ButtonFontSize": "12", - "ButtonFontFamily": "Arial", - "ButtonWidth": "200", - "ButtonHeight": "25", - "ConfigTabButtonFontSize": "16", + "ButtonFontSize": "12", + "ButtonFontFamily": "Arial", + "ButtonWidth": "200", + "ButtonHeight": "25", + "ConfigTabButtonFontSize": "16", - "SearchBarWidth": "200", - "SearchBarHeight": "25", - "SearchBarTextBoxFontSize": "16", - "SearchBarClearButtonFontSize": "14", + "SearchBarWidth": "200", + "SearchBarHeight": "25", + "SearchBarTextBoxFontSize": "12", + "SearchBarClearButtonFontSize": "14", - "ButtonInstallBackgroundColor": "#FFFFFF", - "ButtonTweaksBackgroundColor": "#FFFFFF", - "ButtonConfigBackgroundColor": "#FFFFFF", - "ButtonUpdatesBackgroundColor": "#FFFFFF", - "ButtonInstallForegroundColor": "#000000", - "ButtonTweaksForegroundColor": "#000000", - "ButtonConfigForegroundColor": "#000000", - "ButtonUpdatesForegroundColor": "#000000", - "ButtonBackgroundColor": "#F5F5F5", - "ButtonBackgroundPressedColor": "#1A1A1A", - "CheckboxMouseOverColor": "#999999", - "ButtonBackgroundMouseoverColor": "#C2C2C2", - "ButtonBackgroundSelectedColor": "#F0F0F0", - "ButtonForegroundColor": "#000000", - "ToggleButtonOnColor": "#2e77ff", + "ButtonInstallBackgroundColor": "#FFFFFF", + "ButtonTweaksBackgroundColor": "#FFFFFF", + "ButtonConfigBackgroundColor": "#FFFFFF", + "ButtonUpdatesBackgroundColor": "#FFFFFF", + "ButtonInstallForegroundColor": "#000000", + "ButtonTweaksForegroundColor": "#000000", + "ButtonConfigForegroundColor": "#000000", + "ButtonUpdatesForegroundColor": "#000000", + "ButtonBackgroundColor": "#F5F5F5", + "ButtonBackgroundPressedColor": "#1A1A1A", + "CheckboxMouseOverColor": "#999999", + "ButtonBackgroundMouseoverColor": "#C2C2C2", + "ButtonBackgroundSelectedColor": "#F0F0F0", + "ButtonForegroundColor": "#000000", + "ToggleButtonOnColor": "#2e77ff", - "ButtonBorderThickness": "1", - "ButtonMargin": "1", - "ButtonCornerRadius": "2", - "BorderColor": "#000000", - "BorderOpacity": "0.2", - "ShadowPulse": "Forever" - }, - "Matrix": { - "CustomDialogFontSize": "12", - "CustomDialogFontSizeHeader": "14", - "CustomDialogIconSize": "25", - "CustomDialogWidth": "400", - "CustomDialogHeight": "200", + "ButtonBorderThickness": "1", + "ButtonMargin": "1", + "ButtonCornerRadius": "2", + "BorderColor": "#000000", + "BorderOpacity": "0.2", + "ShadowPulse": "Forever" + }, + "Classic": { + "ComboBoxBackgroundColor": "#FFFFFF", + "LabelboxForegroundColor": "#000000", + "MainForegroundColor": "#000000", + "MainBackgroundColor": "#FFFFFF", + "LabelBackgroundColor": "#FAFAFA", + "LinkForegroundColor": "#000000", + "LinkHoverForegroundColor": "#000000", + "GroupBorderBackgroundColor": "#000000", + "ComboBoxForegroundColor": "#000000", - "FontSize": "12", - "FontFamily": "Arial", - "FontSizeHeading": "14", - "HeaderFontFamily": "Consolas, Monaco", + "ButtonInstallBackgroundColor": "#FFFFFF", + "ButtonTweaksBackgroundColor": "#FFFFFF", + "ButtonConfigBackgroundColor": "#FFFFFF", + "ButtonUpdatesBackgroundColor": "#FFFFFF", + "ButtonInstallForegroundColor": "#000000", + "ButtonTweaksForegroundColor": "#000000", + "ButtonConfigForegroundColor": "#000000", + "ButtonUpdatesForegroundColor": "#000000", + "ButtonBackgroundColor": "#F5F5F5", + "ButtonBackgroundPressedColor": "#1A1A1A", + "CheckboxMouseOverColor": "#999999", + "ButtonBackgroundMouseoverColor": "#C2C2C2", + "ButtonBackgroundSelectedColor": "#F0F0F0", + "ButtonForegroundColor": "#000000", + "ToggleButtonOnColor": "#2e77ff" + }, + "Matrix": { + "ComboBoxBackgroundColor": "#000000", + "LabelboxForegroundColor": "#FFEE58", + "MainForegroundColor": "#9CCC65", + "MainBackgroundColor": "#000000", + "LabelBackgroundColor": "#000000", + "LinkForegroundColor": "#add8e6", + "LinkHoverForegroundColor": "#FFFFFF", + "ComboBoxForegroundColor": "#FFEE58", - "CheckBoxBulletDecoratorFontSize": "14", - "CheckBoxMargin": "15,0,0,2", + "ProgressBarForegroundColor": "#222222", + "ProgressBarBackgroundColor": "Transparent", + "ProgressBarTextColor": "#cccccc", - "TabButtonFontSize": "14", - "TabButtonWidth": "100", - "TabButtonHeight": "25", - "TabRowHeightInPixels": "50", - "IconFontSize": "14", - "IconButtonSize": "35", - "WinUtilIconSize": "Auto", - "SettingsIconFontSize": "18", + "ButtonInstallBackgroundColor": "#222222", + "ButtonTweaksBackgroundColor": "#333333", + "ButtonConfigBackgroundColor": "#444444", + "ButtonUpdatesBackgroundColor": "#555555", + "ButtonInstallForegroundColor": "#FFFFFF", + "ButtonTweaksForegroundColor": "#FFFFFF", + "ButtonConfigForegroundColor": "#FFFFFF", + "ButtonUpdatesForegroundColor": "#FFFFFF", + "ButtonBackgroundColor": "#000019", + "ButtonBackgroundPressedColor": "#FFFFFF", + "ButtonBackgroundMouseoverColor": "#A55A64", + "ButtonBackgroundSelectedColor": "#FF5733", + "ButtonForegroundColor": "#9CCC65", + "ToggleButtonOnColor": "#2e77ff", - "MicroWinLogoSize": "10", + "BorderColor": "#FFAC1C", + "BorderOpacity": "0.8", + "ShadowPulse": "0:0:3" + }, + "Dark": { + "ComboBoxBackgroundColor": "#000000", + "LabelboxForegroundColor": "#FFEE58", + "MainForegroundColor": "#9CCC65", + "MainBackgroundColor": "#000000", + "LabelBackgroundColor": "#000000", + "LinkForegroundColor": "#add8e6", + "LinkHoverForegroundColor": "#FFFFFF", + "ComboBoxForegroundColor": "#FFEE58", - "ProgressBarForegroundColor": "#222222", - "ProgressBarBackgroundColor": "Transparent", - "ProgressBarTextColor": "#cccccc", + "ProgressBarForegroundColor": "#222222", + "ProgressBarBackgroundColor": "Transparent", + "ProgressBarTextColor": "#cccccc", - "ComboBoxBackgroundColor": "#000000", - "LabelboxForegroundColor": "#FFEE58", - "MainForegroundColor": "#9CCC65", - "MainBackgroundColor": "#000000", - "LabelBackgroundColor": "#000000", - "LinkForegroundColor": "#add8e6", - "LinkHoverForegroundColor": "#FFFFFF", - "ComboBoxForegroundColor": "#FFEE58", + "ButtonInstallBackgroundColor": "#222222", + "ButtonTweaksBackgroundColor": "#333333", + "ButtonConfigBackgroundColor": "#444444", + "ButtonUpdatesBackgroundColor": "#555555", + "ButtonInstallForegroundColor": "#FFFFFF", + "ButtonTweaksForegroundColor": "#FFFFFF", + "ButtonConfigForegroundColor": "#FFFFFF", + "ButtonUpdatesForegroundColor": "#FFFFFF", + "ButtonBackgroundColor": "#000019", + "ButtonBackgroundPressedColor": "#9CCC65", + "ButtonBackgroundMouseoverColor": "#FF5733", + "ButtonBackgroundSelectedColor": "#FF5733", + "ButtonForegroundColor": "#9CCC65", + "ToggleButtonOnColor": "#2e77ff", - "ButtonFontSize": "12", - "ButtonFontFamily": "Arial", - "ButtonWidth": "200", - "ButtonHeight": "25", - "ConfigTabButtonFontSize": "16", - - "SearchBarWidth": "200", - "SearchBarHeight": "25", - "SearchBarTextBoxFontSize": "16", - "SearchBarClearButtonFontSize": "14", - - "ButtonInstallBackgroundColor": "#222222", - "ButtonTweaksBackgroundColor": "#333333", - "ButtonConfigBackgroundColor": "#444444", - "ButtonUpdatesBackgroundColor": "#555555", - "ButtonInstallForegroundColor": "#FFFFFF", - "ButtonTweaksForegroundColor": "#FFFFFF", - "ButtonConfigForegroundColor": "#FFFFFF", - "ButtonUpdatesForegroundColor": "#FFFFFF", - "ButtonBackgroundColor": "#000019", - "ButtonBackgroundPressedColor": "#FFFFFF", - "ButtonBackgroundMouseoverColor": "#A55A64", - "ButtonBackgroundSelectedColor": "#FF5733", - "ButtonForegroundColor": "#9CCC65", - "ToggleButtonOnColor": "#2e77ff", - - "ButtonBorderThickness": "1", - "ButtonMargin": "1", - "ButtonCornerRadius": "2", - "BorderColor": "#FFAC1C", - "BorderOpacity": "0.8", - "ShadowPulse": "0:0:3" - }, - "Dark": { - "CustomDialogFontSize": "12", - "CustomDialogFontSizeHeader": "14", - "CustomDialogIconSize": "25", - "CustomDialogWidth": "400", - "CustomDialogHeight": "200", - - "FontSize": "12", - "FontFamily": "Arial", - "FontSizeHeading": "14", - "HeaderFontFamily": "Consolas, Monaco", - - "CheckBoxBulletDecoratorFontSize": "14", - "CheckBoxMargin": "15,0,0,2", - - "TabButtonFontSize": "14", - "TabButtonWidth": "100", - "TabButtonHeight": "25", - "TabRowHeightInPixels": "50", - "IconFontSize": "14", - "IconButtonSize": "35", - "WinUtilIconSize": "Auto", - "SettingsIconFontSize": "18", - - "MicroWinLogoSize": "10", - - "ProgressBarForegroundColor": "#222222", - "ProgressBarBackgroundColor": "Transparent", - "ProgressBarTextColor": "#FFFFFF", - - "ComboBoxBackgroundColor": "#000000", - "LabelboxForegroundColor": "#FFEE58", - "MainForegroundColor": "#9CCC65", - "MainBackgroundColor": "#000000", - "LabelBackgroundColor": "#000000", - "LinkForegroundColor": "#add8e6", - "LinkHoverForegroundColor": "#FFFFFF", - "ComboBoxForegroundColor": "#FFEE58", - - "ButtonFontSize": "12", - "ButtonFontFamily": "Arial", - "ButtonWidth": "200", - "ButtonHeight": "25", - "ConfigTabButtonFontSize": "16", - - "SearchBarWidth": "200", - "SearchBarHeight": "25", - "SearchBarTextBoxFontSize": "16", - "SearchBarClearButtonFontSize": "14", - - "ButtonInstallBackgroundColor": "#222222", - "ButtonTweaksBackgroundColor": "#333333", - "ButtonConfigBackgroundColor": "#444444", - "ButtonUpdatesBackgroundColor": "#555555", - "ButtonInstallForegroundColor": "#FFFFFF", - "ButtonTweaksForegroundColor": "#FFFFFF", - "ButtonConfigForegroundColor": "#FFFFFF", - "ButtonUpdatesForegroundColor": "#FFFFFF", - "ButtonBackgroundColor": "#000019", - "ButtonBackgroundPressedColor": "#9CCC65", - "ButtonBackgroundMouseoverColor": "#FF5733", - "ButtonBackgroundSelectedColor": "#FF5733", - "ButtonForegroundColor": "#9CCC65", - "ToggleButtonOnColor": "#2e77ff", - - "ButtonBorderThickness": "1", - "ButtonMargin": "1", - "ButtonCornerRadius": "2", - "BorderColor": "#FFAC1C", - "BorderOpacity": "0.2", - "ShadowPulse": "Forever" - } + "BorderColor": "#FFAC1C" + } } diff --git a/functions/private/Set-WinUtilUITheme.ps1 b/functions/private/Set-WinUtilUITheme.ps1 new file mode 100644 index 00000000..c71ae88c --- /dev/null +++ b/functions/private/Set-WinUtilUITheme.ps1 @@ -0,0 +1,83 @@ +function Set-WinUtilUITheme { + <# + .SYNOPSIS + Sets the theme of the XAML file + + .PARAMETER inputXML + A string representing the XAML object to modify + + .PARAMETER customThemeName + The name of the custom theme to set the XAML to. Defaults to 'matrix' + + .PARAMETER defaultThemeName + The name of the default theme to use when setting the XAML. Defaults to '_default' + + .EXAMPLE + $returnVal = Set-WinUtilUITheme -inputXAML $inputXAML + if ($returnVal[0] -eq "") { + Write-Host "Failed to process inputXML" + } else { + $inputXML = $returnVal[0] + } + # to know which theme this function has used, access the second item in returned value. + Write-Host "Theme used in processing: $($returnVal[1])" + #> + + param ( + [Parameter(Mandatory, position=0)] + [string]$inputXML, + + [Parameter(position=1)] + [string]$customThemeName = 'matrix', + + [Parameter(position=2)] + [string]$defaultThemeName = '_default' + ) + + try { + # Note: + # Reason behind not caching the '$sync.configs.themes` object into a variable, + # because this code can modify the themes object.. meaning it's better to access it + # using the more verbose way, rather than introduce possible bugs into the code, just for the sake of readability. + # + if (-NOT $sync.configs.themes) { + throw [GenericException]::new("[Set-WinUtilTheme] Did not find 'config.themes' inside `$sync variable.") + } + + if (-NOT $sync.configs.themes.$defaultThemeName) { + throw [GenericException]::new("[Set-WinUtilTheme] Did not find '$defaultThemeName' theme in the themes config file.") + } + + $themeToUse = $customThemeName + if ($sync.configs.themes.$themeToUse) { + # Loop through every default theme option, and modify the custom theme in $sync variable, + # so that it has full options available for other functions to use. + foreach ($option in $sync.configs.themes.$defaultThemeName.PSObject.Properties) { + $optionName = $option.Name + $optionValue = $option.Value + if (-NOT $sync.configs.themes.$themeToUse.$optionName) { + $sync.configs.themes.$themeToUse | Add-Member -MemberType NoteProperty -Name $optionName -Value $optionValue + } + } + } else { + Write-Debug "[Set-WinUtilTheme] Theme '$customThemeName' was not found, using '$defaultThemeName' instead." + $themeToUse = $defaultThemeName + } + + foreach ($property in $sync.configs.themes.$themeToUse.PSObject.Properties) { + $key = $property.Name + $value = $property.Value + # Add curly braces around the key + $formattedKey = "{$key}" + # Replace the key with the value in the input XML + $inputXML = $inputXML.Replace($formattedKey, $value) + } + } + catch { + Write-Host "[Set-WinUtilTheme] Unable to apply theme" -ForegroundColor Red + Write-Host "$($psitem.Exception.Message)" -ForegroundColor Red + $inputXML = "" # Make inputXML equal an empty string, indicating something went wrong to the function caller. + } + + return @($inputXML, $themeToUse); +} diff --git a/functions/private/Set-WinUtilUiTheme.ps1 b/functions/private/Set-WinUtilUiTheme.ps1 deleted file mode 100644 index 45db1ab4..00000000 --- a/functions/private/Set-WinUtilUiTheme.ps1 +++ /dev/null @@ -1,50 +0,0 @@ -function Set-WinUtilUITheme { - <# - .SYNOPSIS - Sets the theme of the XAML file - - .PARAMETER inputXML - A string representing the XAML object to modify - - .PARAMETER themeName - The name of the theme to set the XAML to. Defaults to 'matrix' - - .EXAMPLE - Set-WinUtilUITheme -inputXAML $inputXAML - #> - - param - ( - [Parameter(Mandatory, position=0)] - [string]$inputXML, - [Parameter(position=1)] - [string]$themeName = 'matrix' - ) - - try { - # Convert the JSON to a PowerShell object - $themes = $sync.configs.themes - # Select the specified theme - $selectedTheme = $themes.$themeName - - if ($selectedTheme) { - # Loop through all key-value pairs in the selected theme - foreach ($property in $selectedTheme.PSObject.Properties) { - $key = $property.Name - $value = $property.Value - # Add curly braces around the key - $formattedKey = "{$key}" - # Replace the key with the value in the input XML - $inputXML = $inputXML.Replace($formattedKey, $value) - } - } else { - Write-Host "Theme '$themeName' not found." - } - - } catch { - Write-Warning "Unable to apply theme" - Write-Warning $psitem.Exception.StackTrace - } - - return $inputXML; -} diff --git a/scripts/main.ps1 b/scripts/main.ps1 index c1d476f4..412f218f 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -52,6 +52,7 @@ $sync.runspace.Open() $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^ - + + Foreground="{MainForegroundColor}" FontSize="{CloseIconFontSize}" Name="WPFCloseButton" />