mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-07 03:36:44 +02:00
[Run] Switch to WPF UI theme manager (#30520)
* Switch to WPF UI theme manager * fix * add theme manager * fix * fix * update error icon * moved image initialization * cleanup
This commit is contained in:
committed by
GitHub
parent
e73e73fa6c
commit
ae21b0dc09
46
src/modules/launcher/PowerLauncher/Helper/ThemeExtensions.cs
Normal file
46
src/modules/launcher/PowerLauncher/Helper/ThemeExtensions.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) Microsoft Corporation
|
||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System.Linq;
|
||||
using ManagedCommon;
|
||||
using Microsoft.Win32;
|
||||
using Wpf.Ui.Appearance;
|
||||
|
||||
namespace PowerLauncher.Helper
|
||||
{
|
||||
public static class ThemeExtensions
|
||||
{
|
||||
public static Theme ToTheme(this ApplicationTheme applicationTheme)
|
||||
{
|
||||
return applicationTheme switch
|
||||
{
|
||||
ApplicationTheme.Dark => Theme.Dark,
|
||||
ApplicationTheme.Light => Theme.Light,
|
||||
ApplicationTheme.HighContrast => GetHighContrastBaseType(),
|
||||
_ => Theme.Light,
|
||||
};
|
||||
}
|
||||
|
||||
private static Theme GetHighContrastBaseType()
|
||||
{
|
||||
string registryKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes";
|
||||
string theme = (string)Registry.GetValue(registryKey, "CurrentTheme", string.Empty);
|
||||
theme = theme.Split('\\').Last().Split('.').First().ToString();
|
||||
|
||||
switch (theme)
|
||||
{
|
||||
case "hc1":
|
||||
return Theme.HighContrastOne;
|
||||
case "hc2":
|
||||
return Theme.HighContrastTwo;
|
||||
case "hcwhite":
|
||||
return Theme.HighContrastWhite;
|
||||
case "hcblack":
|
||||
return Theme.HighContrastBlack;
|
||||
default:
|
||||
return Theme.HighContrastOne;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
90
src/modules/launcher/PowerLauncher/Helper/ThemeManager.cs
Normal file
90
src/modules/launcher/PowerLauncher/Helper/ThemeManager.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
// Copyright (c) Microsoft Corporation
|
||||
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System;
|
||||
using ManagedCommon;
|
||||
using Wox.Infrastructure.Image;
|
||||
using Wox.Infrastructure.UserSettings;
|
||||
using Wpf.Ui.Appearance;
|
||||
|
||||
namespace PowerLauncher.Helper
|
||||
{
|
||||
public class ThemeManager : IDisposable
|
||||
{
|
||||
private readonly PowerToysRunSettings _settings;
|
||||
private readonly MainWindow _mainWindow;
|
||||
private Theme _currentTheme;
|
||||
private bool _disposed;
|
||||
|
||||
public Theme CurrentTheme => _currentTheme;
|
||||
|
||||
public event Common.UI.ThemeChangedHandler ThemeChanged;
|
||||
|
||||
public ThemeManager(PowerToysRunSettings settings, MainWindow mainWindow)
|
||||
{
|
||||
_settings = settings;
|
||||
_mainWindow = mainWindow;
|
||||
_currentTheme = ApplicationThemeManager.GetAppTheme().ToTheme();
|
||||
SetTheme(false);
|
||||
|
||||
ApplicationThemeManager.Changed += ApplicationThemeManager_Changed;
|
||||
}
|
||||
|
||||
public void SetTheme(bool fromSettings)
|
||||
{
|
||||
if (_settings.Theme == Theme.Light)
|
||||
{
|
||||
_currentTheme = Theme.Light;
|
||||
_mainWindow?.Dispatcher.Invoke(() => ApplicationThemeManager.Apply(ApplicationTheme.Light, _mainWindow.WindowBackdropType));
|
||||
}
|
||||
else if (_settings.Theme == Theme.Dark)
|
||||
{
|
||||
_currentTheme = Theme.Dark;
|
||||
_mainWindow?.Dispatcher.Invoke(() => ApplicationThemeManager.Apply(ApplicationTheme.Dark, _mainWindow.WindowBackdropType));
|
||||
}
|
||||
else if (fromSettings)
|
||||
{
|
||||
_mainWindow?.Dispatcher.Invoke(ApplicationThemeManager.ApplySystemTheme);
|
||||
}
|
||||
|
||||
ImageLoader.UpdateIconPath(_currentTheme);
|
||||
|
||||
// oldTheme isn't used
|
||||
ThemeChanged?.Invoke(_currentTheme, _currentTheme);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
private void ApplicationThemeManager_Changed(ApplicationTheme currentApplicationTheme, System.Windows.Media.Color systemAccent)
|
||||
{
|
||||
var newTheme = currentApplicationTheme.ToTheme();
|
||||
if (_currentTheme == newTheme)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_currentTheme = newTheme;
|
||||
SetTheme(false);
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (_disposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (disposing)
|
||||
{
|
||||
ApplicationThemeManager.Changed -= ApplicationThemeManager_Changed;
|
||||
}
|
||||
|
||||
_disposed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user