[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"));
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;
+ }
}
}
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<GameplayState>, IOnStateExited<GameplayState>
+public sealed class AdminUIController : UIController, IOnStateEntered<GameplayState>, IOnStateEntered<LobbyState>, IOnSystemChanged<AdminSystem>
{
[Dependency] private readonly IClientAdminManager _admin = default!;
[Dependency] private readonly IClientConGroupController _conGroups = default!;
public void OnStateEntered(GameplayState state)
{
- DebugTools.Assert(_window == null);
+ EnsureWindow();
+ AdminStatusUpdated();
+ }
+
+ public void OnStateEntered(LobbyState state)
+ {
+ EnsureWindow();
+ AdminStatusUpdated();
+ }
+
+ public void OnSystemLoaded(AdminSystem system)
+ {
+ EnsureWindow();
+
+ _admin.AdminStatusUpdated += AdminStatusUpdated;
+ _input.SetInputCommand(ContentKeyFunctions.OpenAdminMenu,
+ InputCmdHandler.FromDelegate(_ => Toggle()));
+ }
+
+ public void OnSystemUnloaded(AdminSystem system)
+ {
+ if (_window != null)
+ _window.Dispose();
+
+ _admin.AdminStatusUpdated -= AdminStatusUpdated;
+
+ CommandBinds.Unregister<AdminUIController>();
+ }
+
+ private void EnsureWindow()
+ {
+ if (_window is { Disposed: false })
+ return;
+
+ if (_window?.Disposed ?? false)
+ OnWindowDisposed();
_window = UIManager.CreateWindow<AdminMenuWindow>();
LayoutContainer.SetAnchorPreset(_window, LayoutContainer.LayoutPreset.Center);
_window.ObjectsTabControl.OnEntryPressed += ObjectsTabEntryPressed;
_window.OnOpen += OnWindowOpen;
_window.OnClose += OnWindowClosed;
- _admin.AdminStatusUpdated += AdminStatusUpdated;
-
- _input.SetInputCommand(ContentKeyFunctions.OpenAdminMenu,
- InputCmdHandler.FromDelegate(_ => Toggle()));
-
- AdminStatusUpdated();
+ _window.OnDisposed += OnWindowDisposed;
}
public void UnloadButton()
AdminButton.Pressed = false;
}
- public void OnStateExited(GameplayState state)
+ private void OnWindowDisposed()
{
- if (_window != null)
- {
- _window.PlayerTabControl.OnEntryPressed -= PlayerTabEntryPressed;
- _window.ObjectsTabControl.OnEntryPressed -= ObjectsTabEntryPressed;
- _window.OnOpen -= OnWindowOpen;
- _window.OnClose -= OnWindowClosed;
-
- _window.Dispose();
- _window = null;
- }
+ if (AdminButton != null)
+ AdminButton.Pressed = false;
- _admin.AdminStatusUpdated -= AdminStatusUpdated;
+ if (_window == null)
+ return;
- CommandBinds.Unregister<AdminUIController>();
+ _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)