mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-07-10 04:20:23 +02:00
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request Existing: <img width="1201" height="150" alt="image" src="https://github.com/user-attachments/assets/5e764875-bed8-45b5-97a8-60e5f475c296" /> A box icon for whatever up, down, left, right, they are not treated as Glyph icon rendered, instead as normal text <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- - [ ] 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 <img width="1273" height="714" alt="image" src="https://github.com/user-attachments/assets/4d2ffa92-e0ca-44f4-8eda-9c4a7e05bbde" />
210 lines
7.2 KiB
C#
210 lines
7.2 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.UI.Xaml;
|
|
using Microsoft.UI.Xaml.Controls;
|
|
using Windows.System;
|
|
|
|
namespace Microsoft.PowerToys.Common.UI.Controls
|
|
{
|
|
[TemplatePart(Name = KeyPresenter, Type = typeof(KeyCharPresenter))]
|
|
[TemplateVisualState(Name = NormalState, GroupName = "CommonStates")]
|
|
[TemplateVisualState(Name = DisabledState, GroupName = "CommonStates")]
|
|
[TemplateVisualState(Name = InvalidState, GroupName = "CommonStates")]
|
|
[TemplateVisualState(Name = WarningState, GroupName = "CommonStates")]
|
|
public sealed partial class KeyVisual : Control
|
|
{
|
|
private const string KeyPresenter = "KeyPresenter";
|
|
private const string NormalState = "Normal";
|
|
private const string DisabledState = "Disabled";
|
|
private const string InvalidState = "Invalid";
|
|
private const string WarningState = "Warning";
|
|
private KeyCharPresenter _keyPresenter = null!;
|
|
|
|
public object Content
|
|
{
|
|
get => (object)GetValue(ContentProperty);
|
|
set => SetValue(ContentProperty, value);
|
|
}
|
|
|
|
public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(KeyVisual), new PropertyMetadata(default(string), OnContentChanged));
|
|
|
|
public State State
|
|
{
|
|
get => (State)GetValue(StateProperty);
|
|
set => SetValue(StateProperty, value);
|
|
}
|
|
|
|
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(nameof(State), typeof(State), typeof(KeyVisual), new PropertyMetadata(State.Normal, OnStateChanged));
|
|
|
|
public bool RenderKeyAsGlyph
|
|
{
|
|
get => (bool)GetValue(RenderKeyAsGlyphProperty);
|
|
set => SetValue(RenderKeyAsGlyphProperty, value);
|
|
}
|
|
|
|
public static readonly DependencyProperty RenderKeyAsGlyphProperty = DependencyProperty.Register(nameof(RenderKeyAsGlyph), typeof(bool), typeof(KeyVisual), new PropertyMetadata(false, OnContentChanged));
|
|
|
|
public KeyVisual()
|
|
{
|
|
this.DefaultStyleKey = typeof(KeyVisual);
|
|
}
|
|
|
|
protected override void OnApplyTemplate()
|
|
{
|
|
IsEnabledChanged -= KeyVisual_IsEnabledChanged;
|
|
_keyPresenter = (KeyCharPresenter)this.GetTemplateChild(KeyPresenter);
|
|
Update();
|
|
SetVisualStates();
|
|
IsEnabledChanged += KeyVisual_IsEnabledChanged;
|
|
base.OnApplyTemplate();
|
|
}
|
|
|
|
private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
((KeyVisual)d).SetVisualStates();
|
|
}
|
|
|
|
private static void OnStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
((KeyVisual)d).SetVisualStates();
|
|
}
|
|
|
|
private void SetVisualStates()
|
|
{
|
|
if (this != null)
|
|
{
|
|
if (State == State.Error)
|
|
{
|
|
VisualStateManager.GoToState(this, InvalidState, true);
|
|
}
|
|
else if (State == State.Warning)
|
|
{
|
|
VisualStateManager.GoToState(this, WarningState, true);
|
|
}
|
|
else if (!IsEnabled)
|
|
{
|
|
VisualStateManager.GoToState(this, DisabledState, true);
|
|
}
|
|
else
|
|
{
|
|
VisualStateManager.GoToState(this, NormalState, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (Content == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (Content is string key)
|
|
{
|
|
switch (key)
|
|
{
|
|
case nameof(VirtualKey.Up):
|
|
SetGlyphOrText("\uE0E4", VirtualKey.Up);
|
|
break;
|
|
|
|
case nameof(VirtualKey.Down):
|
|
SetGlyphOrText("\uE0E5", VirtualKey.Down);
|
|
break;
|
|
|
|
case nameof(VirtualKey.Left):
|
|
SetGlyphOrText("\uE0E2", VirtualKey.Left);
|
|
break;
|
|
|
|
case nameof(VirtualKey.Right):
|
|
SetGlyphOrText("\uE0E3", VirtualKey.Right);
|
|
break;
|
|
|
|
case "Copilot":
|
|
_keyPresenter.Style = (Style)Application.Current.Resources["CopilotKeyCharPresenterStyle"];
|
|
break;
|
|
|
|
case "Office":
|
|
_keyPresenter.Style = (Style)Application.Current.Resources["OfficeKeyCharPresenterStyle"];
|
|
break;
|
|
|
|
default:
|
|
_keyPresenter.Style = (Style)Application.Current.Resources["DefaultKeyCharPresenterStyle"];
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (Content is int keyCode)
|
|
{
|
|
VirtualKey virtualKey = (VirtualKey)keyCode;
|
|
switch (virtualKey)
|
|
{
|
|
case VirtualKey.Enter:
|
|
SetGlyphOrText("\uE751", virtualKey);
|
|
break;
|
|
|
|
case VirtualKey.Back:
|
|
SetGlyphOrText("\uE750", virtualKey);
|
|
break;
|
|
|
|
case VirtualKey.Shift:
|
|
case (VirtualKey)160: // Left Shift
|
|
case (VirtualKey)161: // Right Shift
|
|
SetGlyphOrText("\uE752", virtualKey);
|
|
break;
|
|
|
|
case VirtualKey.Up:
|
|
SetGlyphOrText("\uE0E4", virtualKey);
|
|
break;
|
|
|
|
case VirtualKey.Down:
|
|
SetGlyphOrText("\uE0E5", virtualKey);
|
|
break;
|
|
|
|
case VirtualKey.Left:
|
|
SetGlyphOrText("\uE0E2", virtualKey);
|
|
break;
|
|
|
|
case VirtualKey.Right:
|
|
SetGlyphOrText("\uE0E3", virtualKey);
|
|
break;
|
|
|
|
case VirtualKey.LeftWindows:
|
|
case VirtualKey.RightWindows:
|
|
_keyPresenter.Style = (Style)Application.Current.Resources["WindowsKeyCharPresenterStyle"];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SetGlyphOrText(string glyph, VirtualKey key)
|
|
{
|
|
if (RenderKeyAsGlyph)
|
|
{
|
|
_keyPresenter.Content = glyph;
|
|
_keyPresenter.Style = (Style)Application.Current.Resources["GlyphKeyCharPresenterStyle"];
|
|
}
|
|
else
|
|
{
|
|
_keyPresenter.Content = key.ToString();
|
|
_keyPresenter.Style = (Style)Application.Current.Resources["DefaultKeyCharPresenterStyle"];
|
|
}
|
|
}
|
|
|
|
private void KeyVisual_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
SetVisualStates();
|
|
}
|
|
}
|
|
|
|
public enum State
|
|
{
|
|
Normal,
|
|
Error,
|
|
Warning,
|
|
}
|
|
}
|