From baacad843279fe546d59c0b65771c55a131920e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 23 Mar 2013 16:02:12 +0100 Subject: [PATCH] add Shroud selector to spectator mode, closes #2463 --- OpenRA.Game/World.cs | 24 +++-------- .../Logic/IngameObserverChromeLogic.cs | 40 +++++++++++++++++++ mods/ra/chrome/ingame.yaml | 7 ++++ 3 files changed, 53 insertions(+), 18 deletions(-) diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 7a29e942c7..3992e9fceb 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -42,28 +42,16 @@ namespace OpenRA public readonly Shroud LocalShroud; public Player RenderedPlayer; - public Shroud RenderedShroud { - get { - if(RenderedPlayer == null) - { - return LocalShroud; - }else{ - return RenderedPlayer.Shroud; - } - } - } + public Shroud RenderedShroud { get { return RenderedPlayer != null ? RenderedPlayer.Shroud : LocalShroud; } } public void SetLocalPlayer(string pr) { - if (!(orderManager.Connection is ReplayConnection)) - { - LocalPlayer = Players.FirstOrDefault(p => p.InternalName == pr); - RenderedPlayer = LocalPlayer; - }else{ - - } - + if (orderManager.Connection is ReplayConnection) + return; + + LocalPlayer = Players.FirstOrDefault(p => p.InternalName == pr); + RenderedPlayer = LocalPlayer; } public readonly Actor WorldActor; diff --git a/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs index 9d4c65d743..9b0863d7f0 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs @@ -10,7 +10,9 @@ using OpenRA.Traits; using OpenRA.Widgets; +using System; using System.Drawing; +using System.Linq; namespace OpenRA.Mods.RA.Widgets.Logic { @@ -56,6 +58,37 @@ namespace OpenRA.Mods.RA.Widgets.Logic optionsBG.Get("SURRENDER").IsVisible = () => false; Ui.Root.Get("INGAME_STATS_BUTTON").OnClick = () => gameRoot.Get("OBSERVER_STATS").Visible ^= true; + + var shroudSelector = Ui.Root.GetOrNull("SHROUD_SELECTOR"); + if (shroudSelector != null) + { + if (world.RenderedShroud == world.LocalShroud) + shroudSelector.GetText = () => world.RenderedPlayer != null ? "{0}'s View".F(world.RenderedPlayer.PlayerName) : "Worldview"; + + shroudSelector.OnMouseDown = _ => + { + + var options = world.Players.Where(p => !p.NonCombatant).Select(p => new DropDownOption + { + Title = "{0}'s View".F(p.PlayerName), + IsSelected = () => world.RenderedPlayer == p, + OnClick = () => { world.RenderedPlayer = p; world.RenderedShroud.Jank(); } + }).ToList(); + options.Add(new DropDownOption + { + Title = "Worldview", + IsSelected = () => world.RenderedPlayer == null, + OnClick = () => { world.RenderedPlayer = null; world.RenderedShroud.Jank(); } + }); + Func setupItem = (option, template) => + { + var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick); + item.Get("LABEL").GetText = () => option.Title; + return item; + }; + shroudSelector.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem); + }; + } } void UnregisterEvents() @@ -68,5 +101,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic { gameRoot.Get("CHAT_DISPLAY").AddLine(c, from, text); } + + class DropDownOption + { + public string Title; + public Func IsSelected; + public Action OnClick; + } } } diff --git a/mods/ra/chrome/ingame.yaml b/mods/ra/chrome/ingame.yaml index 60e862e6c1..339f8468ea 100644 --- a/mods/ra/chrome/ingame.yaml +++ b/mods/ra/chrome/ingame.yaml @@ -306,6 +306,13 @@ Container@OBSERVER_ROOT: Width:PARENT_RIGHT-19 Height:PARENT_BOTTOM-19 WorldInteractionController:INTERACTION_CONTROLLER + DropDownButton@SHROUD_SELECTOR: + X:WINDOW_RIGHT-250 + Y:260 + Width:240 + Height:25 + Font:Bold + Visible:true WorldTooltip: Background@INGAME_OPTIONS_BG: X:(WINDOW_RIGHT - WIDTH)/2