Add EscapeContext keybind (#15301)

* 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
This commit is contained in:
ShadowCommander
2023-04-13 18:10:44 -07:00
committed by GitHub
parent 47262a6998
commit 3b21421ef1
8 changed files with 69 additions and 4 deletions

View File

@@ -22,6 +22,7 @@ namespace Content.Client.Input
common.AddFunction(ContentKeyFunctions.FocusDeadChat); common.AddFunction(ContentKeyFunctions.FocusDeadChat);
common.AddFunction(ContentKeyFunctions.CycleChatChannelForward); common.AddFunction(ContentKeyFunctions.CycleChatChannelForward);
common.AddFunction(ContentKeyFunctions.CycleChatChannelBackward); common.AddFunction(ContentKeyFunctions.CycleChatChannelBackward);
common.AddFunction(ContentKeyFunctions.EscapeContext);
common.AddFunction(ContentKeyFunctions.ExamineEntity); common.AddFunction(ContentKeyFunctions.ExamineEntity);
common.AddFunction(ContentKeyFunctions.OpenAHelp); common.AddFunction(ContentKeyFunctions.OpenAHelp);
common.AddFunction(ContentKeyFunctions.TakeScreenshot); common.AddFunction(ContentKeyFunctions.TakeScreenshot);

View File

@@ -148,6 +148,7 @@ namespace Content.Client.Options.UI.Tabs
AddButton(EngineKeyFunctions.WindowCloseAll); AddButton(EngineKeyFunctions.WindowCloseAll);
AddButton(EngineKeyFunctions.WindowCloseRecent); AddButton(EngineKeyFunctions.WindowCloseRecent);
AddButton(EngineKeyFunctions.EscapeMenu); AddButton(EngineKeyFunctions.EscapeMenu);
AddButton(ContentKeyFunctions.EscapeContext);
AddHeader("ui-options-header-misc"); AddHeader("ui-options-header-misc");
AddButton(ContentKeyFunctions.TakeScreenshot); AddButton(ContentKeyFunctions.TakeScreenshot);

View File

@@ -32,7 +32,10 @@ public sealed class CloseRecentWindowUIController : UIController
InputCmdHandler.FromDelegate(session => CloseMostRecentWindow())); 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 // Search backwards through the recency list to find a still open window and close it
for (int i=recentlyInteractedWindows.Count-1; i>=0; i--) for (int i=recentlyInteractedWindows.Count-1; i>=0; i--)
@@ -118,5 +121,23 @@ public sealed class CloseRecentWindowUIController : UIController
SetMostRecentlyInteractedWindow((BaseWindow) control); 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;
}
}

View File

@@ -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();
}
}
}

View File

@@ -133,7 +133,10 @@ public sealed class EscapeUIController : UIController, IOnStateEntered<GameplayS
_escapeWindow?.Close(); _escapeWindow?.Close();
} }
private void ToggleWindow() /// <summary>
/// Toggles the game menu.
/// </summary>
public void ToggleWindow()
{ {
if (_escapeWindow == null) if (_escapeWindow == null)
return; return;

View File

@@ -21,6 +21,7 @@ namespace Content.Shared.Input
public static readonly BoundKeyFunction FocusConsoleChat = "FocusConsoleChatWindow"; public static readonly BoundKeyFunction FocusConsoleChat = "FocusConsoleChatWindow";
public static readonly BoundKeyFunction CycleChatChannelForward = "CycleChatChannelForward"; public static readonly BoundKeyFunction CycleChatChannelForward = "CycleChatChannelForward";
public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward"; public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward";
public static readonly BoundKeyFunction EscapeContext = "EscapeContext";
public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu"; public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu";
public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu"; public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu";
public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook"; public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook";

View 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-all = Close all windows
ui-options-function-window-close-recent = Close recent window ui-options-function-window-close-recent = Close recent window
ui-options-function-show-escape-menu = Toggle game menu 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 = Take screenshot
ui-options-function-take-screenshot-no-ui = Take screenshot (without UI) ui-options-function-take-screenshot-no-ui = Take screenshot (without UI)

View File

@@ -404,7 +404,7 @@ binds:
type: State type: State
key: Tab key: Tab
mod1: Shift mod1: Shift
- function: WindowCloseRecent - function: EscapeContext
type: State type: State
key: Escape key: Escape
- function: WindowCloseAll - function: WindowCloseAll