From 79e50b4d8f605fd29577e696eec4546cd2d045f7 Mon Sep 17 00:00:00 2001 From: Tig Date: Fri, 2 Aug 2024 13:41:53 -0600 Subject: [PATCH] Nuked AlternateFwd/BkKeys. Added Next/PrevTabGroupKey. Fixed tests. --- .../Application/Application.Keyboard.cs | 44 ++++++------ Terminal.Gui/Application/Application.cs | 4 +- Terminal.Gui/Resources/config.json | 4 +- Terminal.Gui/View/View.Navigation.cs | 4 +- UnitTests/Application/ApplicationTests.cs | 8 +-- UnitTests/Application/KeyboardTests.cs | 68 +++++++------------ .../Configuration/ConfigurationMangerTests.cs | 40 +++++------ UnitTests/Configuration/SettingsScopeTests.cs | 29 ++++---- UnitTests/View/NavigationTests.cs | 36 +++++----- UnitTests/Views/OverlappedTests.cs | 12 ++-- UnitTests/Views/TextViewTests.cs | 8 +-- UnitTests/Views/ToplevelTests.cs | 12 ++-- docfx/docs/config.md | 12 ++-- docfx/docs/keyboard.md | 2 + 14 files changed, 133 insertions(+), 150 deletions(-) diff --git a/Terminal.Gui/Application/Application.Keyboard.cs b/Terminal.Gui/Application/Application.Keyboard.cs index 4e9d6f73f..c7a5f8b50 100644 --- a/Terminal.Gui/Application/Application.Keyboard.cs +++ b/Terminal.Gui/Application/Application.Keyboard.cs @@ -6,55 +6,55 @@ namespace Terminal.Gui; public static partial class Application // Keyboard handling { - private static Key _alternateForwardKey = Key.Empty; // Defined in config.json + private static Key _nextTabGroupKey = Key.Empty; // Defined in config.json /// Alternative key to navigate forwards through views. Ctrl+Tab is the primary key. [SerializableConfigurationProperty (Scope = typeof (SettingsScope))] [JsonConverter (typeof (KeyJsonConverter))] - public static Key AlternateForwardKey + public static Key NextTabGroupKey { - get => _alternateForwardKey; + get => _nextTabGroupKey; set { - if (_alternateForwardKey != value) + if (_nextTabGroupKey != value) { - Key oldKey = _alternateForwardKey; - _alternateForwardKey = value; + Key oldKey = _nextTabGroupKey; + _nextTabGroupKey = value; - if (_alternateForwardKey == Key.Empty) + if (_nextTabGroupKey == Key.Empty) { - KeyBindings.Remove (_alternateForwardKey); + KeyBindings.Remove (_nextTabGroupKey); } else { - KeyBindings.ReplaceKey (oldKey, _alternateForwardKey); + KeyBindings.ReplaceKey (oldKey, _nextTabGroupKey); } } } } - private static Key _alternateBackwardKey = Key.Empty; // Defined in config.json + private static Key _prevTabGroupKey = Key.Empty; // Defined in config.json /// Alternative key to navigate backwards through views. Shift+Ctrl+Tab is the primary key. [SerializableConfigurationProperty (Scope = typeof (SettingsScope))] [JsonConverter (typeof (KeyJsonConverter))] - public static Key AlternateBackwardKey + public static Key PrevTabGroupKey { - get => _alternateBackwardKey; + get => _prevTabGroupKey; set { - if (_alternateBackwardKey != value) + if (_prevTabGroupKey != value) { - Key oldKey = _alternateBackwardKey; - _alternateBackwardKey = value; + Key oldKey = _prevTabGroupKey; + _prevTabGroupKey = value; - if (_alternateBackwardKey == Key.Empty) + if (_prevTabGroupKey == Key.Empty) { - KeyBindings.Remove (_alternateBackwardKey); + KeyBindings.Remove (_prevTabGroupKey); } else { - KeyBindings.ReplaceKey (oldKey, _alternateBackwardKey); + KeyBindings.ReplaceKey (oldKey, _prevTabGroupKey); } } } @@ -372,16 +372,14 @@ public static partial class Application // Keyboard handling KeyBindings.Add (Key.CursorDown, KeyBindingScope.Application, Command.NextView); KeyBindings.Add (Key.CursorLeft, KeyBindingScope.Application, Command.PreviousView); KeyBindings.Add (Key.CursorUp, KeyBindingScope.Application, Command.PreviousView); - KeyBindings.Add (Key.Tab, KeyBindingScope.Application, Command.NextView); KeyBindings.Add (Key.Tab.WithShift, KeyBindingScope.Application, Command.PreviousView); - KeyBindings.Add (Key.Tab.WithCtrl, KeyBindingScope.Application, Command.NextViewOrTop); - KeyBindings.Add (Key.Tab.WithShift.WithCtrl, KeyBindingScope.Application, Command.PreviousViewOrTop); + + KeyBindings.Add (Application.NextTabGroupKey, KeyBindingScope.Application, Command.NextViewOrTop); // Needed on Unix + KeyBindings.Add (Application.PrevTabGroupKey, KeyBindingScope.Application, Command.PreviousViewOrTop); // Needed on Unix // TODO: Refresh Key should be configurable KeyBindings.Add (Key.F5, KeyBindingScope.Application, Command.Refresh); - KeyBindings.Add (Application.AlternateForwardKey, KeyBindingScope.Application, Command.NextViewOrTop); // Needed on Unix - KeyBindings.Add (Application.AlternateBackwardKey, KeyBindingScope.Application, Command.PreviousViewOrTop); // Needed on Unix if (Environment.OSVersion.Platform == PlatformID.Unix) { diff --git a/Terminal.Gui/Application/Application.cs b/Terminal.Gui/Application/Application.cs index 21605b145..b2d2f9c59 100644 --- a/Terminal.Gui/Application/Application.cs +++ b/Terminal.Gui/Application/Application.cs @@ -142,8 +142,8 @@ public static partial class Application UnGrabbedMouse = null; // Keyboard - AlternateBackwardKey = Key.Empty; - AlternateForwardKey = Key.Empty; + PrevTabGroupKey = Key.Empty; + NextTabGroupKey = Key.Empty; QuitKey = Key.Empty; KeyDown = null; KeyUp = null; diff --git a/Terminal.Gui/Resources/config.json b/Terminal.Gui/Resources/config.json index e3c1ac3dd..688537779 100644 --- a/Terminal.Gui/Resources/config.json +++ b/Terminal.Gui/Resources/config.json @@ -17,8 +17,8 @@ // to throw exceptions. "ConfigurationManager.ThrowOnJsonErrors": false, - "Application.AlternateBackwardKey": "Ctrl+PageUp", - "Application.AlternateForwardKey": "Ctrl+PageDown", + "Application.NextTabGroupKey": "F6", + "Application.PrevTabGroupKey": "Shift+F6", "Application.QuitKey": "Esc", "Theme": "Default", diff --git a/Terminal.Gui/View/View.Navigation.cs b/Terminal.Gui/View/View.Navigation.cs index 4471705d5..bc825d125 100644 --- a/Terminal.Gui/View/View.Navigation.cs +++ b/Terminal.Gui/View/View.Navigation.cs @@ -818,10 +818,10 @@ public partial class View // Focus and cross-view navigation management (TabStop /// focus even if this property is set and vice-versa. /// /// - /// The default keys are Key.Tab and Key>Tab.WithShift. + /// The default keys are (Key.Tab) and (Key>Tab.WithShift). /// /// - /// The default keys are Key.Tab.WithCtrl and Key>Key.Tab.WithCtrl.WithShift. + /// The default keys are (Key.F6) and (Key>Key.F6.WithShift). /// /// public TabBehavior? TabStop diff --git a/UnitTests/Application/ApplicationTests.cs b/UnitTests/Application/ApplicationTests.cs index 9281a3420..268eebcd6 100644 --- a/UnitTests/Application/ApplicationTests.cs +++ b/UnitTests/Application/ApplicationTests.cs @@ -183,8 +183,8 @@ public class ApplicationTests Assert.Null (Application.Driver); Assert.Null (Application.MainLoop); Assert.False (Application.EndAfterFirstIteration); - Assert.Equal (Key.Empty, Application.AlternateBackwardKey); - Assert.Equal (Key.Empty, Application.AlternateForwardKey); + Assert.Equal (Key.Empty, Application.PrevTabGroupKey); + Assert.Equal (Key.Empty, Application.NextTabGroupKey); Assert.Equal (Key.Empty, Application.QuitKey); Assert.Null (ApplicationOverlapped.OverlappedChildren); Assert.Null (ApplicationOverlapped.OverlappedTop); @@ -230,8 +230,8 @@ public class ApplicationTests //Application.ForceDriver = "driver"; Application.EndAfterFirstIteration = true; - Application.AlternateBackwardKey = Key.A; - Application.AlternateForwardKey = Key.B; + Application.PrevTabGroupKey = Key.A; + Application.NextTabGroupKey = Key.B; Application.QuitKey = Key.C; Application.KeyBindings.Add (Key.A, KeyBindingScope.Application, Command.Cancel); diff --git a/UnitTests/Application/KeyboardTests.cs b/UnitTests/Application/KeyboardTests.cs index f2dbd693f..899420d94 100644 --- a/UnitTests/Application/KeyboardTests.cs +++ b/UnitTests/Application/KeyboardTests.cs @@ -178,7 +178,7 @@ public class KeyboardTests } [Fact (Skip = "Replace when new key statics are added.")] - public void AlternateForwardKey_AlternateBackwardKey_Tests () + public void NextTabGroupKey_PrevTabGroupKey_Tests () { Application.Init (new FakeDriver ()); @@ -200,45 +200,27 @@ public class KeyboardTests Assert.True (v1.HasFocus); // Using default keys. - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.True (v2.HasFocus); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.True (v3.HasFocus); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.True (v4.HasFocus); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.True (v1.HasFocus); - Application.OnKeyDown (Key.Tab.WithShift.WithCtrl); + Application.OnKeyDown (Key.F6.WithShift); Assert.True (v4.HasFocus); - Application.OnKeyDown (Key.Tab.WithShift.WithCtrl); + Application.OnKeyDown (Key.F6.WithShift); Assert.True (v3.HasFocus); - Application.OnKeyDown (Key.Tab.WithShift.WithCtrl); + Application.OnKeyDown (Key.F6.WithShift); Assert.True (v2.HasFocus); - Application.OnKeyDown (Key.Tab.WithShift.WithCtrl); + Application.OnKeyDown (Key.F6.WithShift); Assert.True (v1.HasFocus); - - Application.OnKeyDown (Key.PageDown.WithCtrl); - Assert.True (v2.HasFocus); - Application.OnKeyDown (Key.PageDown.WithCtrl); - Assert.True (v3.HasFocus); - Application.OnKeyDown (Key.PageDown.WithCtrl); - Assert.True (v4.HasFocus); - Application.OnKeyDown (Key.PageDown.WithCtrl); - Assert.True (v1.HasFocus); - - Application.OnKeyDown (Key.PageUp.WithCtrl); - Assert.True (v4.HasFocus); - Application.OnKeyDown (Key.PageUp.WithCtrl); - Assert.True (v3.HasFocus); - Application.OnKeyDown (Key.PageUp.WithCtrl); - Assert.True (v2.HasFocus); - Application.OnKeyDown (Key.PageUp.WithCtrl); - Assert.True (v1.HasFocus); - - // Using another's alternate keys. - Application.AlternateForwardKey = Key.F7; - Application.AlternateBackwardKey = Key.F6; + + // Using alternate keys. + Application.NextTabGroupKey = Key.F7; + Application.PrevTabGroupKey = Key.F8; Application.OnKeyDown (Key.F7); Assert.True (v2.HasFocus); @@ -249,13 +231,13 @@ public class KeyboardTests Application.OnKeyDown (Key.F7); Assert.True (v1.HasFocus); - Application.OnKeyDown (Key.F6); + Application.OnKeyDown (Key.F8); Assert.True (v4.HasFocus); - Application.OnKeyDown (Key.F6); + Application.OnKeyDown (Key.F8); Assert.True (v3.HasFocus); - Application.OnKeyDown (Key.F6); + Application.OnKeyDown (Key.F8); Assert.True (v2.HasFocus); - Application.OnKeyDown (Key.F6); + Application.OnKeyDown (Key.F8); Assert.True (v1.HasFocus); Application.RequestStop (); @@ -264,12 +246,12 @@ public class KeyboardTests Application.Run (top); // Replacing the defaults keys to avoid errors on others unit tests that are using it. - Application.AlternateForwardKey = Key.PageDown.WithCtrl; - Application.AlternateBackwardKey = Key.PageUp.WithCtrl; + Application.NextTabGroupKey = Key.PageDown.WithCtrl; + Application.PrevTabGroupKey = Key.PageUp.WithCtrl; Application.QuitKey = Key.Q.WithCtrl; - Assert.Equal (KeyCode.PageDown | KeyCode.CtrlMask, Application.AlternateForwardKey.KeyCode); - Assert.Equal (KeyCode.PageUp | KeyCode.CtrlMask, Application.AlternateBackwardKey.KeyCode); + Assert.Equal (KeyCode.PageDown | KeyCode.CtrlMask, Application.NextTabGroupKey.KeyCode); + Assert.Equal (KeyCode.PageUp | KeyCode.CtrlMask, Application.PrevTabGroupKey.KeyCode); Assert.Equal (KeyCode.Q | KeyCode.CtrlMask, Application.QuitKey.KeyCode); top.Dispose (); @@ -321,14 +303,14 @@ public class KeyboardTests Assert.True (win2.HasFocus); Assert.Equal ("win2", ((Window)top.Subviews [^1]).Title); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.True (win2.CanFocus); Assert.False (win.HasFocus); Assert.True (win2.CanFocus); Assert.True (win2.HasFocus); Assert.Equal ("win2", ((Window)top.Subviews [^1]).Title); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.False (win.CanFocus); Assert.False (win.HasFocus); Assert.True (win2.CanFocus); @@ -374,14 +356,14 @@ public class KeyboardTests Assert.False (win2.HasFocus); Assert.Equal ("win", ((Window)top.Subviews [^1]).Title); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.True (win.CanFocus); Assert.False (win.HasFocus); Assert.True (win2.CanFocus); Assert.True (win2.HasFocus); Assert.Equal ("win2", ((Window)top.Subviews [^1]).Title); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.True (win.CanFocus); Assert.True (win.HasFocus); Assert.True (win2.CanFocus); diff --git a/UnitTests/Configuration/ConfigurationMangerTests.cs b/UnitTests/Configuration/ConfigurationMangerTests.cs index 7d46a5630..22729d846 100644 --- a/UnitTests/Configuration/ConfigurationMangerTests.cs +++ b/UnitTests/Configuration/ConfigurationMangerTests.cs @@ -33,14 +33,14 @@ public class ConfigurationManagerTests // assert Assert.Equal (KeyCode.Q, Application.QuitKey.KeyCode); - Assert.Equal (KeyCode.F, Application.AlternateForwardKey.KeyCode); - Assert.Equal (KeyCode.B, Application.AlternateBackwardKey.KeyCode); + Assert.Equal (KeyCode.F, Application.NextTabGroupKey.KeyCode); + Assert.Equal (KeyCode.B, Application.PrevTabGroupKey.KeyCode); } // act Settings ["Application.QuitKey"].PropertyValue = Key.Q; - Settings ["Application.AlternateForwardKey"].PropertyValue = Key.F; - Settings ["Application.AlternateBackwardKey"].PropertyValue = Key.B; + Settings ["Application.NextTabGroupKey"].PropertyValue = Key.F; + Settings ["Application.PrevTabGroupKey"].PropertyValue = Key.B; Apply (); @@ -152,8 +152,8 @@ public class ConfigurationManagerTests Reset (); Settings ["Application.QuitKey"].PropertyValue = Key.Q; - Settings ["Application.AlternateForwardKey"].PropertyValue = Key.F; - Settings ["Application.AlternateBackwardKey"].PropertyValue = Key.B; + Settings ["Application.NextTabGroupKey"].PropertyValue = Key.F; + Settings ["Application.PrevTabGroupKey"].PropertyValue = Key.B; Updated += ConfigurationManager_Updated; var fired = false; @@ -166,13 +166,13 @@ public class ConfigurationManagerTests Assert.Equal (Key.Esc, ((Key)Settings ["Application.QuitKey"].PropertyValue).KeyCode); Assert.Equal ( - KeyCode.PageDown | KeyCode.CtrlMask, - ((Key)Settings ["Application.AlternateForwardKey"].PropertyValue).KeyCode + KeyCode.F6, + ((Key)Settings ["Application.NextTabGroupKey"].PropertyValue).KeyCode ); Assert.Equal ( - KeyCode.PageUp | KeyCode.CtrlMask, - ((Key)Settings ["Application.AlternateBackwardKey"].PropertyValue).KeyCode + KeyCode.F6 | KeyCode.ShiftMask, + ((Key)Settings ["Application.PrevTabGroupKey"].PropertyValue).KeyCode ); } @@ -229,14 +229,14 @@ public class ConfigurationManagerTests // arrange Reset (); Settings ["Application.QuitKey"].PropertyValue = Key.Q; - Settings ["Application.AlternateForwardKey"].PropertyValue = Key.F; - Settings ["Application.AlternateBackwardKey"].PropertyValue = Key.B; + Settings ["Application.NextTabGroupKey"].PropertyValue = Key.F; + Settings ["Application.PrevTabGroupKey"].PropertyValue = Key.B; Settings.Apply (); // assert apply worked Assert.Equal (KeyCode.Q, Application.QuitKey.KeyCode); - Assert.Equal (KeyCode.F, Application.AlternateForwardKey.KeyCode); - Assert.Equal (KeyCode.B, Application.AlternateBackwardKey.KeyCode); + Assert.Equal (KeyCode.F, Application.NextTabGroupKey.KeyCode); + Assert.Equal (KeyCode.B, Application.PrevTabGroupKey.KeyCode); //act Reset (); @@ -245,13 +245,13 @@ public class ConfigurationManagerTests Assert.NotEmpty (Themes); Assert.Equal ("Default", Themes.Theme); Assert.Equal (Key.Esc, Application.QuitKey); - Assert.Equal (KeyCode.PageDown | KeyCode.CtrlMask, Application.AlternateForwardKey.KeyCode); - Assert.Equal (KeyCode.PageUp | KeyCode.CtrlMask, Application.AlternateBackwardKey.KeyCode); + Assert.Equal (Key.F6, Application.NextTabGroupKey); + Assert.Equal (Key.F6.WithShift, Application.PrevTabGroupKey); // arrange Settings ["Application.QuitKey"].PropertyValue = Key.Q; - Settings ["Application.AlternateForwardKey"].PropertyValue = Key.F; - Settings ["Application.AlternateBackwardKey"].PropertyValue = Key.B; + Settings ["Application.NextTabGroupKey"].PropertyValue = Key.F; + Settings ["Application.PrevTabGroupKey"].PropertyValue = Key.B; Settings.Apply (); Locations = ConfigLocations.DefaultOnly; @@ -264,8 +264,8 @@ public class ConfigurationManagerTests Assert.NotEmpty (Themes); Assert.Equal ("Default", Themes.Theme); Assert.Equal (KeyCode.Esc, Application.QuitKey.KeyCode); - Assert.Equal (KeyCode.PageDown | KeyCode.CtrlMask, Application.AlternateForwardKey.KeyCode); - Assert.Equal (KeyCode.PageUp | KeyCode.CtrlMask, Application.AlternateBackwardKey.KeyCode); + Assert.Equal (Key.F6, Application.NextTabGroupKey); + Assert.Equal (Key.F6.WithShift, Application.PrevTabGroupKey); Reset (); } diff --git a/UnitTests/Configuration/SettingsScopeTests.cs b/UnitTests/Configuration/SettingsScopeTests.cs index fb0c6d1d8..5525e530a 100644 --- a/UnitTests/Configuration/SettingsScopeTests.cs +++ b/UnitTests/Configuration/SettingsScopeTests.cs @@ -12,26 +12,26 @@ public class SettingsScopeTests Assert.Equal (Key.Esc, (Key)Settings ["Application.QuitKey"].PropertyValue); Assert.Equal ( - KeyCode.PageDown | KeyCode.CtrlMask, - ((Key)Settings ["Application.AlternateForwardKey"].PropertyValue).KeyCode + Key.F6, + (Key)Settings ["Application.NextTabGroupKey"].PropertyValue ); Assert.Equal ( - KeyCode.PageUp | KeyCode.CtrlMask, - ((Key)Settings ["Application.AlternateBackwardKey"].PropertyValue).KeyCode + Key.F6.WithShift, + (Key)Settings["Application.PrevTabGroupKey"].PropertyValue ); // act Settings ["Application.QuitKey"].PropertyValue = Key.Q; - Settings ["Application.AlternateForwardKey"].PropertyValue = Key.F; - Settings ["Application.AlternateBackwardKey"].PropertyValue = Key.B; + Settings ["Application.NextTabGroupKey"].PropertyValue = Key.F; + Settings ["Application.PrevTabGroupKey"].PropertyValue = Key.B; Settings.Apply (); // assert Assert.Equal (KeyCode.Q, Application.QuitKey.KeyCode); - Assert.Equal (KeyCode.F, Application.AlternateForwardKey.KeyCode); - Assert.Equal (KeyCode.B, Application.AlternateBackwardKey.KeyCode); + Assert.Equal (KeyCode.F, Application.NextTabGroupKey.KeyCode); + Assert.Equal (KeyCode.B, Application.PrevTabGroupKey.KeyCode); } [Fact] @@ -39,18 +39,17 @@ public class SettingsScopeTests public void CopyUpdatedPropertiesFrom_ShouldCopyChangedPropertiesOnly () { Settings ["Application.QuitKey"].PropertyValue = Key.End; - ; var updatedSettings = new SettingsScope (); ///Don't set Quitkey - updatedSettings ["Application.AlternateForwardKey"].PropertyValue = Key.F; - updatedSettings ["Application.AlternateBackwardKey"].PropertyValue = Key.B; + updatedSettings ["Application.NextTabGroupKey"].PropertyValue = Key.F; + updatedSettings ["Application.PrevTabGroupKey"].PropertyValue = Key.B; Settings.Update (updatedSettings); Assert.Equal (KeyCode.End, ((Key)Settings ["Application.QuitKey"].PropertyValue).KeyCode); - Assert.Equal (KeyCode.F, ((Key)updatedSettings ["Application.AlternateForwardKey"].PropertyValue).KeyCode); - Assert.Equal (KeyCode.B, ((Key)updatedSettings ["Application.AlternateBackwardKey"].PropertyValue).KeyCode); + Assert.Equal (KeyCode.F, ((Key)updatedSettings ["Application.NextTabGroupKey"].PropertyValue).KeyCode); + Assert.Equal (KeyCode.B, ((Key)updatedSettings ["Application.PrevTabGroupKey"].PropertyValue).KeyCode); } [Fact] @@ -65,8 +64,8 @@ public class SettingsScopeTests Assert.Equal ("Default", Themes.Theme); Assert.True (Settings ["Application.QuitKey"].PropertyValue is Key); - Assert.True (Settings ["Application.AlternateForwardKey"].PropertyValue is Key); - Assert.True (Settings ["Application.AlternateBackwardKey"].PropertyValue is Key); + Assert.True (Settings ["Application.NextTabGroupKey"].PropertyValue is Key); + Assert.True (Settings ["Application.PrevTabGroupKey"].PropertyValue is Key); Assert.True (Settings ["Theme"].PropertyValue is string); Assert.Equal ("Default", Settings ["Theme"].PropertyValue as string); diff --git a/UnitTests/View/NavigationTests.cs b/UnitTests/View/NavigationTests.cs index 894a7bf00..59245d3c8 100644 --- a/UnitTests/View/NavigationTests.cs +++ b/UnitTests/View/NavigationTests.cs @@ -319,13 +319,13 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews Assert.True (view2.CanFocus); Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); + Assert.True (Application.OnKeyDown (Key.F6)); Assert.True (view1.CanFocus); Assert.False (view1.HasFocus); // Only one of the most focused toplevels view can have focus Assert.True (view2.CanFocus); Assert.True (view2.HasFocus); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); + Assert.True (Application.OnKeyDown (Key.F6)); Assert.True (view1.CanFocus); Assert.True (view1.HasFocus); Assert.True (view2.CanFocus); @@ -360,13 +360,13 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews Assert.True (view2.CanFocus); Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); + Assert.True (Application.OnKeyDown (Key.F6)); Assert.True (view1.CanFocus); Assert.False (view1.HasFocus); // Only one of the most focused toplevels view can have focus Assert.True (view2.CanFocus); Assert.True (view2.HasFocus); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); + Assert.True (Application.OnKeyDown (Key.F6)); Assert.True (view1.CanFocus); Assert.True (view1.HasFocus); Assert.True (view2.CanFocus); @@ -412,13 +412,13 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews Assert.True (view2.CanFocus); Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); // move to win2 + Assert.True (Application.OnKeyDown (Key.F6)); // move to win2 Assert.True (view1.CanFocus); Assert.False (view1.HasFocus); // Only one of the most focused toplevels view can have focus Assert.True (view2.CanFocus); Assert.True (view2.HasFocus); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); + Assert.True (Application.OnKeyDown (Key.F6)); Assert.True (view1.CanFocus); Assert.True (view1.HasFocus); Assert.True (view2.CanFocus); @@ -545,19 +545,19 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews Application.OnKeyDown (Key.Tab); Assert.Equal ("WindowSubview", top.MostFocused.Text); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.Equal ("FrameSubview", top.MostFocused.Text); Application.OnKeyDown (Key.Tab); Assert.Equal ("FrameSubview", top.MostFocused.Text); - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); Assert.Equal ("WindowSubview", top.MostFocused.Text); - Application.OnKeyDown (Key.Tab.WithCtrl.WithShift); + Application.OnKeyDown (Key.F6.WithShift); Assert.Equal ("FrameSubview", top.MostFocused.Text); - Application.OnKeyDown (Key.Tab.WithCtrl.WithShift); + Application.OnKeyDown (Key.F6.WithShift); Assert.Equal ("WindowSubview", top.MostFocused.Text); top.Dispose (); } @@ -609,14 +609,14 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews Assert.False (removed); Assert.Null (view3); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); + Assert.True (Application.OnKeyDown (Key.F6)); Assert.True (top1.HasFocus); Assert.False (view1.HasFocus); Assert.True (view2.HasFocus); Assert.True (removed); Assert.NotNull (view3); - Exception exception = Record.Exception (() => Application.OnKeyDown (Key.Tab.WithCtrl)); + Exception exception = Record.Exception (() => Application.OnKeyDown (Key.F6)); Assert.Null (exception); Assert.True (removed); Assert.Null (view3); @@ -1689,7 +1689,7 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews // Use keyboard to navigate to next view (otherView). if (view is TextView) { - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); } else { @@ -1710,7 +1710,7 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews Application.OnKeyDown (Key.Tab); break; case TabBehavior.TabGroup: - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); break; case null: Application.OnKeyDown (Key.Tab); @@ -1737,7 +1737,7 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews Application.OnKeyDown (Key.Tab); break; case TabBehavior.TabGroup: - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); break; case null: Application.OnKeyDown (Key.Tab); @@ -1832,13 +1832,13 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews // Use keyboard to navigate to next view (otherView). if (view is TextView) { - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); } else if (view is DatePicker) { for (var i = 0; i < 4; i++) { - Application.OnKeyDown (Key.Tab.WithCtrl); + Application.OnKeyDown (Key.F6); } } else @@ -1899,7 +1899,7 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews if (view.TabStop == TabBehavior.TabGroup) { - navKeys = new Key [] { Key.Tab.WithCtrl, Key.Tab.WithCtrl.WithShift }; + navKeys = new Key [] { Key.F6, Key.F6.WithShift }; } bool left = false; diff --git a/UnitTests/Views/OverlappedTests.cs b/UnitTests/Views/OverlappedTests.cs index ad9f33677..0f4858ce1 100644 --- a/UnitTests/Views/OverlappedTests.cs +++ b/UnitTests/Views/OverlappedTests.cs @@ -1116,10 +1116,10 @@ public class OverlappedTests Assert.True (Application.OnKeyDown (Key.Tab.WithShift)); Assert.Equal ($"First line Win1{Environment.NewLine}Second line Win1", tvW1.Text); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); // move to win2 + Assert.True (Application.OnKeyDown (Key.F6)); // move to win2 Assert.Equal (win2, ApplicationOverlapped.OverlappedChildren [0]); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl.WithShift)); // move back to win1 + Assert.True (Application.OnKeyDown (Key.F6.WithShift)); // move back to win1 Assert.Equal (win1, ApplicationOverlapped.OverlappedChildren [0]); Assert.Equal (tvW1, win1.MostFocused); @@ -1156,19 +1156,19 @@ public class OverlappedTests Assert.Equal (win1, ApplicationOverlapped.OverlappedChildren [0]); Assert.Equal (tf2W1, win1.MostFocused); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); // Move to win2 + Assert.True (Application.OnKeyDown (Key.F6)); // Move to win2 Assert.Equal (win2, ApplicationOverlapped.OverlappedChildren [0]); Assert.Equal (tf1W2, win2.MostFocused); tf2W2.SetFocus (); Assert.True (tf2W2.HasFocus); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl.WithShift)); + Assert.True (Application.OnKeyDown (Key.F6.WithShift)); Assert.Equal (win1, ApplicationOverlapped.OverlappedChildren [0]); Assert.Equal (tf2W1, win1.MostFocused); - Assert.True (Application.OnKeyDown (Application.AlternateForwardKey)); + Assert.True (Application.OnKeyDown (Application.NextTabGroupKey)); Assert.Equal (win2, ApplicationOverlapped.OverlappedChildren [0]); Assert.Equal (tf2W2, win2.MostFocused); - Assert.True (Application.OnKeyDown (Application.AlternateBackwardKey)); + Assert.True (Application.OnKeyDown (Application.PrevTabGroupKey)); Assert.Equal (win1, ApplicationOverlapped.OverlappedChildren [0]); Assert.Equal (tf2W1, win1.MostFocused); Assert.True (Application.OnKeyDown (Key.CursorDown)); diff --git a/UnitTests/Views/TextViewTests.cs b/UnitTests/Views/TextViewTests.cs index 4304a154b..8925db7af 100644 --- a/UnitTests/Views/TextViewTests.cs +++ b/UnitTests/Views/TextViewTests.cs @@ -5407,10 +5407,10 @@ This is the second line. tv.Text ); Assert.True (tv.AllowsTab); - Assert.False (tv.NewKeyDownEvent (Key.Tab.WithCtrl)); - Assert.False (tv.NewKeyDownEvent (Application.AlternateForwardKey)); - Assert.False (tv.NewKeyDownEvent (Key.Tab.WithCtrl.WithShift)); - Assert.False (tv.NewKeyDownEvent (Application.AlternateBackwardKey)); + Assert.False (tv.NewKeyDownEvent (Key.F6)); + Assert.False (tv.NewKeyDownEvent (Application.NextTabGroupKey)); + Assert.False (tv.NewKeyDownEvent (Key.F6.WithShift)); + Assert.False (tv.NewKeyDownEvent (Application.PrevTabGroupKey)); Assert.True (tv.NewKeyDownEvent (ContextMenu.DefaultKey)); Assert.True (tv.ContextMenu != null && tv.ContextMenu.MenuBar.Visible); diff --git a/UnitTests/Views/ToplevelTests.cs b/UnitTests/Views/ToplevelTests.cs index 9936748ae..3a5cbda58 100644 --- a/UnitTests/Views/ToplevelTests.cs +++ b/UnitTests/Views/ToplevelTests.cs @@ -486,10 +486,10 @@ public partial class ToplevelTests (ITestOutputHelper output) var prevMostFocusedSubview = top.MostFocused; - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); // move to next TabGroup (win2) + Assert.True (Application.OnKeyDown (Key.F6)); // move to next TabGroup (win2) Assert.Equal (win2, top.Focused); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl.WithShift)); // move to prev TabGroup (win1) + Assert.True (Application.OnKeyDown (Key.F6.WithShift)); // move to prev TabGroup (win1) Assert.Equal (win1, top.Focused); Assert.Equal (tf2W1, top.MostFocused); // BUGBUG: Should be prevMostFocusedSubview - We need to cache the last focused view in the TabGroup somehow @@ -527,16 +527,16 @@ public partial class ToplevelTests (ITestOutputHelper output) Assert.Equal (tvW1, top.MostFocused); // nav to win2 - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl)); + Assert.True (Application.OnKeyDown (Key.F6)); Assert.Equal (win2, top.Focused); Assert.Equal (tf1W2, top.MostFocused); - Assert.True (Application.OnKeyDown (Key.Tab.WithCtrl.WithShift)); + Assert.True (Application.OnKeyDown (Key.F6.WithShift)); Assert.Equal (win1, top.Focused); Assert.Equal (tf2W1, top.MostFocused); - Assert.True (Application.OnKeyDown (Application.AlternateForwardKey)); + Assert.True (Application.OnKeyDown (Application.NextTabGroupKey)); Assert.Equal (win2, top.Focused); Assert.Equal (tf1W2, top.MostFocused); - Assert.True (Application.OnKeyDown (Application.AlternateBackwardKey)); + Assert.True (Application.OnKeyDown (Application.PrevTabGroupKey)); Assert.Equal (win1, top.Focused); Assert.Equal (tf2W1, top.MostFocused); Assert.True (Application.OnKeyDown (Key.CursorUp)); diff --git a/docfx/docs/config.md b/docfx/docs/config.md index f6e9c06d8..c16765a89 100644 --- a/docfx/docs/config.md +++ b/docfx/docs/config.md @@ -33,12 +33,14 @@ The `UI Catalog` application provides an example of how to use the [`Configurati (Note, this list may not be complete; search the source code for `SerializableConfigurationProperty` to find all settings that can be configured.) * [Application.QuitKey](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_QuitKey) - * [Application.AlternateForwardKey](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_AlternateForwardKey) - * [Application.AlternateBackwardKey](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_AlternateBackwardKey) - * [Application.UseSystemConsole](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_UseSystemConsole) + * [Application.NextTabKey](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_NextTabKey) + * [Application.PrevTabKey](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_PrevTabKey) + * [Application.NextTabGroupKey](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_NextTabGroupKey) + * [Application.PrevTabGroupKey](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_PrevTabGroupKey) + * [Application.ForceDriver](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_ForceDriver) + * [Application.Force16Colors](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_Force16Colors) * [Application.IsMouseDisabled](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_IsMouseDisabled) - * [Application.EnableConsoleScrolling](~/api/Terminal.Gui.Application.yml#Terminal_Gui_Application_EnableConsoleScrolling) - + ## Glyphs The standard set of glyphs used for standard views (e.g. the default indicator for [Button](~/api/Terminal.Gui.Button.yml)) and line drawing (e.g. [LineCanvas](~/api/Terminal.Gui.LineCanvas.yml)) can be configured. diff --git a/docfx/docs/keyboard.md b/docfx/docs/keyboard.md index d5eba8b3e..c15f3ea30 100644 --- a/docfx/docs/keyboard.md +++ b/docfx/docs/keyboard.md @@ -37,6 +37,8 @@ The [Command](~/api/Terminal.Gui.Command.yml) enum lists generic operations that firing while in `TableView` it is bound to `CellActivated`. Not all commands are implemented by all views (e.g. you cannot scroll in a `Button`). Use the `GetSupportedCommands()` method to determine which commands are implemented by a `View`. +Key Bindings can be added at the Application or View level. For Application-scoped Key Bindings see [ApplicationNavigation](~/api/Terminal.Gui.ApplicationNavigation.yml). For View-scoped Key Bindings see [Key Bindings](~/api/Terminal.Gui.View.yml#Terminal_Gui_View_KeyBinings). + ### **[HotKey](~/api/Terminal.Gui.View.yml#Terminal_Gui_View_HotKey)** A **HotKey** is a keypress that selects a visible UI item. For selecting items across `View`s (e.g. a `Button` in a `Dialog`) the keypress must have the `Alt` modifier. For selecting items within a `View` that are not `View`s themselves, the keypress can be key without the `Alt` modifier. For example, in a `Dialog`, a `Button` with the text of "_Text" can be selected with `Alt-T`. Or, in a `Menu` with "_File _Edit", `Alt-F` will select (show) the "_File" menu. If the "_File" menu has a sub-menu of "_New" `Alt-N` or `N` will ONLY select the "_New" sub-menu if the "_File" menu is already opened.