diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 5378c6b8f..37c68b555 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -3571,7 +3571,8 @@ static void RequireRuntimeInputScreenUsesEveSurface(string root) "new InputAction(\"Aetheria Input Capture\")", "AetheriaRuntimeInputSettingsSurfaceBuilder.DefaultActionBarCandidatePaths", "AetheriaRuntimeInputSettingsSurfaceBuilder.IsSupportedCapturePath(", - "AetheriaRuntimeInputSettingsSurfaceBuilder.ProjectActionBarInputs(", + "AetheriaRuntimeInputSettingsSurfaceBuilder.Project(", + "new AetheriaRuntimeObservedInputBinding(", "new AetheriaRuntimeInputPathSurfaceLabel(", "HideLegacyChildren()" }; @@ -3610,6 +3611,10 @@ static void RequireRuntimeInputScreenUsesEveSurface(string root) "request.Payload", "private static readonly string[] DefaultActionBarCandidatePaths", "private static bool IsSupportedCapturePath(string path)", + "new AetheriaRuntimeInputSettingsSurfaceState(", + "new AetheriaRuntimeInputBindingSurfaceState(", + "new AetheriaRuntimeActionBarInputSurfaceState(", + "AetheriaRuntimeInputSettingsSurfaceBuilder.ProjectActionBarInputs(", "new SortedDictionary(StringComparer.Ordinal)" }; @@ -3641,8 +3646,11 @@ static void RequireRuntimeInputScreenUsesEveSurface(string root) "public sealed class AetheriaRuntimeInputBindingSurfaceState", "public sealed class AetheriaRuntimeActionBarInputSurfaceState", "public sealed class AetheriaRuntimeInputPathSurfaceLabel", + "public sealed class AetheriaRuntimeObservedInputBinding", "public static readonly IReadOnlyList DefaultActionBarCandidatePaths", "public static bool IsSupportedCapturePath(string path)", + "public static AetheriaRuntimeInputSettingsSurfaceState Project(", + "public static IReadOnlyList ProjectBindingInputs(", "public static IReadOnlyList ProjectActionBarInputs(", "new SortedDictionary(StringComparer.Ordinal)", "public enum AetheriaRuntimeInputSettingsCommandKind", diff --git a/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs b/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs index 230be6d88..6abb0e800 100644 --- a/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs +++ b/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs @@ -164,19 +164,21 @@ public class InputDisplayLayout : MonoBehaviour private AetheriaRuntimeInputSettingsSurfaceState ProjectSurfaceState() { - return new AetheriaRuntimeInputSettingsSurfaceState( - ProjectBindingRows(), - ProjectActionBarRows(), + var runtimeSettings = ActionGameManager.RuntimePlayerSettings.InputSettings; + return AetheriaRuntimeInputSettingsSurfaceBuilder.Project( + ProjectObservedBindings(), + runtimeSettings.ActionBarInputs, + ProjectActionBarCandidates(runtimeSettings.ActionBarInputs), capturePending: _captureBindingIndex >= 0 && !string.IsNullOrWhiteSpace(_captureActionName), capturePrompt: BuildCapturePrompt(), updatedAtUtc: DateTime.UtcNow.ToString("O")); } - private IReadOnlyList ProjectBindingRows() + private IReadOnlyList ProjectObservedBindings() { if (Input == null) { - return Array.Empty(); + return Array.Empty(); } return Input @@ -188,18 +190,19 @@ public class InputDisplayLayout : MonoBehaviour !entry.binding.isComposite && !string.IsNullOrWhiteSpace(entry.binding.effectivePath) && AetheriaRuntimeInputSettingsSurfaceBuilder.IsSupportedCapturePath(entry.binding.effectivePath)) - .Select(entry => new AetheriaRuntimeInputBindingSurfaceState( + .Select(entry => new AetheriaRuntimeObservedInputBinding( entry.action.name, entry.bindingIndex, DescribeBinding(entry.action.name, entry.binding), - DescribeInputPath(entry.binding.effectivePath))) - .OrderBy(entry => entry.BindingLabel, StringComparer.Ordinal) + entry.binding.effectivePath, + DescribeInputPath(entry.binding.effectivePath), + include: true)) .ToArray(); } - private IReadOnlyList ProjectActionBarRows() + private IReadOnlyList ProjectActionBarCandidates( + IEnumerable enabledActionBarInputPaths) { - var runtimeSettings = ActionGameManager.RuntimePlayerSettings.InputSettings; var candidates = new List(); foreach (var defaultPath in AetheriaRuntimeInputSettingsSurfaceBuilder.DefaultActionBarCandidatePaths) @@ -209,7 +212,7 @@ public class InputDisplayLayout : MonoBehaviour DescribeInputPath(defaultPath))); } - foreach (var inputPath in runtimeSettings.ActionBarInputs) + foreach (var inputPath in enabledActionBarInputPaths ?? Array.Empty()) { if (!string.IsNullOrWhiteSpace(inputPath)) { @@ -239,9 +242,7 @@ public class InputDisplayLayout : MonoBehaviour } } - return AetheriaRuntimeInputSettingsSurfaceBuilder.ProjectActionBarInputs( - runtimeSettings.ActionBarInputs, - candidates); + return candidates; } private static string DescribeBinding(string actionName, InputBinding binding) diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs index eefde3239..da3a6c776 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs @@ -85,6 +85,32 @@ namespace GameCult.Aetheria.State.Verse public string Label { get; } } + public sealed class AetheriaRuntimeObservedInputBinding + { + public AetheriaRuntimeObservedInputBinding( + string actionName, + int bindingIndex, + string bindingLabel, + string inputPath, + string inputLabel, + bool include) + { + ActionName = actionName ?? ""; + BindingIndex = bindingIndex; + BindingLabel = bindingLabel ?? ""; + InputPath = inputPath ?? ""; + InputLabel = inputLabel ?? ""; + Include = include; + } + + public string ActionName { get; } + public int BindingIndex { get; } + public string BindingLabel { get; } + public string InputPath { get; } + public string InputLabel { get; } + public bool Include { get; } + } + public static class AetheriaRuntimeInputSettingsSurfaceBuilder { public static readonly IReadOnlyList DefaultActionBarCandidatePaths = new[] @@ -109,6 +135,41 @@ namespace GameCult.Aetheria.State.Verse path.StartsWith("/", StringComparison.Ordinal)); } + public static AetheriaRuntimeInputSettingsSurfaceState Project( + IEnumerable observedBindings, + IEnumerable enabledActionBarInputPaths, + IEnumerable actionBarCandidateInputPaths, + bool capturePending, + string capturePrompt, + string updatedAtUtc) + { + return new AetheriaRuntimeInputSettingsSurfaceState( + ProjectBindingInputs(observedBindings), + ProjectActionBarInputs(enabledActionBarInputPaths, actionBarCandidateInputPaths), + capturePending, + capturePrompt, + updatedAtUtc); + } + + public static IReadOnlyList ProjectBindingInputs( + IEnumerable observedBindings) + { + return (observedBindings ?? Array.Empty()) + .Where(binding => binding != null && + binding.Include && + !string.IsNullOrWhiteSpace(binding.InputPath) && + IsSupportedCapturePath(binding.InputPath)) + .Select(binding => new AetheriaRuntimeInputBindingSurfaceState( + binding.ActionName, + binding.BindingIndex, + binding.BindingLabel, + string.IsNullOrWhiteSpace(binding.InputLabel) ? binding.InputPath : binding.InputLabel)) + .OrderBy(binding => binding.BindingLabel, StringComparer.Ordinal) + .ThenBy(binding => binding.ActionName, StringComparer.Ordinal) + .ThenBy(binding => binding.BindingIndex) + .ToArray(); + } + public static IReadOnlyList ProjectActionBarInputs( IEnumerable enabledInputPaths, IEnumerable candidateInputPaths)