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:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user