]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Make the admin menu openable in the lobby (#15444)
authorDrSmugleaf <DrSmugleaf@users.noreply.github.com>
Sun, 16 Apr 2023 06:06:01 +0000 (23:06 -0700)
committerGitHub <noreply@github.com>
Sun, 16 Apr 2023 06:06:01 +0000 (16:06 +1000)
Content.Client/Administration/UI/AdminMenuWindow.xaml.cs
Content.Client/UserInterface/Systems/Admin/AdminUIController.cs

index 385dbb4ceec03b16ffcb90fb1b82888f0c60db02..5af97d848c36110baf12e811727707c742cf1e48 100644 (file)
@@ -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;
+        }
     }
 }
index c53f7d67522066357e67a65c8739ab1b652440d2..60d475a4d28ffef989e1ef3484836afced080200 100644 (file)
@@ -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<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!;
@@ -34,7 +33,42 @@ public sealed class AdminUIController : UIController, IOnStateEntered<GameplaySt
 
     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);
@@ -43,12 +77,7 @@ public sealed class AdminUIController : UIController, IOnStateEntered<GameplaySt
         _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()
@@ -83,27 +112,26 @@ public sealed class AdminUIController : UIController, IOnStateEntered<GameplaySt
             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)