瀏覽代碼

Improving Application.Navigation

Tig 11 月之前
父節點
當前提交
3902e62b4a

+ 13 - 27
Terminal.Gui/Application/Application.Keyboard.cs

@@ -1,6 +1,4 @@
 #nullable enable
-using static System.Net.Mime.MediaTypeNames;
-
 namespace Terminal.Gui;
 
 public static partial class Application // Keyboard handling
@@ -289,31 +287,25 @@ public static partial class Application // Keyboard handling
 
         AddCommand (
                     Command.NextView,
-                    static () => Application.Navigation?.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop));
+                    static () => Navigation?.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop));
 
         AddCommand (
-        Command.PreviousView,
-                    static () => Application.Navigation?.AdvanceFocus (NavigationDirection.Backward, TabBehavior.TabStop));
+                    Command.PreviousView,
+                    static () => Navigation?.AdvanceFocus (NavigationDirection.Backward, TabBehavior.TabStop));
 
         AddCommand (
                     Command.NextViewOrTop,
                     static () =>
                     {
                         // TODO: This OverlapppedTop tomfoolery goes away in addressing #2491
-                        if (ApplicationOverlapped.OverlappedTop is null && Current is { })
+                        if (ApplicationOverlapped.OverlappedTop is { })
                         {
-                            if (Current.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup))
-                            {
-                                return true;
-                            };
-
+                            ApplicationOverlapped.OverlappedMoveNext ();
 
-                            return false;
+                            return true;
                         }
 
-                        ApplicationOverlapped.OverlappedMoveNext ();
-
-                        return true;
+                        return Navigation?.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup);
                     }
                    );
 
@@ -322,20 +314,14 @@ public static partial class Application // Keyboard handling
                     static () =>
                     {
                         // TODO: This OverlapppedTop tomfoolery goes away in addressing #2491
-                        if (ApplicationOverlapped.OverlappedTop is null && Current is { })
+                        if (ApplicationOverlapped.OverlappedTop is { })
                         {
-                            if (Current.AdvanceFocus (NavigationDirection.Backward, TabBehavior.TabGroup))
-                            {
-                                return true;
-                            };
-
+                            ApplicationOverlapped.OverlappedMovePrevious ();
 
-                            return false;
+                            return true;
                         }
 
-                        ApplicationOverlapped.OverlappedMovePrevious ();
-
-                        return true;
+                        return Navigation?.AdvanceFocus (NavigationDirection.Backward, TabBehavior.TabGroup);
                     }
                    );
 
@@ -367,8 +353,8 @@ public static partial class Application // Keyboard handling
         KeyBindings.Add (NextTabKey, KeyBindingScope.Application, Command.NextView);
         KeyBindings.Add (PrevTabKey, KeyBindingScope.Application, Command.PreviousView);
 
-        KeyBindings.Add (NextTabGroupKey, KeyBindingScope.Application, Command.NextViewOrTop); // Needed on Unix
-        KeyBindings.Add (PrevTabGroupKey, KeyBindingScope.Application, Command.PreviousViewOrTop); // Needed on Unix
+        KeyBindings.Add (NextTabGroupKey, KeyBindingScope.Application, Command.NextViewOrTop);
+        KeyBindings.Add (PrevTabGroupKey, KeyBindingScope.Application, Command.PreviousViewOrTop);
 
         // TODO: Refresh Key should be configurable
         KeyBindings.Add (Key.F5, KeyBindingScope.Application, Command.Refresh);

+ 1 - 1
Terminal.Gui/Application/ApplicationNavigation.cs

@@ -98,6 +98,6 @@ public class ApplicationNavigation
     /// </returns>
     public bool AdvanceFocus (NavigationDirection direction, TabBehavior? behavior)
     {
-        return Application.Current is { } && Application.Current.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
+        return Application.Current is { } && Application.Current.AdvanceFocus (direction, behavior);
     }
 }

+ 1 - 1
UnitTests/Application/Application.NavigationTests.cs

@@ -113,7 +113,7 @@ public class ApplicationNavigationTests (ITestOutputHelper output)
         Assert.True (subView1.HasFocus);
         Assert.Equal (subView1, Application.Navigation.GetFocused ());
 
-        Application.Current.AdvanceFocus (NavigationDirection.Forward, null);
+        Application.Navigation.AdvanceFocus (NavigationDirection.Forward, null);
         Assert.Equal (subView2, Application.Navigation.GetFocused ());
 
         Application.ResetState ();

+ 4 - 3
UnitTests/View/Navigation/CanFocusTests.cs

@@ -324,17 +324,18 @@ public class CanFocusTests () : TestsAllViews
     {
         Label label = new () { Text = "label" };
         View view = new () { Text = "view", CanFocus = true };
+        Application.Navigation = new ();
         Application.Current = new ();
         Application.Current.Add (label, view);
 
         Application.Current.SetFocus ();
-        Assert.Equal (view, Application.Current.MostFocused);
+        Assert.Equal (view, Application.Navigation.GetFocused());
         Assert.False (label.CanFocus);
         Assert.False (label.HasFocus);
         Assert.True (view.CanFocus);
         Assert.True (view.HasFocus);
 
-        Assert.False (Application.Current.AdvanceFocus (NavigationDirection.Forward, null));
+        Assert.False (Application.Navigation.AdvanceFocus (NavigationDirection.Forward, null));
         Assert.False (label.HasFocus);
         Assert.True (view.HasFocus);
 
@@ -344,7 +345,7 @@ public class CanFocusTests () : TestsAllViews
         Assert.True (view.HasFocus);
 
         // label can now be focused, so AdvanceFocus should move to it.
-        Assert.True (Application.Current.AdvanceFocus (NavigationDirection.Forward, null));
+        Assert.True (Application.Navigation.AdvanceFocus (NavigationDirection.Forward, null));
         Assert.True (label.HasFocus);
         Assert.False (view.HasFocus);