From 104b520b21a3ac7419f90409fb998c043bd3d4ff Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 22 Mar 2014 16:02:11 +1300 Subject: [PATCH] Divide the shroud selector into groups. --- .../Logic/ObserverShroudSelectorLogic.cs | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/ObserverShroudSelectorLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ObserverShroudSelectorLogic.cs index 51e19b1aba..1c0d1cca15 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/ObserverShroudSelectorLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/ObserverShroudSelectorLogic.cs @@ -9,7 +9,9 @@ #endregion using System; +using System.Collections.Generic; using System.Linq; +using OpenRA.Network; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Logic @@ -32,18 +34,40 @@ namespace OpenRA.Mods.RA.Widgets.Logic static string LabelForPlayer(Player p) { - return p != null ? p.PlayerName == "Everyone" ? "Combined view" : "{0}'s view".F(p.PlayerName) : "World view"; + if (p == null) + return "Disable shroud"; + + if (p.InternalName == "Everyone") + return "Combined view"; + + return p.PlayerName; } [ObjectCreator.UseCtor] public ObserverShroudSelectorLogic(Widget widget, World world) { - var views = world.Players.Where(p => (p.NonCombatant && p.Spectating) - || !p.NonCombatant).Concat(new[] { (Player)null }).Select( - p => new CameraOption(LabelForPlayer(p), - () => world.RenderPlayer == p, - () => world.RenderPlayer = p - )).ToArray(); + var groups = new Dictionary>(); + + var teams = world.Players.Where(p => !p.NonCombatant) + .GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key); + var noTeams = teams.Count() == 1; + + foreach (var t in teams) + { + var team = t.Select(p => new CameraOption(LabelForPlayer(p), + () => world.RenderPlayer == p, + () => world.RenderPlayer = p)); + + var label = noTeams ? "Players" : t.Key == 0 ? "No Team" : "Team {0}".F(t.Key); + groups.Add(label, team); + } + + var combined = world.Players.First(p => p.InternalName == "Everyone"); + groups.Add("Other", new List() + { + new CameraOption(LabelForPlayer(combined), () => world.RenderPlayer == combined, () => world.RenderPlayer = combined), + new CameraOption(LabelForPlayer(null), () => world.RenderPlayer == null, () => world.RenderPlayer = null) + }); var shroudSelector = widget.Get("SHROUD_SELECTOR"); shroudSelector.GetText = () => LabelForPlayer(world.RenderPlayer); @@ -55,7 +79,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic item.Get("LABEL").GetText = () => option.Label; return item; }; - shroudSelector.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", views.Length * 30, views, setupItem); + shroudSelector.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 400, groups, setupItem); }; } }