diff --git a/Terminal.Gui/View/ViewSubViews.cs b/Terminal.Gui/View/ViewSubViews.cs index 1657e09ed..a04d60b04 100644 --- a/Terminal.Gui/View/ViewSubViews.cs +++ b/Terminal.Gui/View/ViewSubViews.cs @@ -383,7 +383,7 @@ namespace Terminal.Gui { SuperView?.EnsureFocus (); if (SuperView != null && SuperView.Focused == null) { SuperView.FocusNext (); - if (SuperView.Focused == null) { + if (SuperView.Focused == null && Application.Current != null) { Application.Current.FocusNext (); } Application.BringOverlappedTopToFront (); diff --git a/Terminal.Gui/Views/Window.cs b/Terminal.Gui/Views/Window.cs index 0358c12a8..8d4c3a2cd 100644 --- a/Terminal.Gui/Views/Window.cs +++ b/Terminal.Gui/Views/Window.cs @@ -56,29 +56,5 @@ namespace Terminal.Gui { ColorScheme = Colors.Base; // TODO: make this a theme property BorderStyle = DefaultBorderStyle; } - - // TODO: Are these overrides really needed? - /// - public override void Add (View view) - { - base.Add (view); - if (view.CanFocus) { - CanFocus = true; - } - AddMenuStatusBar (view); - } - - /// - public override void Remove (View view) - { - if (view == null) { - return; - } - - SetNeedsDisplay (); - base.Remove (view); - RemoveMenuStatusBar (view); - - } } } diff --git a/UnitTests/View/NavigationTests.cs b/UnitTests/View/NavigationTests.cs index d7f7ba809..f632fccd2 100644 --- a/UnitTests/View/NavigationTests.cs +++ b/UnitTests/View/NavigationTests.cs @@ -764,11 +764,25 @@ namespace Terminal.Gui.ViewTests { Assert.True (view1.CanFocus); Assert.True (view1.HasFocus); Assert.True (view2.CanFocus); - Assert.False (view2.HasFocus); + Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus + + Assert.True (Application.Top.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ()))); + 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.Top.ProcessKey (new KeyEvent (Key.Tab, new KeyModifiers ()))); + Assert.True (view1.CanFocus); + Assert.True (view1.HasFocus); + Assert.True (view2.CanFocus); + Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus view1.CanFocus = false; Assert.False (view1.CanFocus); Assert.False (view1.HasFocus); + Assert.True (view2.CanFocus); + Assert.True (view2.HasFocus); Assert.Equal (win2, Application.Current.Focused); Assert.Equal (view2, Application.Current.MostFocused); } @@ -790,11 +804,26 @@ namespace Terminal.Gui.ViewTests { Assert.True (view1.CanFocus); Assert.True (view1.HasFocus); Assert.True (view2.CanFocus); - Assert.False (view2.HasFocus); + Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus + + Assert.True (Application.Top.ProcessKey (new KeyEvent (Key.Tab | Key.CtrlMask, new KeyModifiers ()))); + Assert.True (Application.Top.ProcessKey (new KeyEvent (Key.Tab | Key.CtrlMask, new KeyModifiers ()))); + 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.Top.ProcessKey (new KeyEvent (Key.Tab | Key.CtrlMask, new KeyModifiers ()))); + Assert.True (view1.CanFocus); + Assert.True (view1.HasFocus); + Assert.True (view2.CanFocus); + Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus view1.CanFocus = false; Assert.False (view1.CanFocus); Assert.False (view1.HasFocus); + Assert.True (view2.CanFocus); + Assert.False (view2.HasFocus); Assert.Equal (win1, Application.Current.Focused); Assert.Equal (view12, Application.Current.MostFocused); } @@ -815,13 +844,27 @@ namespace Terminal.Gui.ViewTests { Assert.True (view1.CanFocus); Assert.True (view1.HasFocus); Assert.True (view2.CanFocus); - Assert.False (view2.HasFocus); + Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus + + Assert.True (Application.Top.ProcessKey (new KeyEvent (Key.Tab | Key.CtrlMask, new KeyModifiers ()))); + 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.Top.ProcessKey (new KeyEvent (Key.Tab | Key.CtrlMask, new KeyModifiers ()))); + Assert.True (view1.CanFocus); + Assert.True (view1.HasFocus); + Assert.True (view2.CanFocus); + Assert.False (view2.HasFocus); // Only one of the most focused toplevels view can have focus win1.CanFocus = false; Assert.False (view1.CanFocus); Assert.False (view1.HasFocus); Assert.False (win1.CanFocus); Assert.False (win1.HasFocus); + Assert.True (view2.CanFocus); + Assert.True (view2.HasFocus); Assert.Equal (win2, Application.Current.Focused); Assert.Equal (view2, Application.Current.MostFocused); } diff --git a/UnitTests/Views/WindowTests.cs b/UnitTests/Views/WindowTests.cs index 242e34a67..955be94ff 100644 --- a/UnitTests/Views/WindowTests.cs +++ b/UnitTests/Views/WindowTests.cs @@ -193,5 +193,22 @@ namespace Terminal.Gui.ViewsTests { Assert.False (win2.HasFocus); Assert.False (view2.HasFocus); } + + [Fact, AutoInitShutdown] + public void Activating_MenuBar_By_Alt_Key_Does_Not_Throw () + { + var menu = new MenuBar (new MenuBarItem [] { + new MenuBarItem ("Child", new MenuItem [] { + new MenuItem ("_Create Child", "", null) + }) + }); + var win = new Window (); + win.Add (menu); + Application.Top.Add (win); + Application.Begin (Application.Top); + + var exception = Record.Exception (() => win.ProcessHotKey (new KeyEvent (Key.AltMask, new KeyModifiers { Alt = true }))); + Assert.Null (exception); + } } }