* Added new command wrapper, abstracts static and dynamic commands - All uses of the `Command` are replaced with either `AppCommand`, for a command that is static to the scope of the application, or a reference to an ICommand (specifically, an `EnumCommand<AppCommand>()` instance), which provides the abstract wrapper. - Functionality seems intact. - Next step is to have the MainViewModel add the per-shell commands via SettingsService.CreateShellKeyboardShortcuts(), and have the SettingsService.ParseCommandString() function parse the command strings passed around properly. - Finally, add the keyboard chord input to each shell's settings page. * First kick at adding a new terminal keyboard command. - It isn't presented anywhere, but references to keybindings should be using the ICommand key as their identifier for recognizing anything, and when xterm passes back a keyboard command event, the SettingsService is asked to convert the string into an ICommand. * Renaming ICommand to Command. It's not longer an interface, so this makes more sense. * Renaming back to Command, and new class is AbstractCommand. Going to simplify the PR diff considerably. * Shortcuts for default shells work. Need to get the shell profile edit UI elements working. * Added keyboard shortcut UI elements to shell profile pages. * New and deleted shell profiles propagate to all terminal views. * A bit of cleanup. * Camel-casing command text to fix Ctrl+C and copy behaviour. * Fixed failing test. The new on disk store uses a .ToString(), not the Enum description, since the command isn't an Enum, it's a class now in general, and those semantics make more sense. * Adding default value for null keybindings in shell profiles. * Merge branch 'shell_commands' of https://github.com/Riebart/FluentTerminal into pr/85 Improved default value for keybinding property * Renamed KeyBinding collection to KeyBindings * Use strings as Command parameter of KeyBinding * Added missing Commands to keyBindings of default shellProfiles * fix build and unit tests after merge with master * improve UI * Split OnShellProfileCollectionChanged event
87 lines
3.5 KiB
C#
87 lines
3.5 KiB
C#
using FluentTerminal.App.Services;
|
|
using FluentTerminal.App.Services.Utilities;
|
|
using FluentTerminal.Models;
|
|
using FluentTerminal.Models.Enums;
|
|
using GalaSoft.MvvmLight;
|
|
using GalaSoft.MvvmLight.Command;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace FluentTerminal.App.ViewModels.Settings
|
|
{
|
|
public class KeyBindingsPageViewModel : ViewModelBase
|
|
{
|
|
private readonly IDefaultValueProvider _defaultValueProvider;
|
|
private readonly IDialogService _dialogService;
|
|
private readonly ISettingsService _settingsService;
|
|
private readonly ITrayProcessCommunicationService _trayProcessCommunicationService;
|
|
private IDictionary<string, ICollection<KeyBinding>> _keyBindings;
|
|
|
|
public KeyBindingsPageViewModel(ISettingsService settingsService, IDialogService dialogService, IDefaultValueProvider defaultValueProvider, ITrayProcessCommunicationService trayProcessCommunicationService)
|
|
{
|
|
_settingsService = settingsService;
|
|
_dialogService = dialogService;
|
|
_defaultValueProvider = defaultValueProvider;
|
|
_trayProcessCommunicationService = trayProcessCommunicationService;
|
|
RestoreDefaultsCommand = new RelayCommand(async () => await RestoreDefaults().ConfigureAwait(false));
|
|
AddCommand = new RelayCommand<string>(async command => await Add(command).ConfigureAwait(false));
|
|
|
|
Initialize(_settingsService.GetCommandKeyBindings());
|
|
}
|
|
|
|
public RelayCommand<string> AddCommand { get; }
|
|
public ObservableCollection<KeyBindingsViewModel> KeyBindings { get; } = new ObservableCollection<KeyBindingsViewModel>();
|
|
public RelayCommand RestoreDefaultsCommand { get; }
|
|
|
|
private async Task Add(string command)
|
|
{
|
|
var keyBinding = KeyBindings.FirstOrDefault(k => k.Command == command);
|
|
await keyBinding?.ShowAddKeyBindingDialog();
|
|
}
|
|
|
|
private void ClearKeyBindings()
|
|
{
|
|
foreach (var keyBinding in KeyBindings)
|
|
{
|
|
keyBinding.Edited -= OnEdited;
|
|
}
|
|
|
|
KeyBindings.Clear();
|
|
}
|
|
|
|
private void Initialize(IDictionary<string, ICollection<KeyBinding>> keyBindings)
|
|
{
|
|
_keyBindings = keyBindings;
|
|
|
|
ClearKeyBindings();
|
|
|
|
foreach (var value in Enum.GetValues(typeof(Command)))
|
|
{
|
|
var command = (Command)value;
|
|
var viewModel = new KeyBindingsViewModel(command.ToString(), _keyBindings[command.ToString()], _dialogService, EnumHelper.GetEnumDescription(command), true);
|
|
viewModel.Edited += OnEdited;
|
|
KeyBindings.Add(viewModel);
|
|
}
|
|
}
|
|
|
|
private void OnEdited(string command, ICollection<KeyBinding> keyBindings)
|
|
{
|
|
_settingsService.SaveKeyBindings(command, keyBindings);
|
|
_trayProcessCommunicationService.UpdateToggleWindowKeyBindings();
|
|
}
|
|
|
|
private async Task RestoreDefaults()
|
|
{
|
|
var result = await _dialogService.ShowMessageDialogAsnyc("Please confirm", "Are you sure you want to restore the default keybindings?", DialogButton.OK, DialogButton.Cancel).ConfigureAwait(true);
|
|
|
|
if (result == DialogButton.OK)
|
|
{
|
|
_settingsService.ResetKeyBindings();
|
|
Initialize(_settingsService.GetCommandKeyBindings());
|
|
}
|
|
}
|
|
}
|
|
} |