diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.cs similarity index 100% rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml.cs rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.cs diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.xaml similarity index 100% rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.xaml diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml new file mode 100644 index 0000000000..3e547c6d65 --- /dev/null +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml @@ -0,0 +1,107 @@ + + + + + + + + + diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml.cs new file mode 100644 index 0000000000..0457e715ee --- /dev/null +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml.cs @@ -0,0 +1,32 @@ +// 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 System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Documents; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; + +namespace KeyboardManagerEditorUI.Controls; + +public sealed partial class KeyCharPresenter : Control +{ + public KeyCharPresenter() + { + DefaultStyleKey = typeof(KeyCharPresenter); + } + + public object Content + { + get => (object)GetValue(ContentProperty); + set => SetValue(ContentProperty, value); + } + + public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(KeyCharPresenter), new PropertyMetadata(default(string))); +} diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml new file mode 100644 index 0000000000..e0f04391c7 --- /dev/null +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml @@ -0,0 +1,213 @@ + + + + + + + + \ No newline at end of file diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml.cs new file mode 100644 index 0000000000..a0ed4b0306 --- /dev/null +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml.cs @@ -0,0 +1,195 @@ +// 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 KeyboardManagerEditorUI.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; + + 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)); + +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. + public KeyVisual() +#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. + { + 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 "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: + _keyPresenter.Content = "\uE0E4"; + break; + + case VirtualKey.Down: + _keyPresenter.Content = "\uE0E5"; + break; + + case VirtualKey.Left: + _keyPresenter.Content = "\uE0E2"; + break; + + case VirtualKey.Right: + _keyPresenter.Content = "\uE0E3"; + 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, + } +} diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml index 579d28b453..e3842618ce 100644 --- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml @@ -1,11 +1,11 @@ - + - - - diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml index f9524481e4..1e1537351b 100644 --- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml @@ -8,8 +8,8 @@ - - + + diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml index a8c8c6455c..d4e02233bb 100644 --- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml @@ -35,7 +35,7 @@ - diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml similarity index 96% rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml index 1b1669cd2c..984454e639 100644 --- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml @@ -1,12 +1,11 @@ + TargetType="controls:IconLabelControl"> @@ -156,7 +155,7 @@ VerticalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="in" /> - + - @@ -244,7 +243,7 @@ VerticalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="in" /> - + - @@ -334,7 +333,7 @@ VerticalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="in" /> - + --> - @@ -423,7 +422,7 @@ VerticalAlignment="Center" Foreground="{ThemeResource TextFillColorSecondaryBrush}" Text="in" /> - + --> - + diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml.cs similarity index 99% rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml.cs rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml.cs index 6659bb1f75..53b1b3d73d 100644 --- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml.cs +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml.cs @@ -24,7 +24,7 @@ namespace KeyboardManagerEditorUI.Pages /// A consolidated page that displays all mappings from Remappings, Text, Programs, and URLs pages. /// #pragma warning disable SA1124 // Do not use regions - public sealed partial class MainPage : Page, IDisposable + public sealed partial class All : Page, IDisposable { private KeyboardMappingService? _mappingService; private bool _disposed; @@ -68,7 +68,7 @@ namespace KeyboardManagerEditorUI.Pages public bool IsAllApps { get; set; } = true; } - public MainPage() + public All() { this.InitializeComponent(); @@ -79,7 +79,7 @@ namespace KeyboardManagerEditorUI.Pages } catch (Exception ex) { - Logger.LogError("Failed to initialize KeyboardMappingService in MainPage page: " + ex.Message); + Logger.LogError("Failed to initialize KeyboardMappingService in All page: " + ex.Message); } this.Unloaded += All_Unloaded;