From 2941847112948b1cee4c83048b73d06ccfe91913 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 29 Jun 2026 09:33:22 +0100 Subject: [PATCH] Share Unity docking document access --- Aetheria.State.Verify/Program.cs | 53 +++++++++++++++---------- Assets/Scripts/UI/Menu/MenuPanel.cs | 38 +++++++++--------- Assets/Scripts/UI/Menu/TradeMenu.cs | 60 +++++++++++------------------ 3 files changed, 76 insertions(+), 75 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 308c92c64..d215d126d 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -4817,12 +4817,12 @@ static void RequireRuntimeMenuTabsUseEveSurface(string root) "new AetheriaRuntimeMenuTabModelOption(", "ResolveVisibleTabs(", "SetObservedEntityIndex(AetheriaUnityObservedEntityIndex observedEntityIndex)", - "AetheriaRuntimeCurrentDocking", - "CultMeshReactiveDocument _currentDocking", - "AetheriaUnityRuntimeClientProvider", - ".ReactiveCurrentDocking(\"unity-runtime-menu-tabs\")", - "docking = _currentDocking.Current", + "private AetheriaUnityObservedEntityIndex _observedEntityIndex;", + "private AetheriaUnityObservedDockingIndex _observedDockingIndex;", + "dockingIndex.TryResolveCurrentDocking(out var docking)", "docking.IsDocked", + "TryResolveObservedDockingIndex(out AetheriaUnityObservedDockingIndex dockingIndex)", + "new AetheriaUnityObservedDockingIndex(_observedEntityIndex)", "GetTabLabel(", "ToRuntimeTabKey(", "AetheriaRuntimeMenuTabsSurfaceBuilder.NormalizeTabKey(tab.ToString())", @@ -4876,6 +4876,9 @@ static void RequireRuntimeMenuTabsUseEveSurface(string root) "new EveUiToolkitSurfaceLowerer()", "string.Equals(request.Command, AetheriaRuntimeMenuTabsSurfaceBuilder.CommandFor(", "ResolveClient().State.CurrentDocking()", + "CultMeshReactiveDocument _currentDocking", + ".ReactiveCurrentDocking(\"unity-runtime-menu-tabs\")", + "docking = _currentDocking.Current", "AetheriaRuntimeObservedDockingState", "ComposeTabSurface(", "ProjectTabSurfaceState(", @@ -5837,13 +5840,12 @@ static void RequireTradeCargoSelectorUseEveSurface(string root) "AetheriaRuntimeTradeCargoSelectorCommandKind.Close", "AetheriaRuntimeTradeCargoSelectorCommandKind.Select", "SetObservedEntityIndex(AetheriaUnityObservedEntityIndex observedEntityIndex)", - "AetheriaRuntimeCurrentDocking", - "CultMeshReactiveDocument _currentDocking", - ".ReactiveCurrentDocking(\"unity-trade\")", - "docking = _currentDocking.Current", - "CultMeshReactiveDocument _stationRefit", - ".ReactiveStationRefit(\"unity-trade\")", - "return _stationRefit?.Current", + "private AetheriaUnityObservedEntityIndex _observedEntityIndex;", + "private AetheriaUnityObservedDockingIndex _observedDockingIndex;", + "TryResolveObservedDockingIndex(out AetheriaUnityObservedDockingIndex dockingIndex)", + "new AetheriaUnityObservedDockingIndex(_observedEntityIndex)", + "dockingIndex.StationRefitSnapshot()", + "dockingIndex.TryResolveCurrentDocking(out docking)", "SetTargetCargo(", "selection.EntityKey", "OwnedQuantity", @@ -5887,6 +5889,12 @@ static void RequireTradeCargoSelectorUseEveSurface(string root) "_cargoSelectorSurfaceProjection", "AetheriaRuntimeObservedDockingState", "ResolveClient().State.CurrentDocking()", + "CultMeshReactiveDocument _currentDocking", + ".ReactiveCurrentDocking(\"unity-trade\")", + "docking = _currentDocking.Current", + "CultMeshReactiveDocument _stationRefit", + ".ReactiveStationRefit(\"unity-trade\")", + "return _stationRefit?.Current", "docking.Refit", "GameManager.DockedEntity.Children", "GameManager.CurrentEntity.Parent.Children", @@ -7442,17 +7450,20 @@ static void RequireMenuDockingUsesManagedTypedSnapshot(string root) var menuPanel = File.ReadAllText(Path.Combine(root, "Assets", "Scripts", "UI", "Menu", "MenuPanel.cs")); var tradeMenu = File.ReadAllText(Path.Combine(root, "Assets", "Scripts", "UI", "Menu", "TradeMenu.cs")); var directDockingOffenders = new List(); - if (!menuPanel.Contains("CultMeshReactiveDocument _currentDocking", StringComparison.Ordinal) || - !menuPanel.Contains(".ReactiveCurrentDocking(\"unity-runtime-menu-tabs\")", StringComparison.Ordinal) || - !menuPanel.Contains("docking = _currentDocking.Current", StringComparison.Ordinal) || + if (menuPanel.Contains("CultMeshReactiveDocument _currentDocking", StringComparison.Ordinal) || + menuPanel.Contains(".ReactiveCurrentDocking(\"unity-runtime-menu-tabs\")", StringComparison.Ordinal) || + menuPanel.Contains("docking = _currentDocking.Current", StringComparison.Ordinal) || menuPanel.Contains("ResolveClient().State.Latest()", StringComparison.Ordinal)) { directDockingOffenders.Add("Assets/Scripts/UI/Menu/MenuPanel.cs"); } - if (!tradeMenu.Contains("CultMeshReactiveDocument _currentDocking", StringComparison.Ordinal) || - !tradeMenu.Contains(".ReactiveCurrentDocking(\"unity-trade\")", StringComparison.Ordinal) || - !tradeMenu.Contains("docking = _currentDocking.Current", StringComparison.Ordinal) || + if (tradeMenu.Contains("CultMeshReactiveDocument _currentDocking", StringComparison.Ordinal) || + tradeMenu.Contains(".ReactiveCurrentDocking(\"unity-trade\")", StringComparison.Ordinal) || + tradeMenu.Contains("docking = _currentDocking.Current", StringComparison.Ordinal) || + tradeMenu.Contains("CultMeshReactiveDocument _stationRefit", StringComparison.Ordinal) || + tradeMenu.Contains(".ReactiveStationRefit(\"unity-trade\")", StringComparison.Ordinal) || + tradeMenu.Contains("return _stationRefit?.Current", StringComparison.Ordinal) || tradeMenu.Contains("ResolveClient().State.Latest()", StringComparison.Ordinal)) { directDockingOffenders.Add("Assets/Scripts/UI/Menu/TradeMenu.cs"); @@ -7461,7 +7472,7 @@ static void RequireMenuDockingUsesManagedTypedSnapshot(string root) if (directDockingOffenders.Count > 0) { throw new InvalidOperationException( - "Unity menu docking reads must hold the managed reactive typed docking document and sample Current directly: " + + "Unity menu docking reads must share AetheriaUnityObservedDockingIndex instead of owning duplicate reactive docking/refit documents: " + string.Join(", ", directDockingOffenders)); } @@ -16538,7 +16549,9 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) } var missingProviderClientAccess = providerOwnedClientAccessSources - .Where(pair => !pair.Value.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal)) + .Where(pair => + !pair.Value.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal) && + !pair.Value.Contains("AetheriaUnityObservedDockingIndex", StringComparison.Ordinal)) .Select(pair => pair.Key) .ToArray(); if (missingProviderClientAccess.Length > 0) diff --git a/Assets/Scripts/UI/Menu/MenuPanel.cs b/Assets/Scripts/UI/Menu/MenuPanel.cs index 35c6399a3..80614d5d7 100644 --- a/Assets/Scripts/UI/Menu/MenuPanel.cs +++ b/Assets/Scripts/UI/Menu/MenuPanel.cs @@ -8,7 +8,6 @@ using System.Linq; using GameCult.Aetheria.EveRuntime; using GameCult.Aetheria.State.Verse; using GameCult.Eve.Surface; -using GameCult.Mesh; using UnityEngine; using UnityEngine.UIElements; @@ -32,12 +31,20 @@ public class MenuPanel : MonoBehaviour private MenuTabBinding _current; private UIDocument _tabSurfaceDocument; private readonly AetheriaEveUnitySurfaceChrome _tabSurfaceChrome = new AetheriaEveUnitySurfaceChrome(); - private CultMeshReactiveDocument _currentDocking; + private AetheriaUnityObservedEntityIndex _observedEntityIndex; + private AetheriaUnityObservedDockingIndex _observedDockingIndex; public MenuTab CurrentTab { get; private set; } public void SetObservedEntityIndex(AetheriaUnityObservedEntityIndex observedEntityIndex) { + if (!ReferenceEquals(_observedEntityIndex, observedEntityIndex)) + { + _observedDockingIndex?.Dispose(); + _observedDockingIndex = null; + } + + _observedEntityIndex = observedEntityIndex; } public void ShowTab(MenuTab tab) @@ -100,8 +107,8 @@ public class MenuPanel : MonoBehaviour _tabSurfaceDocument = null; } - _currentDocking?.Dispose(); - _currentDocking = null; + _observedDockingIndex?.Dispose(); + _observedDockingIndex = null; } private void RenderTabSurface() @@ -159,7 +166,9 @@ public class MenuPanel : MonoBehaviour private MenuTabBinding[] ResolveVisibleTabs() { - var isDocked = TryResolveCurrentDocking(out var docking) && docking.IsDocked; + var isDocked = TryResolveObservedDockingIndex(out var dockingIndex) && + dockingIndex.TryResolveCurrentDocking(out var docking) && + docking.IsDocked; return _tabs.Values .Where(tabBinding => !tabBinding.RequireDock || isDocked) .Where(tabBinding => tabBinding.Tab != MenuTab.Local || isDocked) @@ -167,21 +176,14 @@ public class MenuPanel : MonoBehaviour .ToArray(); } - private bool TryResolveCurrentDocking(out AetheriaRuntimeCurrentDockingDocument docking) + private bool TryResolveObservedDockingIndex(out AetheriaUnityObservedDockingIndex dockingIndex) { - docking = null; - try - { - _currentDocking ??= AetheriaUnityRuntimeClientProvider - .ReactiveCurrentDocking("unity-runtime-menu-tabs"); - docking = _currentDocking.Current; - return docking != null; - } - catch (Exception ex) - { - Debug.LogWarning($"Failed to read Aetheria current docking for runtime menu tabs: {ex.Message}"); + dockingIndex = null; + if (_observedEntityIndex == null) return false; - } + + dockingIndex = _observedDockingIndex ??= new AetheriaUnityObservedDockingIndex(_observedEntityIndex); + return true; } private static string GetTabLabel(MenuTabBinding tabBinding) diff --git a/Assets/Scripts/UI/Menu/TradeMenu.cs b/Assets/Scripts/UI/Menu/TradeMenu.cs index dac89a09e..d633d7122 100644 --- a/Assets/Scripts/UI/Menu/TradeMenu.cs +++ b/Assets/Scripts/UI/Menu/TradeMenu.cs @@ -39,8 +39,8 @@ public class TradeMenu : MonoBehaviour private UIDocument _tradeItemSurfaceDocument; private CultMeshReactiveDocument _catalog; private CultMeshReactiveDocument _playerSettings; - private CultMeshReactiveDocument _currentDocking; - private CultMeshReactiveDocument _stationRefit; + private AetheriaUnityObservedEntityIndex _observedEntityIndex; + private AetheriaUnityObservedDockingIndex _observedDockingIndex; private readonly AetheriaEveUnitySurfaceChrome _cargoSelectorSurfaceChrome = PanelChrome(360f, 420f, Align.FlexEnd); private readonly AetheriaEveUnitySurfaceChrome _filterSurfaceChrome = PanelChrome(420f, 520f, Align.FlexStart); private readonly AetheriaEveUnitySurfaceChrome _rowActionSurfaceChrome = PanelChrome(320f, 360f, Align.FlexStart); @@ -56,7 +56,13 @@ public class TradeMenu : MonoBehaviour public void SetObservedEntityIndex(AetheriaUnityObservedEntityIndex observedEntityIndex) { - InvalidateStationRefit(); + if (!ReferenceEquals(_observedEntityIndex, observedEntityIndex)) + { + _observedDockingIndex?.Dispose(); + _observedDockingIndex = null; + } + + _observedEntityIndex = observedEntityIndex; } private void OnEnable() @@ -512,43 +518,26 @@ public class TradeMenu : MonoBehaviour private AetheriaRuntimeStationRefitDocument StationRefitSnapshot() { - if (_stationRefit != null) - return _stationRefit.Current; - - try - { - _stationRefit = AetheriaUnityRuntimeClientProvider - .ReactiveStationRefit("unity-trade"); - } - catch (Exception ex) - { - Debug.LogWarning($"Failed to bind Aetheria station refit state for trade menu: {ex.Message}"); - } - - return _stationRefit?.Current; + return TryResolveObservedDockingIndex(out var dockingIndex) + ? dockingIndex.StationRefitSnapshot() + : null; } private bool TryResolveCurrentDocking(out AetheriaRuntimeCurrentDockingDocument docking) { docking = null; - try - { - _currentDocking ??= AetheriaUnityRuntimeClientProvider - .ReactiveCurrentDocking("unity-trade"); - docking = _currentDocking.Current; - return docking != null; - } - catch (Exception ex) - { - Debug.LogWarning($"Failed to read Aetheria docking state for trade menu: {ex.Message}"); - return false; - } + return TryResolveObservedDockingIndex(out var dockingIndex) && + dockingIndex.TryResolveCurrentDocking(out docking); } - private void InvalidateStationRefit() + private bool TryResolveObservedDockingIndex(out AetheriaUnityObservedDockingIndex dockingIndex) { - _stationRefit?.Dispose(); - _stationRefit = null; + dockingIndex = null; + if (_observedEntityIndex == null) + return false; + + dockingIndex = _observedDockingIndex ??= new AetheriaUnityObservedDockingIndex(_observedEntityIndex); + return true; } private bool TryResolveStationRefitCargoTarget( @@ -587,7 +576,6 @@ public class TradeMenu : MonoBehaviour try { submit(AetheriaUnityRuntimeClientProvider.Control("unity-trade")); - InvalidateStationRefit(); return true; } catch (Exception ex) @@ -601,12 +589,10 @@ public class TradeMenu : MonoBehaviour { _catalog?.Dispose(); _playerSettings?.Dispose(); - _currentDocking?.Dispose(); - _stationRefit?.Dispose(); + _observedDockingIndex?.Dispose(); _catalog = null; _playerSettings = null; - _currentDocking = null; - _stationRefit = null; + _observedDockingIndex = null; } private AetheriaRuntimeCatalogSnapshot CatalogSnapshot()