diff --git a/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsComponent.cs b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsComponent.cs new file mode 100644 index 0000000000..57b713e9b7 --- /dev/null +++ b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Atmos.Monitor; + +namespace Content.Client.Atmos.Monitor; + +[RegisterComponent] +public sealed class AtmosAlarmableVisualsComponent : Component +{ + [DataField("layerMap")] + public string LayerMap { get; } = string.Empty; + + [DataField("alarmStates")] + public readonly Dictionary AlarmStates = new(); + + [DataField("hideOnDepowered")] + public readonly List? HideOnDepowered; + + // eh... + [DataField("setOnDepowered")] + public readonly Dictionary? SetOnDepowered; +} diff --git a/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsSystem.cs b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsSystem.cs new file mode 100644 index 0000000000..019f25f376 --- /dev/null +++ b/Content.Client/Atmos/Monitor/AtmosAlarmableVisualsSystem.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using Content.Shared.Atmos.Monitor; +using Content.Shared.Power; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Client.Atmos.Monitor; + +public sealed class AtmosAlarmableVisualsSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, AtmosAlarmableVisualsComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null || !args.Sprite.LayerMapTryGet(component.LayerMap, out var layer)) + return; + + if (!args.AppearanceData.TryGetValue(PowerDeviceVisuals.Powered, out var poweredObject) || + poweredObject is not bool powered) + { + return; + } + + if (component.HideOnDepowered != null) + { + foreach (var visLayer in component.HideOnDepowered) + { + if (args.Sprite.LayerMapTryGet(visLayer, out int powerVisibilityLayer)) + args.Sprite.LayerSetVisible(powerVisibilityLayer, powered); + } + } + + if (component.SetOnDepowered != null && !powered) + { + foreach (var (setLayer, powerState) in component.SetOnDepowered) + { + if (args.Sprite.LayerMapTryGet(setLayer, out int setStateLayer)) + args.Sprite.LayerSetState(setStateLayer, new RSI.StateId(powerState)); + } + } + + if (args.AppearanceData.TryGetValue(AtmosMonitorVisuals.AlarmType, out var alarmTypeObject) + && alarmTypeObject is AtmosAlarmType alarmType + && powered + && component.AlarmStates.TryGetValue(alarmType, out var state)) + { + args.Sprite.LayerSetState(layer, new RSI.StateId(state)); + } + } +} diff --git a/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs b/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs deleted file mode 100644 index 81118d5c5c..0000000000 --- a/Content.Client/Atmos/Monitor/AtmosMonitorVisualizer.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.Collections.Generic; -using Content.Shared.Atmos.Monitor; -using Content.Shared.Power; -using Robust.Client.GameObjects; -using Robust.Client.Graphics; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Maths; -using Robust.Shared.Serialization.Manager.Attributes; - -namespace Content.Client.Atmos.Monitor -{ - public sealed class AtmosMonitorVisualizer : AppearanceVisualizer - { - [Dependency] IEntityManager _entityManager = default!; - [DataField("layerMap")] - private string _layerMap { get; } = string.Empty; - - [DataField("alarmStates")] - private readonly Dictionary _alarmStates = new(); - - [DataField("hideOnDepowered")] - private readonly List? _hideOnDepowered; - - // eh... - [DataField("setOnDepowered")] - private readonly Dictionary? _setOnDepowered; - - [Obsolete("Subscribe to your component being initialised instead.")] - public override void InitializeEntity(EntityUid entity) - { - base.InitializeEntity(entity); - - IoCManager.InjectDependencies(this); - } - - [Obsolete("Subscribe to AppearanceChangeEvent instead.")] - public override void OnChangeData(AppearanceComponent component) - { - if (!_entityManager.TryGetComponent(component.Owner, out var sprite)) - return; - - if (!sprite.LayerMapTryGet(_layerMap, out int layer)) - return; - - if (component.TryGetData(PowerDeviceVisuals.Powered, out var powered)) - { - if (_hideOnDepowered != null) - foreach (var visLayer in _hideOnDepowered) - if (sprite.LayerMapTryGet(visLayer, out int powerVisibilityLayer)) - sprite.LayerSetVisible(powerVisibilityLayer, powered); - - if (_setOnDepowered != null && !powered) - foreach (var (setLayer, state) in _setOnDepowered) - if (sprite.LayerMapTryGet(setLayer, out int setStateLayer)) - sprite.LayerSetState(setStateLayer, new RSI.StateId(state)); - } - - if (component.TryGetData(AtmosMonitorVisuals.Offset, out Vector2 offset)) - { - sprite.Offset = offset; - } - - if (component.TryGetData(AtmosMonitorVisuals.AlarmType, out var alarmType) - && powered) - if (_alarmStates.TryGetValue(alarmType, out var state)) - sprite.LayerSetState(layer, new RSI.StateId(state)); - } - } -} diff --git a/Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs b/Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs index d7208d3a34..0b5fae2255 100644 --- a/Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs +++ b/Content.Client/Atmos/Monitor/UI/AirAlarmBoundUserInterface.cs @@ -6,82 +6,78 @@ using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; -namespace Content.Client.Atmos.Monitor.UI +namespace Content.Client.Atmos.Monitor.UI; + +public sealed class AirAlarmBoundUserInterface : BoundUserInterface { - public sealed class AirAlarmBoundUserInterface : BoundUserInterface + private AirAlarmWindow? _window; + + public AirAlarmBoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey) : base(owner, uiKey) { - private AirAlarmWindow? _window; + } - public AirAlarmBoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey) : base(owner, uiKey) - {} + protected override void Open() + { + base.Open(); - protected override void Open() + _window = new AirAlarmWindow(); + + if (State != null) { - base.Open(); - - _window = new AirAlarmWindow(); - - if (State != null) UpdateState(State); - - _window.OpenCentered(); - - _window.OnClose += Close; - _window.AtmosDeviceDataChanged += OnDeviceDataChanged; - _window.AtmosAlarmThresholdChanged += OnThresholdChanged; - _window.AirAlarmModeChanged += OnAirAlarmModeChanged; - _window.ResyncAllRequested += ResyncAllDevices; + UpdateState(State); } - private void ResyncAllDevices() + _window.OpenCentered(); + + _window.OnClose += Close; + _window.AtmosDeviceDataChanged += OnDeviceDataChanged; + _window.AtmosAlarmThresholdChanged += OnThresholdChanged; + _window.AirAlarmModeChanged += OnAirAlarmModeChanged; + _window.ResyncAllRequested += ResyncAllDevices; + _window.AirAlarmTabChange += OnTabChanged; + } + + private void ResyncAllDevices() + { + SendMessage(new AirAlarmResyncAllDevicesMessage()); + } + + private void OnDeviceDataChanged(string address, IAtmosDeviceData data) + { + SendMessage(new AirAlarmUpdateDeviceDataMessage(address, data)); + } + + private void OnAirAlarmModeChanged(AirAlarmMode mode) + { + SendMessage(new AirAlarmUpdateAlarmModeMessage(mode)); + } + + private void OnThresholdChanged(string address, AtmosMonitorThresholdType type, AtmosAlarmThreshold threshold, Gas? gas = null) + { + SendMessage(new AirAlarmUpdateAlarmThresholdMessage(address, type, threshold, gas)); + } + + private void OnTabChanged(AirAlarmTab tab) + { + SendMessage(new AirAlarmTabSetMessage(tab)); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (state is not AirAlarmUIState cast || _window == null) { - SendMessage(new AirAlarmResyncAllDevicesMessage()); + return; } - private void OnDeviceDataChanged(string address, IAtmosDeviceData data) - { - SendMessage(new AirAlarmUpdateDeviceDataMessage(address, data)); - } + _window.UpdateState(cast); + } - private void OnAirAlarmModeChanged(AirAlarmMode mode) - { - SendMessage(new AirAlarmUpdateAlarmModeMessage(mode)); - } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); - private void OnThresholdChanged(AtmosMonitorThresholdType type, AtmosAlarmThreshold threshold, Gas? gas = null) - { - SendMessage(new AirAlarmUpdateAlarmThresholdMessage(type, threshold, gas)); - } - - protected override void ReceiveMessage(BoundUserInterfaceMessage message) - { - if (_window == null) - return; - - switch (message) - { - case AirAlarmSetAddressMessage addrMsg: - _window.SetAddress(addrMsg.Address); - break; - case AirAlarmUpdateDeviceDataMessage deviceMsg: - _window.UpdateDeviceData(deviceMsg.Address, deviceMsg.Data); - break; - case AirAlarmUpdateAlarmModeMessage alarmMsg: - _window.UpdateModeSelector(alarmMsg.Mode); - break; - case AirAlarmUpdateAlarmThresholdMessage thresholdMsg: - _window.UpdateThreshold(ref thresholdMsg); - break; - case AirAlarmUpdateAirDataMessage airDataMsg: - _window.UpdateGasData(ref airDataMsg.AirData); - break; - } - } - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - - if (disposing) _window?.Dispose(); - } + if (disposing) _window?.Dispose(); } } diff --git a/Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml b/Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml index 76a1a41cdb..b8f18a8b3d 100644 --- a/Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml +++ b/Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml @@ -18,20 +18,22 @@ - - - - + + + + + + +