using System; using System.Collections.Generic; using System.Linq; using Content.Shared.Administration; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.GameObjects; using Robust.Shared.IoC; namespace Content.Client.Administration.UI.CustomControls { [GenerateTypedNameReferences] public partial class PlayerListControl : BoxContainer { private readonly AdminSystem _adminSystem; public event Action? OnSelectionChanged; public Action? DecoratePlayer; public Comparison? Comparison; public PlayerListControl() { _adminSystem = EntitySystem.Get(); IoCManager.InjectDependencies(this); RobustXamlLoader.Load(this); } protected override void EnteredTree() { // Fill the Option data PopulateList(); PlayerItemList.OnItemSelected += PlayerItemListOnOnItemSelected; PlayerItemList.OnItemDeselected += PlayerItemListOnOnItemDeselected; FilterLineEdit.OnTextChanged += FilterLineEditOnOnTextEntered; _adminSystem.PlayerListChanged += PopulateList; } private void FilterLineEditOnOnTextEntered(LineEdit.LineEditEventArgs obj) { PopulateList(); } private void PlayerItemListOnOnItemSelected(ItemList.ItemListSelectedEventArgs obj) { var selectedPlayer = (PlayerInfo) obj.ItemList[obj.ItemIndex].Metadata!; OnSelectionChanged?.Invoke(selectedPlayer); } private void PlayerItemListOnOnItemDeselected(ItemList.ItemListDeselectedEventArgs obj) { OnSelectionChanged?.Invoke(null); } public void Refresh() => PopulateList(); private void PopulateList(IReadOnlyList _ = null!) { PlayerItemList.Clear(); foreach (var info in Comparison == null ? _adminSystem.PlayerList : _adminSystem.GetSortedPlayerList(Comparison)) { var displayName = $"{info.CharacterName} ({info.Username})"; if (!string.IsNullOrEmpty(FilterLineEdit.Text) && !displayName.ToLowerInvariant().Contains(FilterLineEdit.Text.Trim().ToLowerInvariant())) { continue; } var item = new ItemList.Item(PlayerItemList) { Metadata = info, Text = displayName }; DecoratePlayer?.Invoke(info, item); PlayerItemList.Add(item); } } } }