Files
OldThink/Content.Client/_White/SecurityHud/SecurityHudBUI.cs
keslik 775fd5e96c [Tweak] Security statuses micro update (#629)
* Tweak: Sec statuses update WIP

* fix: Для новых статусов требуется указать причину

* Fix: for review
2024-08-16 23:46:26 +03:00

135 lines
4.8 KiB
C#

using System.Linq;
using Content.Client._White.UserInterface.Radial;
using Content.Shared._White.SecurityHud;
using Content.Shared.Security;
using Content.Shared.StatusIcon;
using Robust.Shared.Prototypes;
namespace Content.Client._White.SecurityHud;
public sealed class SecurityHudBUI : BoundUserInterface
{
private RadialContainer? _radialContainer;
private bool _updated;
private readonly Dictionary<string, string> _names = new()
{
{ "SecurityIconDemote", Loc.GetString("criminal-records-status-demote")}, // WD start
{ "SecurityIconParoled", Loc.GetString("criminal-records-status-paroled")},
{ "SecurityIconSuspected", Loc.GetString("criminal-records-status-suspected")},
{ "SecurityIconWanted", Loc.GetString("criminal-records-status-wanted")},
{ "SecurityIconIncarcerated", Loc.GetString("criminal-records-status-detained")},
{ "SecurityIconExecute", Loc.GetString("criminal-records-status-execute")},
{ "SecurityIconMonitoring", Loc.GetString("criminal-records-status-monitoring")},
{ "SecurityIconReleased", Loc.GetString("criminal-records-status-released")},
{ "SecurityIconSearch", Loc.GetString("criminal-records-status-search")},
{ "CriminalRecordIconRemove", Loc.GetString("security-hud-remove-status") }
};
private readonly Dictionary<string, string> _icons = new()
{
{ "SecurityIconDemote", "/Textures/White/Interface/securityhud.rsi/demote.png" },
{ "SecurityIconParoled", "/Textures/White/Interface/securityhud.rsi/paroled.png" },
{ "SecurityIconSuspected", "/Textures/White/Interface/securityhud.rsi/suspected.png" },
{ "SecurityIconWanted", "/Textures/White/Interface/securityhud.rsi/wanted.png" },
{ "SecurityIconIncarcerated", "/Textures/White/Interface/securityhud.rsi/incarcerated.png" },
{ "SecurityIconExecute", "/Textures/White/Interface/securityhud.rsi/execute.png" },
{ "SecurityIconMonitoring", "/Textures/White/Interface/securityhud.rsi/monitoring.png" },
{ "SecurityIconReleased", "/Textures/White/Interface/securityhud.rsi/released.png" },
{ "SecurityIconSearch", "/Textures/White/Interface/securityhud.rsi/search.png" },
{ "CriminalRecordIconRemove", "/Textures/White/Interface/securityhud.rsi/remove.png" }
};
private readonly Dictionary<string, SecurityStatus> _status = new()
{
{ "SecurityIconDemote", SecurityStatus.Demote },
{ "SecurityIconParoled", SecurityStatus.Paroled },
{ "SecurityIconSuspected", SecurityStatus.Suspected },
{ "SecurityIconWanted", SecurityStatus.Wanted },
{ "SecurityIconIncarcerated", SecurityStatus.Detained },
{ "SecurityIconExecute", SecurityStatus.Execute },
{ "SecurityIconMonitoring", SecurityStatus.Monitoring },
{ "SecurityIconReleased", SecurityStatus.Released },
{ "SecurityIconSearch", SecurityStatus.Search }, // WD end
{ "CriminalRecordIconRemove", SecurityStatus.None }
};
public SecurityHudBUI(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
protected override void Open()
{
base.Open();
if (_radialContainer != null)
UIReset();
_radialContainer = new RadialContainer();
_radialContainer.Closed += Close;
if (State != null)
UpdateState(State);
}
private void UIReset()
{
_radialContainer?.Close();
_radialContainer = null;
_updated = false;
}
private void PopulateRadial(IReadOnlyCollection<string> ids, NetEntity user, NetEntity target)
{
foreach (var id in ids)
{
if (_radialContainer == null)
continue;
if(!_names.TryGetValue(id, out var name) || !_icons.TryGetValue(id, out var icon) || !_status.TryGetValue(id, out var status))
return;
var button = _radialContainer.AddButton(name, icon);
button.Controller.OnPressed += _ =>
{
Select(status, user, target);
};
}
}
private void Select(SecurityStatus status, NetEntity user, NetEntity target)
{
SendMessage(new SecurityHudStatusSelectedMessage(status, user, target));
UIReset();
Close();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
UIReset();
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (_updated)
return;
if (state is SecurityHudBUIState newState)
{
PopulateRadial(newState.Ids, newState.User, newState.Target);
}
if (_radialContainer == null)
return;
_radialContainer?.OpenAttachedLocalPlayer();
_updated = true;
}
}