mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-04 10:16:24 +02:00
## Summary This PR adds: - Backdrop material customization - Alongside acrylic, the following options are now available: - Transparent background - Mica background - Background material opacity - Lets you control how transparent the background is ## Pictures? Pictures! <img width="1491" height="928" alt="image" src="https://github.com/user-attachments/assets/ff4e9e06-fcf1-4f05-bc0a-fb70dc4f39be" /> https://github.com/user-attachments/assets/84e83279-afab-481e-b904-f054318c5d2f <img width="977" height="628" alt="image" src="https://github.com/user-attachments/assets/241a228d-af3f-448a-94a6-0a282218bd8c" /> ## PR Checklist - [x] Closes: #44197 <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed
202 lines
8.8 KiB
C#
202 lines
8.8 KiB
C#
// 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 Microsoft.CmdPal.UI.ViewModels;
|
|
using Microsoft.UI.Xaml;
|
|
using Microsoft.UI.Xaml.Controls;
|
|
using Microsoft.UI.Xaml.Media;
|
|
using Windows.UI;
|
|
|
|
namespace Microsoft.CmdPal.UI.Controls;
|
|
|
|
public sealed partial class CommandPalettePreview : UserControl
|
|
{
|
|
public static readonly DependencyProperty PreviewBackgroundColorProperty = DependencyProperty.Register(nameof(PreviewBackgroundColor), typeof(Color), typeof(CommandPalettePreview), new PropertyMetadata(default(Color), OnBackdropPropertyChanged));
|
|
|
|
public static readonly DependencyProperty PreviewBackgroundImageSourceProperty = DependencyProperty.Register(nameof(PreviewBackgroundImageSource), typeof(ImageSource), typeof(CommandPalettePreview), new PropertyMetadata(null, OnBackgroundImageSourceChanged));
|
|
|
|
public static readonly DependencyProperty PreviewBackgroundImageOpacityProperty = DependencyProperty.Register(nameof(PreviewBackgroundImageOpacity), typeof(double), typeof(CommandPalettePreview), new PropertyMetadata(1.0));
|
|
|
|
public static readonly DependencyProperty PreviewBackgroundImageFitProperty = DependencyProperty.Register(nameof(PreviewBackgroundImageFit), typeof(BackgroundImageFit), typeof(CommandPalettePreview), new PropertyMetadata(default(BackgroundImageFit)));
|
|
|
|
public static readonly DependencyProperty PreviewBackgroundImageBrightnessProperty = DependencyProperty.Register(nameof(PreviewBackgroundImageBrightness), typeof(double), typeof(CommandPalettePreview), new PropertyMetadata(0d));
|
|
|
|
public static readonly DependencyProperty PreviewBackgroundImageBlurAmountProperty = DependencyProperty.Register(nameof(PreviewBackgroundImageBlurAmount), typeof(double), typeof(CommandPalettePreview), new PropertyMetadata(0d));
|
|
|
|
public static readonly DependencyProperty PreviewBackgroundImageTintProperty = DependencyProperty.Register(nameof(PreviewBackgroundImageTint), typeof(Color), typeof(CommandPalettePreview), new PropertyMetadata(default(Color)));
|
|
|
|
public static readonly DependencyProperty PreviewBackgroundImageTintIntensityProperty = DependencyProperty.Register(nameof(PreviewBackgroundImageTintIntensity), typeof(int), typeof(CommandPalettePreview), new PropertyMetadata(0));
|
|
|
|
public static readonly DependencyProperty ShowBackgroundImageProperty = DependencyProperty.Register(nameof(ShowBackgroundImage), typeof(Visibility), typeof(CommandPalettePreview), new PropertyMetadata(Visibility.Collapsed, OnVisibilityPropertyChanged));
|
|
|
|
public static readonly DependencyProperty PreviewBackdropStyleProperty = DependencyProperty.Register(nameof(PreviewBackdropStyle), typeof(BackdropStyle?), typeof(CommandPalettePreview), new PropertyMetadata(null, OnVisibilityPropertyChanged));
|
|
|
|
public static readonly DependencyProperty PreviewEffectiveOpacityProperty = DependencyProperty.Register(nameof(PreviewEffectiveOpacity), typeof(double), typeof(CommandPalettePreview), new PropertyMetadata(1.0, OnBackdropPropertyChanged));
|
|
|
|
// Computed read-only dependency properties
|
|
public static readonly DependencyProperty EffectiveClearColorProperty = DependencyProperty.Register(nameof(EffectiveClearColor), typeof(Color), typeof(CommandPalettePreview), new PropertyMetadata(default(Color)));
|
|
|
|
public static readonly DependencyProperty AcrylicVisibilityProperty = DependencyProperty.Register(nameof(AcrylicVisibility), typeof(Visibility), typeof(CommandPalettePreview), new PropertyMetadata(Visibility.Visible));
|
|
|
|
public static readonly DependencyProperty ClearVisibilityProperty = DependencyProperty.Register(nameof(ClearVisibility), typeof(Visibility), typeof(CommandPalettePreview), new PropertyMetadata(Visibility.Collapsed));
|
|
|
|
public BackgroundImageFit PreviewBackgroundImageFit
|
|
{
|
|
get { return (BackgroundImageFit)GetValue(PreviewBackgroundImageFitProperty); }
|
|
set { SetValue(PreviewBackgroundImageFitProperty, value); }
|
|
}
|
|
|
|
public Color PreviewBackgroundColor
|
|
{
|
|
get { return (Color)GetValue(PreviewBackgroundColorProperty); }
|
|
set { SetValue(PreviewBackgroundColorProperty, value); }
|
|
}
|
|
|
|
public ImageSource PreviewBackgroundImageSource
|
|
{
|
|
get { return (ImageSource)GetValue(PreviewBackgroundImageSourceProperty); }
|
|
set { SetValue(PreviewBackgroundImageSourceProperty, value); }
|
|
}
|
|
|
|
public double PreviewBackgroundImageOpacity
|
|
{
|
|
get => (double)GetValue(PreviewBackgroundImageOpacityProperty);
|
|
set => SetValue(PreviewBackgroundImageOpacityProperty, value);
|
|
}
|
|
|
|
public double PreviewBackgroundImageBrightness
|
|
{
|
|
get => (double)GetValue(PreviewBackgroundImageBrightnessProperty);
|
|
set => SetValue(PreviewBackgroundImageBrightnessProperty, value);
|
|
}
|
|
|
|
public double PreviewBackgroundImageBlurAmount
|
|
{
|
|
get => (double)GetValue(PreviewBackgroundImageBlurAmountProperty);
|
|
set => SetValue(PreviewBackgroundImageBlurAmountProperty, value);
|
|
}
|
|
|
|
public Color PreviewBackgroundImageTint
|
|
{
|
|
get => (Color)GetValue(PreviewBackgroundImageTintProperty);
|
|
set => SetValue(PreviewBackgroundImageTintProperty, value);
|
|
}
|
|
|
|
public int PreviewBackgroundImageTintIntensity
|
|
{
|
|
get => (int)GetValue(PreviewBackgroundImageTintIntensityProperty);
|
|
set => SetValue(PreviewBackgroundImageTintIntensityProperty, value);
|
|
}
|
|
|
|
public Visibility ShowBackgroundImage
|
|
{
|
|
get => (Visibility)GetValue(ShowBackgroundImageProperty);
|
|
set => SetValue(ShowBackgroundImageProperty, value);
|
|
}
|
|
|
|
public BackdropStyle? PreviewBackdropStyle
|
|
{
|
|
get => (BackdropStyle?)GetValue(PreviewBackdropStyleProperty);
|
|
set => SetValue(PreviewBackdropStyleProperty, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the effective opacity for the backdrop, pre-computed by the theme provider.
|
|
/// For Acrylic style: used directly as TintOpacity.
|
|
/// For Clear style: used to compute the alpha channel of the solid color.
|
|
/// </summary>
|
|
public double PreviewEffectiveOpacity
|
|
{
|
|
get => (double)GetValue(PreviewEffectiveOpacityProperty);
|
|
set => SetValue(PreviewEffectiveOpacityProperty, value);
|
|
}
|
|
|
|
// Computed read-only properties
|
|
public Color EffectiveClearColor
|
|
{
|
|
get => (Color)GetValue(EffectiveClearColorProperty);
|
|
private set => SetValue(EffectiveClearColorProperty, value);
|
|
}
|
|
|
|
public Visibility AcrylicVisibility
|
|
{
|
|
get => (Visibility)GetValue(AcrylicVisibilityProperty);
|
|
private set => SetValue(AcrylicVisibilityProperty, value);
|
|
}
|
|
|
|
public Visibility ClearVisibility
|
|
{
|
|
get => (Visibility)GetValue(ClearVisibilityProperty);
|
|
private set => SetValue(ClearVisibilityProperty, value);
|
|
}
|
|
|
|
public CommandPalettePreview()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private static void OnBackgroundImageSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
if (d is not CommandPalettePreview preview)
|
|
{
|
|
return;
|
|
}
|
|
|
|
preview.ShowBackgroundImage = e.NewValue is ImageSource ? Visibility.Visible : Visibility.Collapsed;
|
|
}
|
|
|
|
private static void OnBackdropPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
if (d is not CommandPalettePreview preview)
|
|
{
|
|
return;
|
|
}
|
|
|
|
preview.UpdateComputedClearColor();
|
|
}
|
|
|
|
private static void OnVisibilityPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
if (d is not CommandPalettePreview preview)
|
|
{
|
|
return;
|
|
}
|
|
|
|
preview.UpdateComputedVisibilityProperties();
|
|
preview.UpdateComputedClearColor();
|
|
}
|
|
|
|
private void UpdateComputedClearColor()
|
|
{
|
|
EffectiveClearColor = Color.FromArgb(
|
|
(byte)(PreviewEffectiveOpacity * 255),
|
|
PreviewBackgroundColor.R,
|
|
PreviewBackgroundColor.G,
|
|
PreviewBackgroundColor.B);
|
|
}
|
|
|
|
private void UpdateComputedVisibilityProperties()
|
|
{
|
|
var config = BackdropStyles.Get(PreviewBackdropStyle ?? BackdropStyle.Acrylic);
|
|
|
|
// Show backdrop effect based on style (on top of any background image)
|
|
AcrylicVisibility = config.PreviewBrush == PreviewBrushKind.Acrylic
|
|
? Visibility.Visible : Visibility.Collapsed;
|
|
ClearVisibility = config.PreviewBrush == PreviewBrushKind.Solid
|
|
? Visibility.Visible : Visibility.Collapsed;
|
|
}
|
|
|
|
private double ToTintIntensity(int value) => value / 100.0;
|
|
|
|
private Stretch ToStretch(BackgroundImageFit fit)
|
|
{
|
|
return fit switch
|
|
{
|
|
BackgroundImageFit.Fill => Stretch.Fill,
|
|
BackgroundImageFit.UniformToFill => Stretch.UniformToFill,
|
|
_ => Stretch.None,
|
|
};
|
|
}
|
|
}
|