diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 991069a69..61bf646ff 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -4781,9 +4781,7 @@ static void RequireRuntimeMenuTabsUseEveSurface(string root) "HandleTabSurfaceCommand(", "AetheriaEveUnitySurfaceHost.RenderRuntime(", "AetheriaEveUnitySurfaceHost.Hide(_tabSurfaceDocument)", - "AetheriaRuntimeMenuTabsSurfaceBuilder.Build(ComposeTabSurface())", - "ComposeTabSurface(", - "AetheriaRuntimeMenuTabsSurfaceBuilder.Compose(", + "AetheriaRuntimeMenuTabsSurfaceBuilder.Build(", "new AetheriaRuntimeMenuTabModelOption(", "ResolveVisibleTabs(", "SetObservedEntityIndex(AetheriaUnityObservedEntityIndex observedEntityIndex)", @@ -4848,8 +4846,10 @@ static void RequireRuntimeMenuTabsUseEveSurface(string root) "string.Equals(request.Command, AetheriaRuntimeMenuTabsSurfaceBuilder.CommandFor(", "ResolveClient().State.CurrentDocking()", "AetheriaRuntimeObservedDockingState", + "ComposeTabSurface(", "ProjectTabSurfaceState(", "ProjectTabSurface(", + "AetheriaRuntimeMenuTabsSurfaceBuilder.Compose(", "AetheriaRuntimeMenuTabsSurfaceBuilder.Project(", "new AetheriaRuntimeMenuTabProjectionOption(", "new AetheriaRuntimeMenuTabSurfaceEntry(", @@ -4880,7 +4880,8 @@ static void RequireRuntimeMenuTabsUseEveSurface(string root) { "public sealed class AetheriaRuntimeMenuTabModelOption", "public static string NormalizeTabKey(string tabKey)", - "public static AetheriaRuntimeMenuTabsSurfaceState Compose(", + "public static AetheriaRuntimeSurfaceDocument Build(", + "private static AetheriaRuntimeMenuTabsSurfaceState ComposeState(", "public int Order { get; }", ".OrderBy(tab => tab.Order)", "new AetheriaRuntimeMenuTabSurfaceEntry(", @@ -4896,6 +4897,13 @@ static void RequireRuntimeMenuTabsUseEveSurface(string root) string.Join(", ", missingProjectionBuilderSymbols)); } + if (menuTabsSurfaceBuilder.Contains("public static AetheriaRuntimeMenuTabsSurfaceState Compose(", StringComparison.Ordinal) || + menuTabsSurfaceBuilder.Contains("public static AetheriaRuntimeMenuTabsSurfaceState Project(", StringComparison.Ordinal)) + { + throw new InvalidOperationException( + "Runtime menu tab composition must stay behind Build(...); do not re-expose Compose/Project as the public tab surface path."); + } + var requiredDockedStoryObserverSymbols = new[] { "TryResolveDockedLocalStory(out _currentLocation)", diff --git a/Assets/Scripts/UI/Menu/MenuPanel.cs b/Assets/Scripts/UI/Menu/MenuPanel.cs index 4684e7a6b..f802505b2 100644 --- a/Assets/Scripts/UI/Menu/MenuPanel.cs +++ b/Assets/Scripts/UI/Menu/MenuPanel.cs @@ -117,7 +117,14 @@ public class MenuPanel : MonoBehaviour transform, _tabSurfaceDocument, "Aetheria Runtime Menu Tabs Surface", - AetheriaRuntimeMenuTabsSurfaceBuilder.Build(ComposeTabSurface()), + AetheriaRuntimeMenuTabsSurfaceBuilder.Build( + ToRuntimeTabKey(CurrentTab), + ResolveVisibleTabs() + .Select(tabBinding => new AetheriaRuntimeMenuTabModelOption( + ToRuntimeTabKey(tabBinding.Tab), + GetTabLabel(tabBinding), + (int)tabBinding.Tab)), + DateTime.UtcNow.ToString("O")), HandleTabSurfaceCommand, _tabSurfaceChrome); } @@ -151,20 +158,6 @@ public class MenuPanel : MonoBehaviour AetheriaEveUnitySurfaceHost.Hide(_tabSurfaceDocument); } - private AetheriaRuntimeMenuTabsSurfaceState ComposeTabSurface() - { - var visibleTabs = ResolveVisibleTabs(); - return AetheriaRuntimeMenuTabsSurfaceBuilder.Compose( - ToRuntimeTabKey(CurrentTab), - visibleTabs - .Select(tabBinding => new AetheriaRuntimeMenuTabModelOption( - ToRuntimeTabKey(tabBinding.Tab), - GetTabLabel(tabBinding), - (int)tabBinding.Tab)) - .ToArray(), - DateTime.UtcNow.ToString("O")); - } - private MenuTabBinding[] ResolveVisibleTabs() { var isDocked = TryResolveCurrentDocking(out var docking) && docking.IsDocked; diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMenuTabsSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMenuTabsSurfaceBuilder.cs index 4353dfcf4..735b6f904 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMenuTabsSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeMenuTabsSurfaceBuilder.cs @@ -66,7 +66,18 @@ namespace GameCult.Aetheria.State.Verse return $"aetheria.runtime_menu.tab.{NormalizeTabKey(tabKey)}"; } - public static AetheriaRuntimeMenuTabsSurfaceState Compose( + public static AetheriaRuntimeSurfaceDocument Build( + string currentTabKey, + IEnumerable visibleTabs, + string updatedAtUtc, + long version = 1) + { + return Build( + ComposeState(currentTabKey, visibleTabs, updatedAtUtc), + version); + } + + private static AetheriaRuntimeMenuTabsSurfaceState ComposeState( string currentTabKey, IEnumerable visibleTabs, string updatedAtUtc)