diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index a2c32afb33..6909ff4a35 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -422,6 +422,7 @@
+
diff --git a/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs
index 047f2411b3..964d2d209a 100644
--- a/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs
+++ b/OpenRA.Mods.RA/Widgets/Logic/IngameObserverChromeLogic.cs
@@ -62,44 +62,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var chatPanel = Game.LoadWidget(world, "CHAT_PANEL", Ui.Root, new WidgetArgs());
gameRoot.AddChild(chatPanel);
}
-
- 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);
- };
- }
- }
-
- class DropDownOption
- {
- public string Title;
- public Func IsSelected;
- public Action OnClick;
}
}
}
diff --git a/OpenRA.Mods.RA/Widgets/Logic/ObserverShroudSelectorLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ObserverShroudSelectorLogic.cs
new file mode 100644
index 0000000000..2fc3344344
--- /dev/null
+++ b/OpenRA.Mods.RA/Widgets/Logic/ObserverShroudSelectorLogic.cs
@@ -0,0 +1,65 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using OpenRA.Mods.RA.Buildings;
+using OpenRA.Mods.RA.Orders;
+using OpenRA.Traits;
+using OpenRA.Widgets;
+
+namespace OpenRA.Mods.RA.Widgets.Logic
+{
+ public class ObserverShroudSelectorLogic
+ {
+ class CameraOption
+ {
+ public string Label;
+ public Func IsSelected;
+ public Action OnClick;
+
+ public CameraOption(string label, Func isSelected, Action onClick)
+ {
+ Label = label;
+ IsSelected = isSelected;
+ OnClick = onClick;
+ }
+ }
+
+ [ObjectCreator.UseCtor]
+ public ObserverShroudSelectorLogic(Widget widget, World world)
+ {
+ var views = world.Players.Where(p => !p.NonCombatant).ToDictionary(p => p.PlayerName,
+ p => new CameraOption("{0}'s view".F(p.PlayerName),
+ () => world.RenderedPlayer == p,
+ () => { world.RenderedPlayer = p; world.RenderedShroud.Jank(); }
+ ));
+ views.Add("", new CameraOption("World view",
+ () => world.RenderedPlayer == null,
+ () => { world.RenderedPlayer = null; world.RenderedShroud.Jank(); }
+ ));
+
+ var shroudSelector = widget.Get("SHROUD_SELECTOR");
+ shroudSelector.GetText = () => views[world.RenderedPlayer == null ? "" : world.RenderedPlayer.PlayerName].Label;
+ shroudSelector.OnMouseDown = _ =>
+ {
+ Func setupItem = (option, template) =>
+ {
+ var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
+ item.Get("LABEL").GetText = () => option.Label;
+ return item;
+ };
+ shroudSelector.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", views.Count() * 30, views.Values, setupItem);
+ };
+ }
+ }
+}
diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml
index 21d839f3b0..4a9948cc06 100644
--- a/mods/cnc/chrome/ingame.yaml
+++ b/mods/cnc/chrome/ingame.yaml
@@ -71,6 +71,14 @@ Container@OBSERVER_WIDGETS:
Y:1
Width:PARENT_RIGHT-2
Height:PARENT_BOTTOM-2
+ DropDownButton@SHROUD_SELECTOR:
+ Logic:ObserverShroudSelectorLogic
+ X:WINDOW_RIGHT-173
+ Y:172
+ Width:168
+ Height:25
+ Font:Bold
+ Visible:true
Container@PLAYER_WIDGETS:
Children:
LogicTicker@WIN_LOSS_WATCHER:
diff --git a/mods/ra/chrome/ingame.yaml b/mods/ra/chrome/ingame.yaml
index 7bc3d4e754..cad3bc4f1d 100644
--- a/mods/ra/chrome/ingame.yaml
+++ b/mods/ra/chrome/ingame.yaml
@@ -305,6 +305,7 @@ Container@OBSERVER_ROOT:
Height:PARENT_BOTTOM-19
WorldInteractionController:INTERACTION_CONTROLLER
DropDownButton@SHROUD_SELECTOR:
+ Logic:ObserverShroudSelectorLogic
X:WINDOW_RIGHT-250
Y:260
Width:240