diff --git a/FluentTerminal.App.Services/IAcceleratorKeyValidator.cs b/FluentTerminal.App.Services/IAcceleratorKeyValidator.cs deleted file mode 100644 index d6437f6..0000000 --- a/FluentTerminal.App.Services/IAcceleratorKeyValidator.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FluentTerminal.Models.Enums; - -namespace FluentTerminal.App.Services -{ - // This validator is needed because accelerator key has to be member of VirtualKey enum. - public interface IAcceleratorKeyValidator - { - bool Valid(int key); - - bool Valid(ExtendedVirtualKey key); - } -} \ No newline at end of file diff --git a/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs b/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs index 51e0dfc..1742f2d 100644 --- a/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs +++ b/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs @@ -230,8 +230,7 @@ namespace FluentTerminal.App.Services.Implementation Command = nameof(Command.ShowSettings), Ctrl = true, Shift = true, - // I've had to replace ExtendedVirtualKey.Comma because it isn't a member of VirtualKey enum, thus cannot be shown in menu. - Key = (int)ExtendedVirtualKey.S + Key = (int)ExtendedVirtualKey.Comma } }; diff --git a/FluentTerminal.App.ViewModels/MainViewModel.cs b/FluentTerminal.App.ViewModels/MainViewModel.cs index 43de17e..1589f68 100644 --- a/FluentTerminal.App.ViewModels/MainViewModel.cs +++ b/FluentTerminal.App.ViewModels/MainViewModel.cs @@ -28,7 +28,6 @@ namespace FluentTerminal.App.ViewModels private readonly ISettingsService _settingsService; private readonly ITrayProcessCommunicationService _trayProcessCommunicationService; private readonly ICommandHistoryService _commandHistoryService; - private readonly IAcceleratorKeyValidator _acceleratorKeyValidator; private ApplicationSettings _applicationSettings; private bool _useAcrylicBackground; private double _backgroundOpacity; @@ -38,7 +37,7 @@ namespace FluentTerminal.App.ViewModels private IDictionary> _keyBindings; public MainViewModel(ISettingsService settingsService, ITrayProcessCommunicationService trayProcessCommunicationService, IDialogService dialogService, IKeyboardCommandService keyboardCommandService, - IApplicationView applicationView, IClipboardService clipboardService, ICommandHistoryService commandHistoryService, IAcceleratorKeyValidator acceleratorKeyValidator) + IApplicationView applicationView, IClipboardService clipboardService, ICommandHistoryService commandHistoryService) { MessengerInstance.Register(this, OnApplicationSettingsChanged); MessengerInstance.Register(this, OnShellProfileAdded); @@ -57,7 +56,6 @@ namespace FluentTerminal.App.ViewModels _clipboardService = clipboardService; _keyboardCommandService = keyboardCommandService; _commandHistoryService = commandHistoryService; - _acceleratorKeyValidator = acceleratorKeyValidator; _keyboardCommandService.RegisterCommandHandler(nameof(Command.NewTab), async () => await AddDefaultProfileAsync(NewTerminalLocation.Tab)); _keyboardCommandService.RegisterCommandHandler(nameof(Command.NewWindow), async () => await AddDefaultProfileAsync(NewTerminalLocation.Window)); @@ -677,8 +675,7 @@ namespace FluentTerminal.App.ViewModels icon: Mdl2Icon.Settings()); if (_keyBindings.TryGetValue(nameof(Command.ShowSettings), out var keyBindings) && - keyBindings.FirstOrDefault() is KeyBinding settingsKeyBinding && - _acceleratorKeyValidator.Valid(settingsKeyBinding.Key)) + keyBindings.FirstOrDefault() is KeyBinding settingsKeyBinding) { LoadKeyBindingsFromModel(settingsItem, settingsKeyBinding); } @@ -720,8 +717,7 @@ namespace FluentTerminal.App.ViewModels var defaultProfileCommand = tab ? nameof(Command.NewTab) : nameof(Command.NewWindow); if (_keyBindings.TryGetValue(defaultProfileCommand, out var kbs) && - kbs.FirstOrDefault() is KeyBinding tabKeyBindings && - _acceleratorKeyValidator.Valid(tabKeyBindings.Key)) + kbs.FirstOrDefault() is KeyBinding tabKeyBindings) { LoadKeyBindingsFromModel(defaultProfileItem, tabKeyBindings); } @@ -743,8 +739,7 @@ namespace FluentTerminal.App.ViewModels var command = tab ? nameof(Command.NewSshTab) : nameof(Command.NewSshWindow); if (_keyBindings.TryGetValue(command, out var keyBindings) && - keyBindings.FirstOrDefault() is KeyBinding remoteTabKeyBinding && - _acceleratorKeyValidator.Valid(remoteTabKeyBinding.Key)) + keyBindings.FirstOrDefault() is KeyBinding remoteTabKeyBinding) { LoadKeyBindingsFromModel(remoteConnectItem, remoteTabKeyBinding); } @@ -765,8 +760,7 @@ namespace FluentTerminal.App.ViewModels command = tab ? nameof(Command.NewCustomCommandTab) : nameof(Command.NewCustomCommandWindow); if (_keyBindings.TryGetValue(command, out keyBindings) && - keyBindings.FirstOrDefault() is KeyBinding quickTabKeyBinding && - _acceleratorKeyValidator.Valid(quickTabKeyBinding.Key)) + keyBindings.FirstOrDefault() is KeyBinding quickTabKeyBinding) { LoadKeyBindingsFromModel(quickLaunchItem, quickTabKeyBinding); } @@ -795,13 +789,6 @@ namespace FluentTerminal.App.ViewModels private void LoadKeyBindingsFromModel(MenuItemViewModel menuItemViewModel, KeyBinding keyBinding) { - if (!_acceleratorKeyValidator.Valid(keyBinding.Key)) - { - menuItemViewModel.KeyBinding = null; - - return; - } - if (menuItemViewModel.KeyBinding == null) { menuItemViewModel.KeyBinding = new MenuItemKeyBindingViewModel(keyBinding); diff --git a/FluentTerminal.App.ViewModels/Menu/MenuItemKeyBindingViewModel.cs b/FluentTerminal.App.ViewModels/Menu/MenuItemKeyBindingViewModel.cs index 781cb16..e30874f 100644 --- a/FluentTerminal.App.ViewModels/Menu/MenuItemKeyBindingViewModel.cs +++ b/FluentTerminal.App.ViewModels/Menu/MenuItemKeyBindingViewModel.cs @@ -1,12 +1,15 @@ -using FluentTerminal.Models; +using FluentTerminal.App.Services.Utilities; +using FluentTerminal.Models; +using FluentTerminal.Models.Enums; using GalaSoft.MvvmLight; +using System; +using System.Collections.Generic; +using Windows.System; namespace FluentTerminal.App.ViewModels.Menu { public class MenuItemKeyBindingViewModel : ViewModelBase { - #region Properties - private int _key; public int Key @@ -80,9 +83,21 @@ namespace FluentTerminal.App.ViewModels.Menu } } - #endregion Properties + public bool IsExtendedVirtualKey => !Enum.IsDefined(typeof(VirtualKey), Key); - #region Constructors + public string GetOverrideText() + { + var segments = new List(); + + if (Ctrl) segments.Add("Ctrl"); + if (Alt) segments.Add("Alt"); + if (Windows) segments.Add("Windows"); + if (Shift) segments.Add("Shift"); + + segments.Add(EnumHelper.GetEnumDescription((ExtendedVirtualKey)Key)); + + return string.Join("+", segments); + } public MenuItemKeyBindingViewModel(int key = 0, bool ctrl = false, bool alt = false, bool shift = false, bool windows = false) @@ -101,9 +116,7 @@ namespace FluentTerminal.App.ViewModels.Menu { } - #endregion Constructors - #region Methods private void SetKeyModifiers() { @@ -142,6 +155,5 @@ namespace FluentTerminal.App.ViewModels.Menu return _key == other._key && _keyModifiers == other._keyModifiers; } - #endregion Methods } } \ No newline at end of file diff --git a/FluentTerminal.App/App.xaml.cs b/FluentTerminal.App/App.xaml.cs index 8a5a54f..27780c8 100755 --- a/FluentTerminal.App/App.xaml.cs +++ b/FluentTerminal.App/App.xaml.cs @@ -110,7 +110,6 @@ namespace FluentTerminal.App builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); _container = builder.Build(); diff --git a/FluentTerminal.App/Converters/MenuItemViewModelBaseToMenuFlayoutItemBaseConverter.cs b/FluentTerminal.App/Converters/MenuItemViewModelBaseToMenuFlayoutItemBaseConverter.cs index efeab0f..6d54703 100644 --- a/FluentTerminal.App/Converters/MenuItemViewModelBaseToMenuFlayoutItemBaseConverter.cs +++ b/FluentTerminal.App/Converters/MenuItemViewModelBaseToMenuFlayoutItemBaseConverter.cs @@ -7,6 +7,7 @@ using Windows.UI.Xaml.Input; using FluentTerminal.App.ViewModels.Menu; using FluentTerminal.App.Views; using Microsoft.UI.Xaml.Controls; +using Windows.Foundation.Metadata; // ReSharper disable LocalizableElement @@ -90,12 +91,22 @@ namespace FluentTerminal.App.Converters if (viewModel.KeyBinding != null) { - item.KeyboardAccelerators?.Add(new KeyboardAccelerator + if (viewModel.KeyBinding.IsExtendedVirtualKey) { - Key = (VirtualKey) viewModel.KeyBinding.Key, - Modifiers = (VirtualKeyModifiers) viewModel.KeyBinding.KeyModifiers, - IsEnabled = true - }); + if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 6)) + { + item.KeyboardAcceleratorTextOverride = viewModel.KeyBinding.GetOverrideText(); + } + } + else + { + item.KeyboardAccelerators?.Add(new KeyboardAccelerator + { + Key = (VirtualKey)viewModel.KeyBinding.Key, + Modifiers = (VirtualKeyModifiers)viewModel.KeyBinding.KeyModifiers, + IsEnabled = true + }); + } } return item; diff --git a/FluentTerminal.App/Dialogs/CreateKeyBindingDialog.xaml.cs b/FluentTerminal.App/Dialogs/CreateKeyBindingDialog.xaml.cs index 2923e0a..7240859 100644 --- a/FluentTerminal.App/Dialogs/CreateKeyBindingDialog.xaml.cs +++ b/FluentTerminal.App/Dialogs/CreateKeyBindingDialog.xaml.cs @@ -16,8 +16,6 @@ namespace FluentTerminal.App.Dialogs // ReSharper disable once RedundantExtendsListEntry public sealed partial class CreateKeyBindingDialog : ContentDialog, ICreateKeyBindingDialog, INotifyPropertyChanged { - private readonly IAcceleratorKeyValidator _acceleratorKeyValidator; - private bool _ctrl; private bool _shift; private bool _alt; @@ -53,17 +51,12 @@ namespace FluentTerminal.App.Dialogs get => _key; set { - // We're ignoring invalid keys. - if (_acceleratorKeyValidator.Valid(value)) - { - Set(ref _key, value); - } + Set(ref _key, value); } } - public CreateKeyBindingDialog(IAcceleratorKeyValidator acceleratorKeyValidator) + public CreateKeyBindingDialog() { - _acceleratorKeyValidator = acceleratorKeyValidator; InitializeComponent(); ResetCommand = new RelayCommand(Reset); PreviewKeyDown += RegisterKeyBindingDialog_PreviewKeyDown; diff --git a/FluentTerminal.App/FluentTerminal.App.csproj b/FluentTerminal.App/FluentTerminal.App.csproj index f72c2f1..0e054cf 100644 --- a/FluentTerminal.App/FluentTerminal.App.csproj +++ b/FluentTerminal.App/FluentTerminal.App.csproj @@ -133,7 +133,6 @@ AboutDialog.xaml - diff --git a/FluentTerminal.App/Services/AcceleratorKeyValidator.cs b/FluentTerminal.App/Services/AcceleratorKeyValidator.cs deleted file mode 100644 index 26ec37c..0000000 --- a/FluentTerminal.App/Services/AcceleratorKeyValidator.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using Windows.System; -using FluentTerminal.Models.Enums; - -namespace FluentTerminal.App.Services -{ - public class AcceleratorKeyValidator : IAcceleratorKeyValidator - { - public bool Valid(int key) => Enum.IsDefined(typeof(VirtualKey), key); - - public bool Valid(ExtendedVirtualKey key) => Valid((int) key); - } -} \ No newline at end of file