ChannelSelectorPopup.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using Content.Shared.Chat;
  2. using Robust.Client.UserInterface.Controls;
  3. using static Robust.Client.UserInterface.Controls.BaseButton;
  4. namespace Content.Client.UserInterface.Systems.Chat.Controls;
  5. public sealed class ChannelSelectorPopup : Popup
  6. {
  7. // order in which the channels show up in the channel selector
  8. public static readonly ChatSelectChannel[] ChannelSelectorOrder =
  9. {
  10. ChatSelectChannel.Local,
  11. ChatSelectChannel.Whisper,
  12. ChatSelectChannel.Emotes,
  13. ChatSelectChannel.Radio,
  14. ChatSelectChannel.LOOC,
  15. ChatSelectChannel.OOC,
  16. ChatSelectChannel.Dead,
  17. ChatSelectChannel.Admin
  18. // NOTE: Console is not in there and it can never be permanently selected.
  19. // You can, however, still submit commands as console by prefixing with /.
  20. };
  21. private readonly BoxContainer _channelSelectorHBox;
  22. private readonly Dictionary<ChatSelectChannel, ChannelSelectorItemButton> _selectorStates = new();
  23. private readonly ChatUIController _chatUIController;
  24. public event Action<ChatSelectChannel>? Selected;
  25. public ChannelSelectorPopup()
  26. {
  27. _channelSelectorHBox = new BoxContainer
  28. {
  29. Orientation = BoxContainer.LayoutOrientation.Horizontal,
  30. SeparationOverride = 1
  31. };
  32. _chatUIController = UserInterfaceManager.GetUIController<ChatUIController>();
  33. _chatUIController.SelectableChannelsChanged += SetChannels;
  34. SetChannels(_chatUIController.SelectableChannels);
  35. AddChild(_channelSelectorHBox);
  36. }
  37. public ChatSelectChannel? FirstChannel
  38. {
  39. get
  40. {
  41. foreach (var selector in _selectorStates.Values)
  42. {
  43. if (!selector.IsHidden)
  44. return selector.Channel;
  45. }
  46. return null;
  47. }
  48. }
  49. private bool IsPreferredAvailable()
  50. {
  51. var preferred = _chatUIController.MapLocalIfGhost(_chatUIController.GetPreferredChannel());
  52. return _selectorStates.TryGetValue(preferred, out var selector) &&
  53. !selector.IsHidden;
  54. }
  55. public void SetChannels(ChatSelectChannel channels)
  56. {
  57. var wasPreferredAvailable = IsPreferredAvailable();
  58. _channelSelectorHBox.RemoveAllChildren();
  59. foreach (var channel in ChannelSelectorOrder)
  60. {
  61. if (!_selectorStates.TryGetValue(channel, out var selector))
  62. {
  63. selector = new ChannelSelectorItemButton(channel);
  64. _selectorStates.Add(channel, selector);
  65. selector.OnPressed += OnSelectorPressed;
  66. }
  67. if ((channels & channel) == 0)
  68. {
  69. if (selector.Parent == _channelSelectorHBox)
  70. {
  71. _channelSelectorHBox.RemoveChild(selector);
  72. }
  73. }
  74. else if (selector.IsHidden)
  75. {
  76. _channelSelectorHBox.AddChild(selector);
  77. }
  78. }
  79. var isPreferredAvailable = IsPreferredAvailable();
  80. if (!wasPreferredAvailable && isPreferredAvailable)
  81. {
  82. Select(_chatUIController.GetPreferredChannel());
  83. }
  84. else if (wasPreferredAvailable && !isPreferredAvailable)
  85. {
  86. Select(ChatSelectChannel.OOC);
  87. }
  88. }
  89. private void OnSelectorPressed(ButtonEventArgs args)
  90. {
  91. var button = (ChannelSelectorItemButton) args.Button;
  92. Select(button.Channel);
  93. }
  94. private void Select(ChatSelectChannel channel)
  95. {
  96. Selected?.Invoke(channel);
  97. }
  98. protected override void Dispose(bool disposing)
  99. {
  100. base.Dispose(disposing);
  101. if (!disposing)
  102. return;
  103. _chatUIController.SelectableChannelsChanged -= SetChannels;
  104. }
  105. }