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:
Jezithyr
2022-10-12 01:16:23 -07:00
committed by GitHub
parent d09fbc1849
commit 571dd4e6d5
168 changed files with 6940 additions and 7817 deletions

View File

@@ -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;
}
}