AlertControl.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System.Numerics;
  2. using Content.Client.Actions.UI;
  3. using Content.Client.Cooldown;
  4. using Content.Shared.Alert;
  5. using Robust.Client.GameObjects;
  6. using Robust.Client.UserInterface;
  7. using Robust.Client.UserInterface.Controls;
  8. using Robust.Shared.Timing;
  9. using Robust.Shared.Utility;
  10. namespace Content.Client.UserInterface.Systems.Alerts.Controls
  11. {
  12. public sealed class AlertControl : BaseButton
  13. {
  14. public AlertPrototype Alert { get; }
  15. /// <summary>
  16. /// Current cooldown displayed in this slot. Set to null to show no cooldown.
  17. /// </summary>
  18. public (TimeSpan Start, TimeSpan End)? Cooldown
  19. {
  20. get => _cooldown;
  21. set
  22. {
  23. _cooldown = value;
  24. if (SuppliedTooltip is ActionAlertTooltip actionAlertTooltip)
  25. {
  26. actionAlertTooltip.Cooldown = value;
  27. }
  28. }
  29. }
  30. private (TimeSpan Start, TimeSpan End)? _cooldown;
  31. private short? _severity;
  32. private readonly IGameTiming _gameTiming;
  33. private readonly IEntityManager _entityManager;
  34. private readonly SpriteView _icon;
  35. private readonly CooldownGraphic _cooldownGraphic;
  36. private EntityUid _spriteViewEntity;
  37. /// <summary>
  38. /// Creates an alert control reflecting the indicated alert + state
  39. /// </summary>
  40. /// <param name="alert">alert to display</param>
  41. /// <param name="severity">severity of alert, null if alert doesn't have severity levels</param>
  42. public AlertControl(AlertPrototype alert, short? severity)
  43. {
  44. _gameTiming = IoCManager.Resolve<IGameTiming>();
  45. _entityManager = IoCManager.Resolve<IEntityManager>();
  46. TooltipSupplier = SupplyTooltip;
  47. Alert = alert;
  48. _severity = severity;
  49. _icon = new SpriteView
  50. {
  51. Scale = new Vector2(2, 2)
  52. };
  53. SetupIcon();
  54. Children.Add(_icon);
  55. _cooldownGraphic = new CooldownGraphic
  56. {
  57. MaxSize = new Vector2(64, 64)
  58. };
  59. Children.Add(_cooldownGraphic);
  60. }
  61. private Control SupplyTooltip(Control? sender)
  62. {
  63. var msg = FormattedMessage.FromMarkupOrThrow(Loc.GetString(Alert.Name));
  64. var desc = FormattedMessage.FromMarkupOrThrow(Loc.GetString(Alert.Description));
  65. return new ActionAlertTooltip(msg, desc) {Cooldown = Cooldown};
  66. }
  67. /// <summary>
  68. /// Change the alert severity, changing the displayed icon
  69. /// </summary>
  70. public void SetSeverity(short? severity)
  71. {
  72. if (_severity == severity)
  73. return;
  74. _severity = severity;
  75. if (!_entityManager.TryGetComponent<SpriteComponent>(_spriteViewEntity, out var sprite))
  76. return;
  77. var icon = Alert.GetIcon(_severity);
  78. if (sprite.LayerMapTryGet(AlertVisualLayers.Base, out var layer))
  79. sprite.LayerSetSprite(layer, icon);
  80. }
  81. protected override void FrameUpdate(FrameEventArgs args)
  82. {
  83. base.FrameUpdate(args);
  84. UserInterfaceManager.GetUIController<AlertsUIController>().UpdateAlertSpriteEntity(_spriteViewEntity, Alert);
  85. if (!Cooldown.HasValue)
  86. {
  87. _cooldownGraphic.Visible = false;
  88. _cooldownGraphic.Progress = 0;
  89. return;
  90. }
  91. _cooldownGraphic.FromTime(Cooldown.Value.Start, Cooldown.Value.End);
  92. }
  93. private void SetupIcon()
  94. {
  95. if (!_entityManager.Deleted(_spriteViewEntity))
  96. _entityManager.QueueDeleteEntity(_spriteViewEntity);
  97. _spriteViewEntity = _entityManager.Spawn(Alert.AlertViewEntity);
  98. if (_entityManager.TryGetComponent<SpriteComponent>(_spriteViewEntity, out var sprite))
  99. {
  100. var icon = Alert.GetIcon(_severity);
  101. if (sprite.LayerMapTryGet(AlertVisualLayers.Base, out var layer))
  102. sprite.LayerSetSprite(layer, icon);
  103. }
  104. _icon.SetEntity(_spriteViewEntity);
  105. }
  106. protected override void EnteredTree()
  107. {
  108. base.EnteredTree();
  109. SetupIcon();
  110. }
  111. protected override void ExitedTree()
  112. {
  113. base.ExitedTree();
  114. if (!_entityManager.Deleted(_spriteViewEntity))
  115. _entityManager.QueueDeleteEntity(_spriteViewEntity);
  116. }
  117. protected override void Dispose(bool disposing)
  118. {
  119. base.Dispose(disposing);
  120. if (!_entityManager.Deleted(_spriteViewEntity))
  121. _entityManager.QueueDeleteEntity(_spriteViewEntity);
  122. }
  123. }
  124. public enum AlertVisualLayers : byte
  125. {
  126. Base
  127. }
  128. }