Hud refactor (#7202)
Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com> Co-authored-by: Jezithyr <jmaster9999@gmail.com> Co-authored-by: Jezithyr <Jezithyr@gmail.com> Co-authored-by: Visne <39844191+Visne@users.noreply.github.com> Co-authored-by: wrexbe <wrexbe@protonmail.com> Co-authored-by: wrexbe <81056464+wrexbe@users.noreply.github.com>
This commit is contained in:
@@ -1,184 +0,0 @@
|
||||
using Content.Client.Administration.Managers;
|
||||
using Content.Client.Administration.UI;
|
||||
using Content.Client.Administration.UI.Tabs.ObjectsTab;
|
||||
using Content.Client.Administration.UI.Tabs.PlayerTab;
|
||||
using Content.Client.HUD;
|
||||
using Content.Client.Verbs;
|
||||
using Content.Shared.Input;
|
||||
using Robust.Client.Console;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Input;
|
||||
using Robust.Client.ResourceManagement;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
using Robust.Shared.Input;
|
||||
using Robust.Shared.Input.Binding;
|
||||
using Robust.Shared.Network;
|
||||
|
||||
namespace Content.Client.Administration.Systems
|
||||
{
|
||||
public sealed partial class AdminSystem
|
||||
{
|
||||
[Dependency] private readonly INetManager _netManager = default!;
|
||||
[Dependency] private readonly IInputManager _inputManager = default!;
|
||||
[Dependency] private readonly IGameHud _gameHud = default!;
|
||||
[Dependency] private readonly IClientAdminManager _clientAdminManager = default!;
|
||||
[Dependency] private readonly IClientConGroupController _clientConGroupController = default!;
|
||||
[Dependency] private readonly IClientConsoleHost _clientConsoleHost = default!;
|
||||
|
||||
[Dependency] private readonly VerbSystem _verbSystem = default!;
|
||||
|
||||
private AdminMenuWindow? _window;
|
||||
private readonly List<BaseWindow> _commandWindows = new();
|
||||
|
||||
private void InitializeMenu()
|
||||
{
|
||||
// Reset the AdminMenu Window on disconnect
|
||||
_netManager.Disconnect += (_, _) => ResetWindow();
|
||||
|
||||
_inputManager.SetInputCommand(ContentKeyFunctions.OpenAdminMenu,
|
||||
InputCmdHandler.FromDelegate(_ => Toggle()));
|
||||
|
||||
_clientAdminManager.AdminStatusUpdated += () =>
|
||||
{
|
||||
// when status changes, show the top button if we can open admin menu.
|
||||
// if we can't or we lost admin status, close it and hide the button.
|
||||
_gameHud.AdminButtonVisible = CanOpen();
|
||||
if (!_gameHud.AdminButtonVisible)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
};
|
||||
_gameHud.AdminButtonToggled += (open) =>
|
||||
{
|
||||
if (open)
|
||||
{
|
||||
TryOpen();
|
||||
}
|
||||
else
|
||||
{
|
||||
Close();
|
||||
}
|
||||
};
|
||||
_gameHud.AdminButtonVisible = CanOpen();
|
||||
_gameHud.AdminButtonDown = false;
|
||||
}
|
||||
|
||||
|
||||
public void ResetWindow()
|
||||
{
|
||||
_window?.Close();
|
||||
_window?.Dispose();
|
||||
_window = null;
|
||||
|
||||
foreach (var window in _commandWindows)
|
||||
{
|
||||
window.Close();
|
||||
window.Dispose();
|
||||
}
|
||||
|
||||
_commandWindows.Clear();
|
||||
}
|
||||
|
||||
public void OpenCommand(BaseWindow window)
|
||||
{
|
||||
_commandWindows.Add(window);
|
||||
window.OpenCentered();
|
||||
}
|
||||
|
||||
public void Open()
|
||||
{
|
||||
if (_window == null)
|
||||
{
|
||||
_window = new AdminMenuWindow();
|
||||
_window.OnClose += Close;
|
||||
}
|
||||
|
||||
_window.PlayerTabControl.OnEntryPressed += PlayerTabEntryPressed;
|
||||
_window.ObjectsTabControl.OnEntryPressed += ObjectsTabEntryPressed;
|
||||
_window.OpenCentered();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
if (_window != null)
|
||||
{
|
||||
_window.PlayerTabControl.OnEntryPressed -= PlayerTabEntryPressed;
|
||||
_window.ObjectsTabControl.OnEntryPressed -= ObjectsTabEntryPressed;
|
||||
}
|
||||
|
||||
_window?.Close();
|
||||
|
||||
foreach (var window in _commandWindows)
|
||||
window?.Dispose();
|
||||
_commandWindows.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the player can open the window
|
||||
/// </summary>
|
||||
/// <returns>True if the player is allowed</returns>
|
||||
public bool CanOpen()
|
||||
{
|
||||
return _clientConGroupController.CanAdminMenu();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the player can open the window and tries to open it
|
||||
/// </summary>
|
||||
public void TryOpen()
|
||||
{
|
||||
if (CanOpen())
|
||||
Open();
|
||||
}
|
||||
|
||||
public void Toggle()
|
||||
{
|
||||
if (_window != null && _window.IsOpen)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
TryOpen();
|
||||
}
|
||||
}
|
||||
|
||||
private void PlayerTabEntryPressed(BaseButton.ButtonEventArgs args)
|
||||
{
|
||||
if (args.Button is not PlayerTabEntry button
|
||||
|| button.PlayerUid == null)
|
||||
return;
|
||||
|
||||
var uid = button.PlayerUid.Value;
|
||||
var function = args.Event.Function;
|
||||
|
||||
if (function == EngineKeyFunctions.UIClick)
|
||||
_clientConsoleHost.ExecuteCommand($"vv {uid}");
|
||||
else if (function == EngineKeyFunctions.UseSecondary)
|
||||
_verbSystem.VerbMenu.OpenVerbMenu(uid, true);
|
||||
else
|
||||
return;
|
||||
|
||||
args.Event.Handle();
|
||||
}
|
||||
|
||||
private void ObjectsTabEntryPressed(BaseButton.ButtonEventArgs args)
|
||||
{
|
||||
if (args.Button is not ObjectsTabEntry button)
|
||||
return;
|
||||
|
||||
var uid = button.AssocEntity;
|
||||
var function = args.Event.Function;
|
||||
|
||||
if (function == EngineKeyFunctions.UIClick)
|
||||
_clientConsoleHost.ExecuteCommand($"vv {uid}");
|
||||
else if (function == EngineKeyFunctions.UseSecondary)
|
||||
_verbSystem.VerbMenu.OpenVerbMenu(uid, true);
|
||||
else
|
||||
return;
|
||||
|
||||
args.Event.Handle();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,6 @@ namespace Content.Client.Administration.Systems
|
||||
base.Initialize();
|
||||
|
||||
InitializeOverlay();
|
||||
InitializeMenu();
|
||||
SubscribeNetworkEvent<FullPlayerListEvent>(OnPlayerListChanged);
|
||||
SubscribeNetworkEvent<PlayerInfoChangedEvent>(OnPlayerInfoChanged);
|
||||
SubscribeNetworkEvent<RoundRestartCleanupEvent>(OnRoundRestartCleanup);
|
||||
|
||||
@@ -1,150 +1,18 @@
|
||||
#nullable enable
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Content.Client.Administration.Managers;
|
||||
using Content.Client.Administration.UI;
|
||||
using Content.Client.Administration.UI.CustomControls;
|
||||
using Content.Client.HUD;
|
||||
using Content.Shared.Administration;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Client.Administration.Systems
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public sealed class BwoinkSystem : SharedBwoinkSystem
|
||||
{
|
||||
[Dependency] private readonly IClientAdminManager _adminManager = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IClyde _clyde = default!;
|
||||
[Dependency] private readonly IGameHud _hud = default!;
|
||||
|
||||
private BwoinkWindow? _adminWindow;
|
||||
private DefaultWindow? _plainWindow;
|
||||
private readonly Dictionary<NetUserId, BwoinkPanel> _activePanelMap = new();
|
||||
|
||||
public bool IsOpen => (_adminWindow?.IsOpen ?? false) || (_plainWindow?.IsOpen ?? false);
|
||||
|
||||
public event Action? AdminReceivedAHelp;
|
||||
public event Action? AdminOpenedAHelp;
|
||||
public event EventHandler<BwoinkTextMessage>? OnBwoinkTextMessageRecieved;
|
||||
|
||||
protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySessionEventArgs eventArgs)
|
||||
{
|
||||
base.OnBwoinkTextMessage(message, eventArgs);
|
||||
LogBwoink(message);
|
||||
// Actual line
|
||||
var window = EnsurePanel(message.UserId);
|
||||
window.ReceiveLine(message);
|
||||
// Play a sound if we didn't send it
|
||||
var localPlayer = _playerManager.LocalPlayer;
|
||||
if (localPlayer?.UserId != message.TrueSender)
|
||||
{
|
||||
SoundSystem.Play("/Audio/Effects/adminhelp.ogg", Filter.Local());
|
||||
_clyde.RequestWindowAttention();
|
||||
}
|
||||
|
||||
// If they're not an admin force it open so they read
|
||||
// If it's admin-admin messaging then eh.
|
||||
if (!_adminManager.HasFlag(AdminFlags.Adminhelp))
|
||||
_plainWindow?.Open();
|
||||
else
|
||||
{
|
||||
_adminWindow?.OnBwoink(message.UserId);
|
||||
|
||||
if (_adminWindow?.IsOpen == true)
|
||||
return;
|
||||
AdminReceivedAHelp?.Invoke();
|
||||
_hud.SetInfoRed(true);
|
||||
}
|
||||
}
|
||||
|
||||
public bool TryGetChannel(NetUserId ch, [NotNullWhen(true)] out BwoinkPanel? bp) => _activePanelMap.TryGetValue(ch, out bp);
|
||||
|
||||
private BwoinkPanel EnsureAdmin(NetUserId channelId)
|
||||
{
|
||||
_adminWindow ??= new BwoinkWindow(this);
|
||||
|
||||
if (!_activePanelMap.TryGetValue(channelId, out var existingPanel))
|
||||
{
|
||||
_activePanelMap[channelId] = existingPanel = new BwoinkPanel(this, channelId);
|
||||
existingPanel.Visible = false;
|
||||
if (!_adminWindow.BwoinkArea.Children.Contains(existingPanel))
|
||||
_adminWindow.BwoinkArea.AddChild(existingPanel);
|
||||
}
|
||||
|
||||
return existingPanel;
|
||||
}
|
||||
|
||||
private BwoinkPanel EnsurePlain(NetUserId channelId)
|
||||
{
|
||||
BwoinkPanel bp;
|
||||
if (_plainWindow is null)
|
||||
{
|
||||
bp = new BwoinkPanel(this, channelId);
|
||||
_plainWindow = new DefaultWindow()
|
||||
{
|
||||
TitleClass="windowTitleAlert",
|
||||
HeaderClass="windowHeaderAlert",
|
||||
Title=Loc.GetString("bwoink-user-title"),
|
||||
SetSize=(400, 200),
|
||||
};
|
||||
|
||||
_plainWindow.Contents.AddChild(bp);
|
||||
}
|
||||
else
|
||||
{
|
||||
bp = (BwoinkPanel) _plainWindow.Contents.GetChild(0);
|
||||
}
|
||||
|
||||
return bp;
|
||||
}
|
||||
|
||||
public BwoinkPanel EnsurePanel(NetUserId channelId)
|
||||
{
|
||||
if (_adminManager.HasFlag(AdminFlags.Adminhelp))
|
||||
return EnsureAdmin(channelId);
|
||||
|
||||
return EnsurePlain(channelId);
|
||||
}
|
||||
|
||||
public void Open(NetUserId? channelId = null)
|
||||
{
|
||||
if (channelId == null)
|
||||
{
|
||||
var localPlayer = _playerManager.LocalPlayer;
|
||||
if (localPlayer != null)
|
||||
Open(localPlayer.UserId);
|
||||
return;
|
||||
}
|
||||
|
||||
_hud.SetInfoRed(false);
|
||||
AdminOpenedAHelp?.Invoke();
|
||||
|
||||
if (_adminManager.HasFlag(AdminFlags.Adminhelp))
|
||||
{
|
||||
SelectChannel(channelId.Value);
|
||||
_adminWindow?.Open();
|
||||
return;
|
||||
}
|
||||
|
||||
EnsurePlain(channelId.Value);
|
||||
_plainWindow?.Open();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
_adminWindow?.Close();
|
||||
_plainWindow?.Close();
|
||||
}
|
||||
|
||||
private void SelectChannel(NetUserId uid)
|
||||
{
|
||||
_adminWindow ??= new BwoinkWindow(this);
|
||||
_adminWindow.SelectChannel(uid);
|
||||
OnBwoinkTextMessageRecieved?.Invoke(this, message);
|
||||
}
|
||||
|
||||
public void Send(NetUserId channelId, string text)
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
using Content.Client.Administration.UI.Tabs;
|
||||
using Content.Client.HUD;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.CustomControls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Localization;
|
||||
|
||||
namespace Content.Client.Administration.UI
|
||||
{
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class AdminMenuWindow : DefaultWindow
|
||||
{
|
||||
[Dependency] private readonly IGameHud? _gameHud = default!;
|
||||
|
||||
public AdminMenuWindow()
|
||||
{
|
||||
MinSize = (500, 250);
|
||||
@@ -27,19 +21,5 @@ 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 EnteredTree()
|
||||
{
|
||||
base.EnteredTree();
|
||||
if (_gameHud != null)
|
||||
_gameHud.AdminButtonDown = true;
|
||||
}
|
||||
|
||||
protected override void ExitedTree()
|
||||
{
|
||||
base.ExitedTree();
|
||||
if (_gameHud != null)
|
||||
_gameHud.AdminButtonDown = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using Content.Client.Administration.Systems;
|
||||
using Content.Client.Administration.UI.CustomControls;
|
||||
using Content.Client.Administration.UI.Tabs.AdminTab;
|
||||
using Content.Client.Stylesheets;
|
||||
using Content.Client.UserInterface.Systems.Bwoink;
|
||||
using Content.Shared.Administration;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.Console;
|
||||
@@ -27,15 +28,16 @@ namespace Content.Client.Administration.UI
|
||||
{
|
||||
[Dependency] private readonly IClientAdminManager _adminManager = default!;
|
||||
[Dependency] private readonly IClientConsoleHost _console = default!;
|
||||
private readonly AdminAHelpUIHandler _adminAHelpHelper;
|
||||
|
||||
private readonly BwoinkSystem _bwoinkSystem;
|
||||
//private readonly BwoinkSystem _bwoinkSystem;
|
||||
private PlayerInfo? _currentPlayer = default;
|
||||
|
||||
public BwoinkWindow(BwoinkSystem bs)
|
||||
public BwoinkWindow(AdminAHelpUIHandler adminAHelpHelper)
|
||||
{
|
||||
_adminAHelpHelper = adminAHelpHelper;
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
_bwoinkSystem = bs;
|
||||
|
||||
_adminManager.AdminStatusUpdated += FixButtons;
|
||||
FixButtons();
|
||||
@@ -57,7 +59,7 @@ namespace Content.Client.Administration.UI
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(info.Connected ? '●' : '○');
|
||||
sb.Append(' ');
|
||||
if (_bwoinkSystem.TryGetChannel(info.SessionId, out var panel) && panel.Unread > 0)
|
||||
if (_adminAHelpHelper.TryGetChannel(info.SessionId, out var panel) && panel.Unread > 0)
|
||||
{
|
||||
if (panel.Unread < 11)
|
||||
sb.Append(new Rune('➀' + (panel.Unread-1)));
|
||||
@@ -76,8 +78,8 @@ namespace Content.Client.Administration.UI
|
||||
|
||||
ChannelSelector.Comparison = (a, b) =>
|
||||
{
|
||||
var aChannelExists = _bwoinkSystem.TryGetChannel(a.SessionId, out var ach);
|
||||
var bChannelExists = _bwoinkSystem.TryGetChannel(b.SessionId, out var bch);
|
||||
var aChannelExists = _adminAHelpHelper.TryGetChannel(a.SessionId, out var ach);
|
||||
var bChannelExists = _adminAHelpHelper.TryGetChannel(b.SessionId, out var bch);
|
||||
if (!aChannelExists && !bChannelExists)
|
||||
return 0;
|
||||
|
||||
@@ -174,7 +176,7 @@ namespace Content.Client.Administration.UI
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(pl.Connected ? '●' : '○');
|
||||
sb.Append(' ');
|
||||
if (_bwoinkSystem.TryGetChannel(pl.SessionId, out var panel) && panel.Unread > 0)
|
||||
if (_adminAHelpHelper.TryGetChannel(pl.SessionId, out var panel) && panel.Unread > 0)
|
||||
{
|
||||
if (panel.Unread < 11)
|
||||
sb.Append(new Rune('➀' + (panel.Unread-1)));
|
||||
@@ -200,7 +202,7 @@ namespace Content.Client.Administration.UI
|
||||
{
|
||||
foreach (var bw in BwoinkArea.Children)
|
||||
bw.Visible = false;
|
||||
var panel = _bwoinkSystem.EnsurePanel(ch);
|
||||
var panel = _adminAHelpHelper.EnsurePanel(ch);
|
||||
panel.Visible = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using Content.Client.Administration.Systems;
|
||||
using Content.Client.UserInterface.Systems.Bwoink;
|
||||
using Content.Shared.Administration;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
@@ -13,17 +14,15 @@ namespace Content.Client.Administration.UI.CustomControls
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class BwoinkPanel : BoxContainer
|
||||
{
|
||||
private readonly BwoinkSystem _bwoinkSystem;
|
||||
public readonly NetUserId ChannelId;
|
||||
private readonly Action<string> _messageSender;
|
||||
|
||||
public int Unread { get; private set; } = 0;
|
||||
public DateTime LastMessage { get; private set; } = DateTime.MinValue;
|
||||
|
||||
public BwoinkPanel(BwoinkSystem bwoinkSys, NetUserId userId)
|
||||
public BwoinkPanel(Action<string> messageSender)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
_bwoinkSystem = bwoinkSys;
|
||||
ChannelId = userId;
|
||||
_messageSender = messageSender;
|
||||
|
||||
OnVisibilityChanged += c =>
|
||||
{
|
||||
@@ -38,7 +37,7 @@ namespace Content.Client.Administration.UI.CustomControls
|
||||
if (string.IsNullOrWhiteSpace(args.Text))
|
||||
return;
|
||||
|
||||
_bwoinkSystem.Send(ChannelId, args.Text);
|
||||
_messageSender.Invoke(args.Text);
|
||||
SenderLineEdit.Clear();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user