]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add EscapeContext keybind (#15301)
authorShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
Fri, 14 Apr 2023 01:10:44 +0000 (18:10 -0700)
committerGitHub <noreply@github.com>
Fri, 14 Apr 2023 01:10:44 +0000 (18:10 -0700)
* Add EscapeContext

Escape context input closes windows if there are any open. If there are not any windows it opens the game menu.

* Add fluent for Escape Context

* Move EngineContext keybind to content

* Readd WindowCloseAll

* Fix EscapeContext not opening the game menu after using WindowCloseAll

WindowCloseAll does not clear the CloseRecentWindowUIController.recentlyInteractedWindows, which caused HasClosableWindow to return true because the list still had items.

Changed HasClosableWindow to check if windows in the list are still open and clear them if they aren't.

* Clean up EscapeContextUIController

Content.Client/Input/ContentContexts.cs
Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
Content.Client/UserInterface/Systems/CloseWindow/CloseRecentWindowUIController.cs
Content.Client/UserInterface/Systems/EscapeMenu/EscapeContextUIController.cs [new file with mode: 0644]
Content.Client/UserInterface/Systems/EscapeMenu/EscapeUIController.cs
Content.Shared/Input/ContentKeyFunctions.cs
Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
Resources/keybinds.yml

index c3beda136da35d4943898a5294cc129b325f03c5..d9c103b7ebe095f5259fc9e0952e384d41d805aa 100644 (file)
@@ -22,6 +22,7 @@ namespace Content.Client.Input
             common.AddFunction(ContentKeyFunctions.FocusDeadChat);
             common.AddFunction(ContentKeyFunctions.CycleChatChannelForward);
             common.AddFunction(ContentKeyFunctions.CycleChatChannelBackward);
+            common.AddFunction(ContentKeyFunctions.EscapeContext);
             common.AddFunction(ContentKeyFunctions.ExamineEntity);
             common.AddFunction(ContentKeyFunctions.OpenAHelp);
             common.AddFunction(ContentKeyFunctions.TakeScreenshot);
index 74aaf466aa3dffd1d0c3dcd86f76c400aa541006..9d2614c096b5bfb803ad0cd9656dab0190c6615e 100644 (file)
@@ -148,6 +148,7 @@ namespace Content.Client.Options.UI.Tabs
             AddButton(EngineKeyFunctions.WindowCloseAll);
             AddButton(EngineKeyFunctions.WindowCloseRecent);
             AddButton(EngineKeyFunctions.EscapeMenu);
+            AddButton(ContentKeyFunctions.EscapeContext);
 
             AddHeader("ui-options-header-misc");
             AddButton(ContentKeyFunctions.TakeScreenshot);
index 18f20727e17d18b05899bc66bf8158907a87e3d1..3517a001c2723d69f4e0a105979345215b661e83 100644 (file)
@@ -32,7 +32,10 @@ public sealed class CloseRecentWindowUIController : UIController
             InputCmdHandler.FromDelegate(session => CloseMostRecentWindow()));
     }
 
-    private void CloseMostRecentWindow()
+    /// <summary>
+    /// Closes the most recently focused window.
+    /// </summary>
+    public void CloseMostRecentWindow()
     {
         // Search backwards through the recency list to find a still open window and close it
         for (int i=recentlyInteractedWindows.Count-1; i>=0; i--)
@@ -118,5 +121,23 @@ public sealed class CloseRecentWindowUIController : UIController
             SetMostRecentlyInteractedWindow((BaseWindow) control);
         }
     }
-}
 
