Hud refactor (#7202)
Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com> Co-authored-by: Jezithyr <jmaster9999@gmail.com> Co-authored-by: Jezithyr <Jezithyr@gmail.com> Co-authored-by: Visne <39844191+Visne@users.noreply.github.com> Co-authored-by: wrexbe <wrexbe@protonmail.com> Co-authored-by: wrexbe <81056464+wrexbe@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
using Content.Shared.Chat;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using static Robust.Client.UserInterface.Controls.BaseButton;
|
||||
|
||||
namespace Content.Client.UserInterface.Systems.Chat.Controls;
|
||||
|
||||
public sealed class ChannelSelectorPopup : Popup
|
||||
{
|
||||
// order in which the channels show up in the channel selector
|
||||
public static readonly ChatSelectChannel[] ChannelSelectorOrder =
|
||||
{
|
||||
ChatSelectChannel.Local,
|
||||
ChatSelectChannel.Whisper,
|
||||
ChatSelectChannel.Emotes,
|
||||
ChatSelectChannel.Radio,
|
||||
ChatSelectChannel.LOOC,
|
||||
ChatSelectChannel.OOC,
|
||||
ChatSelectChannel.Dead,
|
||||
ChatSelectChannel.Admin
|
||||
// NOTE: Console is not in there and it can never be permanently selected.
|
||||
// You can, however, still submit commands as console by prefixing with /.
|
||||
};
|
||||
|
||||
private readonly BoxContainer _channelSelectorHBox;
|
||||
private readonly Dictionary<ChatSelectChannel, ChannelSelectorItemButton> _selectorStates = new();
|
||||
private readonly ChatUIController _chatUIController;
|
||||
|
||||
public event Action<ChatSelectChannel>? Selected;
|
||||
|
||||
public ChannelSelectorPopup()
|
||||
{
|
||||
_channelSelectorHBox = new BoxContainer
|
||||
{
|
||||
Orientation = BoxContainer.LayoutOrientation.Horizontal,
|
||||
SeparationOverride = 1
|
||||
};
|
||||
|
||||
_chatUIController = UserInterfaceManager.GetUIController<ChatUIController>();
|
||||
_chatUIController.SelectableChannelsChanged += SetChannels;
|
||||
SetChannels(_chatUIController.SelectableChannels);
|
||||
|
||||
AddChild(_channelSelectorHBox);
|
||||
}
|
||||
|
||||
public ChatSelectChannel? FirstChannel
|
||||
{
|
||||
get
|
||||
{
|
||||
foreach (var selector in _selectorStates.Values)
|
||||
{
|
||||
if (!selector.IsHidden)
|
||||
return selector.Channel;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/*public ChatSelectChannel NextChannel()
|
||||
{
|
||||
var nextChannel = ChatUIController.GetNextChannelSelector(_activeSelector);
|
||||
var index = 0;
|
||||
while (_selectorStates[(int)nextChannel].IsHidden && index <= _selectorStates.Count)
|
||||
{
|
||||
nextChannel = ChatUIController.GetNextChannelSelector(nextChannel);
|
||||
index++;
|
||||
}
|
||||
_activeSelector = nextChannel;
|
||||
return nextChannel;
|
||||
}
|
||||
|
||||
|
||||
private void SetupChannels(ChatUIController.ChannelSelectorSetup[] selectorData)
|
||||
{
|
||||
_channelSelectorHBox.DisposeAllChildren(); //cleanup old toggles
|
||||
_selectorStates.Clear();
|
||||
foreach (var channelSelectorData in selectorData)
|
||||
{
|
||||
var newSelectorButton = new ChannelSelectorItemButton(channelSelectorData);
|
||||
_selectorStates.Add(newSelectorButton);
|
||||
if (!newSelectorButton.IsHidden)
|
||||
{
|
||||
_channelSelectorHBox.AddChild(newSelectorButton);
|
||||
}
|
||||
newSelectorButton.OnPressed += OnSelectorPressed;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSelectorPressed(BaseButton.ButtonEventArgs args)
|
||||
{
|
||||
if (_selectorButton == null) return;
|
||||
_selectorButton.SelectedChannel = ((ChannelSelectorItemButton) args.Button).Channel;
|
||||
}
|
||||
|
||||
public void HideChannels(params ChatChannel[] channels)
|
||||
{
|
||||
foreach (var channel in channels)
|
||||
{
|
||||
if (!ChatUIController.ChannelToSelector.TryGetValue(channel, out var selector)) continue;
|
||||
var selectorbutton = _selectorStates[(int)selector];
|
||||
if (!selectorbutton.IsHidden)
|
||||
{
|
||||
_channelSelectorHBox.RemoveChild(selectorbutton);
|
||||
if (_activeSelector != selector) continue; // do nothing
|
||||
if (_channelSelectorHBox.Children.First() is ChannelSelectorItemButton button)
|
||||
{
|
||||
_activeSelector = button.Channel;
|
||||
}
|
||||
else
|
||||
{
|
||||
_activeSelector = ChatSelectChannel.None;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
private bool IsPreferredAvailable()
|
||||
{
|
||||
var preferred = _chatUIController.MapLocalIfGhost(_chatUIController.GetPreferredChannel());
|
||||
return _selectorStates.TryGetValue(preferred, out var selector) &&
|
||||
!selector.IsHidden;
|
||||
}
|
||||
|
||||
public void SetChannels(ChatSelectChannel channels)
|
||||
{
|
||||
var wasPreferredAvailable = IsPreferredAvailable();
|
||||
|
||||
_channelSelectorHBox.RemoveAllChildren();
|
||||
|
||||
foreach (var channel in ChannelSelectorOrder)
|
||||
{
|
||||
if (!_selectorStates.TryGetValue(channel, out var selector))
|
||||
{
|
||||
selector = new ChannelSelectorItemButton(channel);
|
||||
_selectorStates.Add(channel, selector);
|
||||
selector.OnPressed += OnSelectorPressed;
|
||||
}
|
||||
|
||||
if ((channels & channel) == 0)
|
||||
{
|
||||
if (selector.Parent == _channelSelectorHBox)
|
||||
{
|
||||
_channelSelectorHBox.RemoveChild(selector);
|
||||
}
|
||||
}
|
||||
else if (selector.IsHidden)
|
||||
{
|
||||
_channelSelectorHBox.AddChild(selector);
|
||||
}
|
||||
}
|
||||
|
||||
var isPreferredAvailable = IsPreferredAvailable();
|
||||
if (!wasPreferredAvailable && isPreferredAvailable)
|
||||
{
|
||||
Select(_chatUIController.GetPreferredChannel());
|
||||
}
|
||||
else if (wasPreferredAvailable && !isPreferredAvailable)
|
||||
{
|
||||
Select(ChatSelectChannel.OOC);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSelectorPressed(ButtonEventArgs args)
|
||||
{
|
||||
var button = (ChannelSelectorItemButton) args.Button;
|
||||
Select(button.Channel);
|
||||
}
|
||||
|
||||
private void Select(ChatSelectChannel channel)
|
||||
{
|
||||
Selected?.Invoke(channel);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
if (!disposing)
|
||||
return;
|
||||
|
||||
_chatUIController.SelectableChannelsChanged -= SetChannels;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user