using Content.Client.Alerts; using Content.Client.Gameplay; using Content.Client.UserInterface.Systems.Alerts.Widgets; using Content.Client.UserInterface.Systems.Gameplay; using Content.Shared.Alert; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; namespace Content.Client.UserInterface.Systems.Alerts; public sealed class AlertsUIController : UIController, IOnStateEntered, IOnSystemChanged { [UISystemDependency] private readonly ClientAlertsSystem? _alertsSystem = default; private AlertsUI? UI => UIManager.GetActiveUIWidgetOrNull(); public override void Initialize() { base.Initialize(); var gameplayStateLoad = UIManager.GetUIController(); gameplayStateLoad.OnScreenLoad += OnScreenLoad; gameplayStateLoad.OnScreenUnload += OnScreenUnload; } private void OnScreenUnload() { var widget = UI; if (widget != null) widget.AlertPressed -= OnAlertPressed; } private void OnScreenLoad() { var widget = UI; if (widget != null) widget.AlertPressed += OnAlertPressed; SyncAlerts(); } private void OnAlertPressed(object? sender, AlertType e) { _alertsSystem?.AlertClicked(e); } private void SystemOnClearAlerts(object? sender, EventArgs e) { UI?.ClearAllControls(); } private void SystemOnSyncAlerts(object? sender, IReadOnlyDictionary e) { if (sender is ClientAlertsSystem system) { UI?.SyncControls(system, system.AlertOrder, e); } } public void OnSystemLoaded(ClientAlertsSystem system) { system.SyncAlerts += SystemOnSyncAlerts; system.ClearAlerts += SystemOnClearAlerts; } public void OnSystemUnloaded(ClientAlertsSystem system) { system.SyncAlerts -= SystemOnSyncAlerts; system.ClearAlerts -= SystemOnClearAlerts; } public void OnStateEntered(GameplayState state) { // initially populate the frame if system is available SyncAlerts(); } public void SyncAlerts() { var alerts = _alertsSystem?.ActiveAlerts; if (alerts != null) { SystemOnSyncAlerts(_alertsSystem, alerts); } } }