diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs index 677da89a78..0a7fd6dfe3 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/GameInfoStatsLogic.cs @@ -125,6 +125,37 @@ namespace OpenRA.Mods.Common.Widgets.Logic playerPanel.AddChild(item); } } + + var spectators = orderManager.LobbyInfo.Clients.Where(c => c.IsObserver).ToList(); + if (spectators.Any()) + { + var spectatorHeader = ScrollItemWidget.Setup(teamTemplate, () => true, () => { }); + spectatorHeader.Get("TEAM").GetText = () => "Spectators"; + + playerPanel.AddChild(spectatorHeader); + + foreach (var client in spectators) + { + var item = playerTemplate.Clone(); + LobbyUtils.SetupClientWidget(item, client, orderManager, client != null && client.Bot == null); + var nameLabel = item.Get("NAME"); + var nameFont = Game.Renderer.Fonts[nameLabel.Font]; + + var suffixLength = new CachedTransform(s => nameFont.Measure(s).X); + var name = new CachedTransform, string>(c => + WidgetUtils.TruncateText(c.First, nameLabel.Bounds.Width - c.Second, nameFont)); + + nameLabel.GetText = () => + { + var suffix = client.State == Session.ClientState.Disconnected ? " (Gone)" : ""; + var sl = suffixLength.Update(suffix); + return name.Update(Pair.New(client.Name, sl)) + suffix; + }; + + item.Get("FACTIONFLAG").IsVisible = () => false; + playerPanel.AddChild(item); + } + } } } }