using System; using System.Collections.Generic; using System.Globalization; using Content.Shared.Ghost; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Shared.GameObjects; using Robust.Shared.Localization; namespace Content.Client.Ghost.UI { [GenerateTypedNameReferences] public sealed partial class GhostTargetWindow : DefaultWindow { private readonly IEntityNetworkManager _netManager; public List Locations { get; set; } = new(); public Dictionary Players { get; set; } = new(); public GhostTargetWindow(IEntityNetworkManager netManager) { RobustXamlLoader.Load(this); _netManager = netManager; } public void Populate() { ButtonContainer.DisposeAllChildren(); AddButtonPlayers(); AddButtonLocations(); } private void AddButtonPlayers() { var sortedPlayers = new List<(string, EntityUid)>(Players.Count); foreach (var (key, player) in Players) { sortedPlayers.Add((player, key)); } sortedPlayers.Sort((x, y) => string.Compare(x.Item1, y.Item1, StringComparison.Ordinal)); foreach (var (key, player) in sortedPlayers) { var currentButtonRef = new Button { Text = key, TextAlign = Label.AlignMode.Right, HorizontalAlignment = HAlignment.Center, VerticalAlignment = VAlignment.Center, SizeFlagsStretchRatio = 1, MinSize = (230, 20), ClipText = true, }; currentButtonRef.OnPressed += (_) => { var msg = new GhostWarpToTargetRequestEvent(player); _netManager.SendSystemNetworkMessage(msg); }; ButtonContainer.AddChild(currentButtonRef); } } private void AddButtonLocations() { // Server COULD send these sorted but how about we just use the client to do it instead. var sortedLocations = new List(Locations); sortedLocations.Sort((x, y) => string.Compare(x, y, StringComparison.Ordinal)); foreach (var name in sortedLocations) { var currentButtonRef = new Button { Text = Loc.GetString("ghost-target-window-current-button", ("name", name)), TextAlign = Label.AlignMode.Right, HorizontalAlignment = HAlignment.Center, VerticalAlignment = VAlignment.Center, SizeFlagsStretchRatio = 1, MinSize = (230, 20), ClipText = true, }; currentButtonRef.OnPressed += _ => { var msg = new GhostWarpToLocationRequestEvent(name); _netManager.SendSystemNetworkMessage(msg); }; ButtonContainer.AddChild(currentButtonRef); } } } }