add Shroud selector to spectator mode, closes #2463

This commit is contained in:
Matthias Mailänder
2013-03-23 16:02:12 +01:00
parent aa6f12f0a1
commit baacad8432
3 changed files with 53 additions and 18 deletions

View File

@@ -42,28 +42,16 @@ namespace OpenRA
public readonly Shroud LocalShroud; public readonly Shroud LocalShroud;
public Player RenderedPlayer; public Player RenderedPlayer;
public Shroud RenderedShroud { public Shroud RenderedShroud { get { return RenderedPlayer != null ? RenderedPlayer.Shroud : LocalShroud; } }
get {
if(RenderedPlayer == null)
{
return LocalShroud;
}else{
return RenderedPlayer.Shroud;
}
}
}
public void SetLocalPlayer(string pr) public void SetLocalPlayer(string pr)
{ {
if (!(orderManager.Connection is ReplayConnection)) if (orderManager.Connection is ReplayConnection)
{ return;
LocalPlayer = Players.FirstOrDefault(p => p.InternalName == pr);
RenderedPlayer = LocalPlayer; LocalPlayer = Players.FirstOrDefault(p => p.InternalName == pr);
}else{ RenderedPlayer = LocalPlayer;
}
} }
public readonly Actor WorldActor; public readonly Actor WorldActor;

View File

@@ -10,7 +10,9 @@
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Widgets; using OpenRA.Widgets;
using System;
using System.Drawing; using System.Drawing;
using System.Linq;
namespace OpenRA.Mods.RA.Widgets.Logic namespace OpenRA.Mods.RA.Widgets.Logic
{ {
@@ -56,6 +58,37 @@ namespace OpenRA.Mods.RA.Widgets.Logic
optionsBG.Get<ButtonWidget>("SURRENDER").IsVisible = () => false; optionsBG.Get<ButtonWidget>("SURRENDER").IsVisible = () => false;
Ui.Root.Get<ButtonWidget>("INGAME_STATS_BUTTON").OnClick = () => gameRoot.Get("OBSERVER_STATS").Visible ^= true; Ui.Root.Get<ButtonWidget>("INGAME_STATS_BUTTON").OnClick = () => gameRoot.Get("OBSERVER_STATS").Visible ^= true;
var shroudSelector = Ui.Root.GetOrNull<DropDownButtonWidget>("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<DropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
{
var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
item.Get<LabelWidget>("LABEL").GetText = () => option.Title;
return item;
};
shroudSelector.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
};
}
} }
void UnregisterEvents() void UnregisterEvents()
@@ -68,5 +101,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
gameRoot.Get<ChatDisplayWidget>("CHAT_DISPLAY").AddLine(c, from, text); gameRoot.Get<ChatDisplayWidget>("CHAT_DISPLAY").AddLine(c, from, text);
} }
class DropDownOption
{
public string Title;
public Func<bool> IsSelected;
public Action OnClick;
}
} }
} }

View File

@@ -306,6 +306,13 @@ Container@OBSERVER_ROOT:
Width:PARENT_RIGHT-19 Width:PARENT_RIGHT-19
Height:PARENT_BOTTOM-19 Height:PARENT_BOTTOM-19
WorldInteractionController:INTERACTION_CONTROLLER WorldInteractionController:INTERACTION_CONTROLLER
DropDownButton@SHROUD_SELECTOR:
X:WINDOW_RIGHT-250
Y:260
Width:240
Height:25
Font:Bold
Visible:true
WorldTooltip: WorldTooltip:
Background@INGAME_OPTIONS_BG: Background@INGAME_OPTIONS_BG:
X:(WINDOW_RIGHT - WIDTH)/2 X:(WINDOW_RIGHT - WIDTH)/2