+    /// <summary>
+    /// Checks whether there are any windows that can be closed.
+    /// </summary>
+    /// <returns></returns>
+    public bool HasClosableWindow()
+    {
+        for (var i = recentlyInteractedWindows.Count - 1; i >= 0; i--)
+        {
+            var window = recentlyInteractedWindows[i];
+            if (window.IsOpen)
+                return true;
+
+            recentlyInteractedWindows.RemoveAt(i);
+            // continue going down the list, hoping to find a still-open window
+        }
+
+        return false;
+    }
+}
diff --git a/Content.Client/UserInterface/Systems/EscapeMenu/EscapeContextUIController.cs b/Content.Client/UserInterface/Systems/EscapeMenu/EscapeContextUIController.cs
new file mode 100644 (file)
index 0000000..3a7c2ca
--- /dev/null
@@ -0,0 +1,37 @@
+using Content.Client.UserInterface.Systems.Info;
+using Content.Shared.Input;
+using JetBrains.Annotations;
+using Robust.Client.Input;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controllers;
+using Robust.Shared.Input;
+using Robust.Shared.Input.Binding;
+
+namespace Content.Client.UserInterface.Systems.EscapeMenu;
+
+[UsedImplicitly]
+public sealed class EscapeContextUIController : UIController
+{
+    [Dependency] private readonly IInputManager _inputManager = default!;
+
+    [Dependency] private readonly CloseRecentWindowUIController _closeRecentWindowUIController = default!;
+    [Dependency] private readonly EscapeUIController _escapeUIController = default!;
+
+    public override void Initialize()
+    {
+        _inputManager.SetInputCommand(ContentKeyFunctions.EscapeContext,
+            InputCmdHandler.FromDelegate(_ => CloseWindowOrOpenGameMenu()));
+    }
+
+    private void CloseWindowOrOpenGameMenu()
+    {
+        if (_closeRecentWindowUIController.HasClosableWindow())
+        {
+            _closeRecentWindowUIController.CloseMostRecentWindow();
+        }
+        else
+        {
+            _escapeUIController.ToggleWindow();
+        }
+    }
+}
index 56792c2992f1eb1012357cc11054a0eec929014c..a6a8b01022edd5274ef7c27b2e7e9f1130418b9d 100644 (file)
@@ -133,7 +133,10 @@ public sealed class EscapeUIController : UIController, IOnStateEntered<GameplayS
         _escapeWindow?.Close();
     }
 
-    private void ToggleWindow()
+    /// <summary>
+    /// Toggles the game menu.
+    /// </summary>
+    public void ToggleWindow()
     {
         if (_escapeWindow == null)
             return;
index ddcbca8967f067be53f373178fe35eb0fa053ac2..f9742eb6d50c9f364df30efadc3e80091c37dda7 100644 (file)
@@ -21,6 +21,7 @@ namespace Content.Shared.Input
         public static readonly BoundKeyFunction FocusConsoleChat = "FocusConsoleChatWindow";
         public static readonly BoundKeyFunction CycleChatChannelForward = "CycleChatChannelForward";
         public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward";
+        public static readonly BoundKeyFunction EscapeContext = "EscapeContext";
         public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu";
         public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu";
         public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook";
index 9808110ea2de2587dd7c781786d9b85b090117d2..af825fff461f921e14996d03d68a0672c63ff692 100644 (file)
@@ -138,6 +138,7 @@ ui-options-function-open-guidebook = Open guidebook
 ui-options-function-window-close-all = Close all windows
 ui-options-function-window-close-recent = Close recent window
 ui-options-function-show-escape-menu = Toggle game menu
+ui-options-function-escape-context = Close recent window or toggle game menu
 
 ui-options-function-take-screenshot = Take screenshot
 ui-options-function-take-screenshot-no-ui = Take screenshot (without UI)
index 493dc9bb73e86dc6815a3e02a9bcbe2c6ac33205..e69bf62575f42a9a27e0a8f484fd0a6505e8ef6f 100644 (file)
@@ -404,7 +404,7 @@ binds:
   type: State
   key: Tab
   mod1: Shift
-- function: WindowCloseRecent
+- function: EscapeContext
   type: State
   key: Escape
 - function: WindowCloseAll