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