From c4fcd986c0cfec698b965f92cdbd057db7166563 Mon Sep 17 00:00:00 2001 From: Eric Cornelissen Date: Thu, 28 Feb 2019 20:24:18 +0200 Subject: [PATCH] Add keybinding for configurable new window (#216) * Add keybind to open new configurable window * Close new configurable window on cancel * renamed event args --- .../EventArgs/NewWindowRequestedEventArgs.cs | 7 ++++++ .../Implementation/DefaultValueProvider.cs | 13 ++++++++++ .../MainViewModel.cs | 24 +++++++++++++++---- FluentTerminal.App/App.xaml.cs | 19 ++++++++------- FluentTerminal.Models/Enums/Command.cs | 3 +++ FluentTerminal.Models/KeyBindings.cs | 1 + 6 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 FluentTerminal.App.Services/EventArgs/NewWindowRequestedEventArgs.cs diff --git a/FluentTerminal.App.Services/EventArgs/NewWindowRequestedEventArgs.cs b/FluentTerminal.App.Services/EventArgs/NewWindowRequestedEventArgs.cs new file mode 100644 index 0000000..ca85101 --- /dev/null +++ b/FluentTerminal.App.Services/EventArgs/NewWindowRequestedEventArgs.cs @@ -0,0 +1,7 @@ +namespace FluentTerminal.App.Services.EventArgs +{ + public class NewWindowRequestedEventArgs : System.EventArgs + { + public bool ShowProfileSelection { get; set; } + } +} \ No newline at end of file diff --git a/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs b/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs index 9e974a0..08d73aa 100644 --- a/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs +++ b/FluentTerminal.App.Services/Implementation/DefaultValueProvider.cs @@ -156,6 +156,19 @@ namespace FluentTerminal.App.Services.Implementation } }; + case Command.ConfigurableNewWindow: + return new List + { + new KeyBinding + { + Command = nameof(Command.ConfigurableNewWindow), + Ctrl = true, + Alt = false, + Shift = true, + Key = (int)ExtendedVirtualKey.N + } + }; + case Command.ShowSettings: return new List { diff --git a/FluentTerminal.App.ViewModels/MainViewModel.cs b/FluentTerminal.App.ViewModels/MainViewModel.cs index 6a3048d..4a07871 100644 --- a/FluentTerminal.App.ViewModels/MainViewModel.cs +++ b/FluentTerminal.App.ViewModels/MainViewModel.cs @@ -60,7 +60,9 @@ namespace FluentTerminal.App.ViewModels _keyboardCommandService.RegisterCommandHandler(nameof(Command.NextTab), SelectNextTab); _keyboardCommandService.RegisterCommandHandler(nameof(Command.PreviousTab), SelectPreviousTab); - _keyboardCommandService.RegisterCommandHandler(nameof(Command.NewWindow), NewWindow); + _keyboardCommandService.RegisterCommandHandler(nameof(Command.NewWindow), () => NewWindow(false)); + _keyboardCommandService.RegisterCommandHandler(nameof(Command.ConfigurableNewWindow), () => NewWindow(true)); + _keyboardCommandService.RegisterCommandHandler(nameof(Command.ShowSettings), ShowSettings); _keyboardCommandService.RegisterCommandHandler(nameof(Command.ToggleFullScreen), ToggleFullScreen); @@ -102,7 +104,7 @@ namespace FluentTerminal.App.ViewModels public event EventHandler Closed; - public event EventHandler NewWindowRequested; + public event EventHandler NewWindowRequested; public event EventHandler ShowSettingsRequested; @@ -180,13 +182,20 @@ namespace FluentTerminal.App.ViewModels if (profile == null) { + if (Terminals.Count == 0) + { + Closed?.Invoke(this, EventArgs.Empty); + _applicationView.TryClose(); + } + return; } } else if (profileId == Guid.Empty) { profile = _settingsService.GetDefaultShellProfile(); - } else + } + else { profile = _settingsService.GetShellProfile(profileId); } @@ -213,9 +222,14 @@ namespace FluentTerminal.App.ViewModels SelectedTerminal?.CloseCommand.Execute(null); } - private void NewWindow() + private void NewWindow(bool showProfileSelection) { - NewWindowRequested?.Invoke(this, EventArgs.Empty); + var args = new NewWindowRequestedEventArgs + { + ShowProfileSelection = showProfileSelection + }; + + NewWindowRequested?.Invoke(this, args); } private async void OnApplicationSettingsChanged(object sender, ApplicationSettings e) diff --git a/FluentTerminal.App/App.xaml.cs b/FluentTerminal.App/App.xaml.cs index 246977a..16f003c 100644 --- a/FluentTerminal.App/App.xaml.cs +++ b/FluentTerminal.App/App.xaml.cs @@ -4,6 +4,7 @@ using FluentTerminal.App.Dialogs; using FluentTerminal.App.Services; using FluentTerminal.App.Services.Adapters; using FluentTerminal.App.Services.Dialogs; +using FluentTerminal.App.Services.EventArgs; using FluentTerminal.App.Services.Implementation; using FluentTerminal.App.ViewModels; using FluentTerminal.App.Views; @@ -119,7 +120,7 @@ namespace FluentTerminal.App } else { - await CreateNewTerminalWindow(parameter).ConfigureAwait(true); + await CreateNewTerminalWindow(parameter, false).ConfigureAwait(true); } } } @@ -151,7 +152,7 @@ namespace FluentTerminal.App } else if (_mainViewModels.Count == 0) { - await CreateSecondaryView(typeof(MainPage), true, string.Empty).ConfigureAwait(true); + await CreateSecondaryView(typeof(MainPage), true, false, string.Empty).ConfigureAwait(true); } } @@ -212,13 +213,13 @@ namespace FluentTerminal.App Window.Current.Activate(); } - private async Task CreateNewTerminalWindow(string startupDirectory) + private async Task CreateNewTerminalWindow(string startupDirectory, bool showProfileSelection) { - var id = await CreateSecondaryView(typeof(MainPage), true, startupDirectory).ConfigureAwait(true); + var id = await CreateSecondaryView(typeof(MainPage), true, showProfileSelection, startupDirectory).ConfigureAwait(true); await ApplicationViewSwitcher.TryShowAsStandaloneAsync(id); } - private async Task CreateSecondaryView(Type pageType, bool ExtendViewIntoTitleBar, object parameter) + private async Task CreateSecondaryView(Type pageType, bool ExtendViewIntoTitleBar, bool showProfileSelection, object parameter) { int windowId = 0; TViewModel viewModel = default; @@ -242,7 +243,7 @@ namespace FluentTerminal.App mainViewModel.ShowSettingsRequested += OnShowSettingsRequested; mainViewModel.ShowAboutRequested += OnShowAboutRequested; _mainViewModels.Add(mainViewModel); - await mainViewModel.AddTerminal(directory, false, Guid.Empty).ConfigureAwait(true); + await mainViewModel.AddTerminal(directory, showProfileSelection, Guid.Empty).ConfigureAwait(true); } if (viewModel is SettingsViewModel settingsViewModel) @@ -271,9 +272,9 @@ namespace FluentTerminal.App } } - private async void OnNewWindowRequested(object sender, EventArgs e) + private async void OnNewWindowRequested(object sender, NewWindowRequestedEventArgs e) { - await CreateNewTerminalWindow(string.Empty).ConfigureAwait(true); + await CreateNewTerminalWindow(string.Empty, e.ShowProfileSelection).ConfigureAwait(true); } private void OnSettingsClosed(object sender, EventArgs e) @@ -303,7 +304,7 @@ namespace FluentTerminal.App { if (_settingsViewModel == null) { - _settingsWindowId = await CreateSecondaryView(typeof(SettingsPage), true, null).ConfigureAwait(true); + _settingsWindowId = await CreateSecondaryView(typeof(SettingsPage), true, false, null).ConfigureAwait(true); } await ApplicationViewSwitcher.TryShowAsStandaloneAsync(_settingsWindowId.Value); } diff --git a/FluentTerminal.Models/Enums/Command.cs b/FluentTerminal.Models/Enums/Command.cs index 34a5c51..ddab658 100644 --- a/FluentTerminal.Models/Enums/Command.cs +++ b/FluentTerminal.Models/Enums/Command.cs @@ -28,6 +28,9 @@ namespace FluentTerminal.Models.Enums [Description("New window")] NewWindow, + [Description("Configurable new window")] + ConfigurableNewWindow, + [Description("Show settings")] ShowSettings, diff --git a/FluentTerminal.Models/KeyBindings.cs b/FluentTerminal.Models/KeyBindings.cs index e4d04f5..08118cf 100644 --- a/FluentTerminal.Models/KeyBindings.cs +++ b/FluentTerminal.Models/KeyBindings.cs @@ -12,6 +12,7 @@ namespace FluentTerminal.Models public ICollection ChangeTabTitle { get; set; } public ICollection CloseTab { get; set; } public ICollection NewWindow { get; set; } + public ICollection ConfigurableNewWindow { get; set; } public ICollection ShowSettings { get; set; } public ICollection Copy { get; set; } public ICollection Paste { get; set; }