diff --git a/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs b/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs index 385dbb4cee..5af97d848c 100644 --- a/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs +++ b/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs @@ -7,12 +7,13 @@ namespace Content.Client.Administration.UI [GenerateTypedNameReferences] public sealed partial class AdminMenuWindow : DefaultWindow { + public event Action? OnDisposed; + public AdminMenuWindow() { MinSize = (500, 250); Title = Loc.GetString("admin-menu-title"); RobustXamlLoader.Load(this); - IoCManager.InjectDependencies(this); MasterTabContainer.SetTabTitle(0, Loc.GetString("admin-menu-admin-tab")); MasterTabContainer.SetTabTitle(1, Loc.GetString("admin-menu-adminbus-tab")); MasterTabContainer.SetTabTitle(2, Loc.GetString("admin-menu-atmos-tab")); @@ -21,5 +22,12 @@ namespace Content.Client.Administration.UI MasterTabContainer.SetTabTitle(5, Loc.GetString("admin-menu-players-tab")); MasterTabContainer.SetTabTitle(6, Loc.GetString("admin-menu-objects-tab")); } + + protected override void Dispose(bool disposing) + { + OnDisposed?.Invoke(); + base.Dispose(disposing); + OnDisposed = null; + } } } diff --git a/Content.Client/UserInterface/Systems/Admin/AdminUIController.cs b/Content.Client/UserInterface/Systems/Admin/AdminUIController.cs index c53f7d6752..60d475a4d2 100644 --- a/Content.Client/UserInterface/Systems/Admin/AdminUIController.cs +++ b/Content.Client/UserInterface/Systems/Admin/AdminUIController.cs @@ -1,27 +1,26 @@ using Content.Client.Administration.Managers; +using Content.Client.Administration.Systems; using Content.Client.Administration.UI; using Content.Client.Administration.UI.Tabs.ObjectsTab; using Content.Client.Administration.UI.Tabs.PlayerTab; using Content.Client.Gameplay; +using Content.Client.Lobby; using Content.Client.UserInterface.Controls; -using Content.Client.Verbs; using Content.Client.Verbs.UI; using Content.Shared.Input; using JetBrains.Annotations; using Robust.Client.Console; using Robust.Client.Input; -using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; using Robust.Client.UserInterface.Controls; using Robust.Shared.Input; using Robust.Shared.Input.Binding; -using Robust.Shared.Utility; using static Robust.Client.UserInterface.Controls.BaseButton; namespace Content.Client.UserInterface.Systems.Admin; [UsedImplicitly] -public sealed class AdminUIController : UIController, IOnStateEntered, IOnStateExited +public sealed class AdminUIController : UIController, IOnStateEntered, IOnStateEntered, IOnSystemChanged { [Dependency] private readonly IClientAdminManager _admin = default!; [Dependency] private readonly IClientConGroupController _conGroups = default!; @@ -34,7 +33,42 @@ public sealed class AdminUIController : UIController, IOnStateEntered Toggle())); + } + + public void OnSystemUnloaded(AdminSystem system) + { + if (_window != null) + _window.Dispose(); + + _admin.AdminStatusUpdated -= AdminStatusUpdated; + + CommandBinds.Unregister(); + } + + private void EnsureWindow() + { + if (_window is { Disposed: false }) + return; + + if (_window?.Disposed ?? false) + OnWindowDisposed(); _window = UIManager.CreateWindow(); LayoutContainer.SetAnchorPreset(_window, LayoutContainer.LayoutPreset.Center); @@ -43,12 +77,7 @@ public sealed class AdminUIController : UIController, IOnStateEntered Toggle())); - - AdminStatusUpdated(); + _window.OnDisposed += OnWindowDisposed; } public void UnloadButton() @@ -83,27 +112,26 @@ public sealed class AdminUIController : UIController, IOnStateEntered(); + _window.PlayerTabControl.OnEntryPressed -= PlayerTabEntryPressed; + _window.ObjectsTabControl.OnEntryPressed -= ObjectsTabEntryPressed; + _window.OnOpen -= OnWindowOpen; + _window.OnClose -= OnWindowClosed; + _window.OnDisposed -= OnWindowDisposed; + _window = null; } private void AdminStatusUpdated() { - AdminButton!.Visible = _conGroups.CanAdminMenu(); + if (AdminButton != null) + AdminButton.Visible = _conGroups.CanAdminMenu(); } private void AdminButtonPressed(ButtonEventArgs args)