rewrite the Diplomacy panel

now with scrollbars, fixes #3443
This commit is contained in:
Matthias Mailänder
2013-08-17 12:28:05 +02:00
parent fea8dc11cf
commit 60b3601ffa
6 changed files with 134 additions and 116 deletions

View File

@@ -13,109 +13,61 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq; using System.Linq;
using OpenRA.Traits; using OpenRA.Traits;
using OpenRA.Network;
using OpenRA.Widgets; using OpenRA.Widgets;
namespace OpenRA.Mods.RA.Widgets.Logic namespace OpenRA.Mods.RA.Widgets.Logic
{ {
public class DiplomacyLogic public class DiplomacyLogic
{ {
static List<Widget> controls = new List<Widget>();
readonly World world; readonly World world;
ScrollPanelWidget diplomacyPanel;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public DiplomacyLogic(Widget widget, Action onExit, World world) public DiplomacyLogic(Widget widget, Action onExit, World world)
{ {
this.world = world; this.world = world;
var root = Ui.Root.Get("DIPLOMACY");
var diplomacyBG = root.Get("DIPLOMACY_BG");
LayoutDialog(diplomacyBG);
var close = widget.GetOrNull<ButtonWidget>("CLOSE_DIPLOMACY"); diplomacyPanel = widget.Get<ScrollPanelWidget>("DIPLOMACY_PANEL");
if (close != null)
close.OnClick = () => { Ui.CloseWindow(); onExit(); }; LayoutPlayers();
} }
// This is shit void LayoutPlayers()
void LayoutDialog(Widget bg)
{ {
foreach (var c in controls) var teamTemplate = diplomacyPanel.Get<ScrollItemWidget>("TEAM_TEMPLATE");
bg.RemoveChild(c); var players = world.Players.Where(p => p != world.LocalPlayer && !p.NonCombatant);
controls.Clear(); var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key);
foreach (var t in teams)
var y = 50;
var margin = 20;
var labelWidth = (bg.Bounds.Width - 3 * margin) / 3;
var ts = new LabelWidget
{ {
Font = "Bold", var team = t;
Bounds = new Rectangle(margin + labelWidth + 10, y, labelWidth, 25), var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { });
Text = "Their Stance", tt.IgnoreMouseOver = true;
Align = TextAlign.Left, tt.Get<LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key;
}; diplomacyPanel.AddChild(tt);
foreach (var p in team)
bg.AddChild(ts);
controls.Add(ts);
var ms = new LabelWidget
{
Font = "Bold",
Bounds = new Rectangle(margin + 2 * labelWidth + 20, y, labelWidth, 25),
Text = "My Stance",
Align = TextAlign.Left,
};
bg.AddChild(ms);
controls.Add(ms);
y += 35;
foreach (var p in world.Players.Where(a => a != world.LocalPlayer && !a.NonCombatant))
{
var pp = p;
var label = new LabelWidget
{ {
Bounds = new Rectangle(margin, y, labelWidth, 25), var player = p;
Text = p.PlayerName, diplomacyPanel.AddChild(DiplomaticStatus(player));
Align = TextAlign.Left, }
Font = "Bold",
Color = p.Color.RGB,
};
bg.AddChild(label);
controls.Add(label);
var theirStance = new LabelWidget
{
Bounds = new Rectangle( margin + labelWidth + 10, y, labelWidth, 25),
Text = p.PlayerName,
Align = TextAlign.Left,
GetText = () => pp.Stances[ world.LocalPlayer ].ToString(),
};
bg.AddChild(theirStance);
controls.Add(theirStance);
var myStance = new DropDownButtonWidget
{
Bounds = new Rectangle( margin + 2 * labelWidth + 20, y, labelWidth, 25),
GetText = () => world.LocalPlayer.Stances[ pp ].ToString(),
};
if (!p.World.LobbyInfo.GlobalSettings.FragileAlliances)
myStance.Disabled = true;
myStance.OnMouseDown = mi => ShowDropDown(pp, myStance);
bg.AddChild(myStance);
controls.Add(myStance);
y += 35;
} }
} }
ScrollItemWidget DiplomaticStatus(Player player)
{
var playerTemplate = diplomacyPanel.Get<ScrollItemWidget>("PLAYER_TEMPLATE");
var pt = ScrollItemWidget.Setup(playerTemplate, () => false, () => { });
pt.IgnoreMouseOver = true;
LobbyUtils.AddPlayerFlagAndName(pt, player);
pt.Get<LabelWidget>("THEIR_STANCE").GetText = () => player.Stances[world.LocalPlayer].ToString();
var myStance = pt.Get<DropDownButtonWidget>("MY_STANCE");
myStance.GetText = () => world.LocalPlayer.Stances[player].ToString();
myStance.IsDisabled = () => !world.LobbyInfo.GlobalSettings.FragileAlliances;
myStance.OnMouseDown = mi => ShowDropDown(player, myStance);
return pt;
}
void ShowDropDown(Player p, DropDownButtonWidget dropdown) void ShowDropDown(Player p, DropDownButtonWidget dropdown)
{ {
var stances = Enum<Stance>.GetValues(); var stances = Enum<Stance>.GetValues();
@@ -135,9 +87,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic
void SetStance(ButtonWidget bw, Player p, Stance ss) void SetStance(ButtonWidget bw, Player p, Stance ss)
{ {
if (!p.World.LobbyInfo.GlobalSettings.FragileAlliances) if (!p.World.LobbyInfo.GlobalSettings.FragileAlliances)
return; // team changes are banned return; // stance changes are banned
// NOTE(jsd): Abuse of the type system here with `CPos` // HACK: Abuse of the type system here with `CPos`
world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, false) world.IssueOrder(new Order("SetStance", world.LocalPlayer.PlayerActor, false)
{ TargetLocation = new CPos((int)ss, 0), TargetString = p.InternalName }); { TargetLocation = new CPos((int)ss, 0), TargetString = p.InternalName });

View File

@@ -348,5 +348,16 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
parent.Get<ImageWidget>("STATUS_IMAGE").IsVisible = () => c.IsReady || c.Bot != null; parent.Get<ImageWidget>("STATUS_IMAGE").IsVisible = () => c.IsReady || c.Bot != null;
} }
public static void AddPlayerFlagAndName(ScrollItemWidget template, Player player)
{
var flag = template.Get<ImageWidget>("FLAG");
flag.GetImageName = () => player.Country.Race;
flag.GetImageCollection = () => "flags";
var playerName = template.Get<LabelWidget>("PLAYER");
playerName.GetText = () => player.PlayerName + (player.WinState == WinState.Undefined ? "" : " (" + player.WinState + ")");
playerName.GetColor = () => player.Color.RGB;
}
} }
} }

View File

@@ -170,7 +170,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var team = t; var team = t;
var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { }); var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { });
tt.IgnoreMouseOver = true; tt.IgnoreMouseOver = true;
tt.Get<LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No team" : "Team " + team.Key; tt.Get<LabelWidget>("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key;
playerStatsPanel.AddChild(tt); playerStatsPanel.AddChild(tt);
foreach (var p in team) foreach (var p in team)
{ {
@@ -185,7 +185,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
combatStatsHeaders.Visible = true; combatStatsHeaders.Visible = true;
var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player); var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player);
AddPlayerFlagAndName(template, player); LobbyUtils.AddPlayerFlagAndName(template, player);
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>(); var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
if (stats == null) return template; if (stats == null) return template;
@@ -205,7 +205,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
productionStatsHeaders.Visible = true; productionStatsHeaders.Visible = true;
var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player); var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player);
AddPlayerFlagAndName(template, player); LobbyUtils.AddPlayerFlagAndName(template, player);
template.Get<ObserverProductionIconsWidget>("PRODUCTION_ICONS").GetPlayer = () => player; template.Get<ObserverProductionIconsWidget>("PRODUCTION_ICONS").GetPlayer = () => player;
template.Get<ObserverSupportPowerIconsWidget>("SUPPORT_POWER_ICONS").GetPlayer = () => player; template.Get<ObserverSupportPowerIconsWidget>("SUPPORT_POWER_ICONS").GetPlayer = () => player;
@@ -218,7 +218,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
economyStatsHeaders.Visible = true; economyStatsHeaders.Visible = true;
var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player); var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player);
AddPlayerFlagAndName(template, player); LobbyUtils.AddPlayerFlagAndName(template, player);
var res = player.PlayerActor.Trait<PlayerResources>(); var res = player.PlayerActor.Trait<PlayerResources>();
var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>(); var stats = player.PlayerActor.TraitOrDefault<PlayerStatistics>();
@@ -246,7 +246,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
basicStatsHeaders.Visible = true; basicStatsHeaders.Visible = true;
var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player); var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player);
AddPlayerFlagAndName(template, player); LobbyUtils.AddPlayerFlagAndName(template, player);
var res = player.PlayerActor.Trait<PlayerResources>(); var res = player.PlayerActor.Trait<PlayerResources>();
template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.DisplayCash + res.DisplayOre); template.Get<LabelWidget>("CASH").GetText = () => "$" + (res.DisplayCash + res.DisplayOre);
@@ -293,17 +293,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic
return "$" + (world.FrameNumber == 0 ? 0 : earned / (world.FrameNumber / 1500.0)).ToString("F2"); return "$" + (world.FrameNumber == 0 ? 0 : earned / (world.FrameNumber / 1500.0)).ToString("F2");
} }
static void AddPlayerFlagAndName(ScrollItemWidget template, Player player)
{
var flag = template.Get<ImageWidget>("FLAG");
flag.GetImageName = () => player.Country.Race;
flag.GetImageCollection = () => "flags";
var playerName = template.Get<LabelWidget>("PLAYER");
playerName.GetText = () => player.PlayerName + (player.WinState == WinState.Undefined ? "" : " (" + player.WinState + ")");
playerName.GetColor = () => player.Color.RGB;
}
static Color GetPowerColor(PowerState state) static Color GetPowerColor(PowerState state)
{ {
if (state == PowerState.Critical) return Color.Red; if (state == PowerState.Critical) return Color.Red;

View File

@@ -2,29 +2,94 @@ Container@DIPLOMACY:
Logic:DiplomacyLogic Logic:DiplomacyLogic
X:25 X:25
Y:50 Y:50
Width:950 Width:540
Height:500 Height:400
Visible:false Visible:false
Children: Children:
Background@DIPLOMACY_BG: Background@DIPLOMACY_BG:
X:(WINDOW_RIGHT - WIDTH)/2 Width:PARENT_RIGHT
Y:(WINDOW_BOTTOM - HEIGHT)/2 Height:PARENT_BOTTOM
Width:450
Height:400
Children: Children:
Label@LABEL_TITLE: Label@LABEL_TITLE:
X:(PARENT_RIGHT - WIDTH)/2 X:(PARENT_RIGHT - WIDTH)/2
Y:20 Y:10
Width:250 Width:250
Height:25 Height:25
Text:Diplomacy Text:Diplomacy
Align:Center Align:Center
Font:Bold Font:Bold
Button@CLOSE_DIPLOMACY: Container@DIPLOMACY_HEADERS:
X:(PARENT_RIGHT - WIDTH)/2 X:0
Y:350 Y:0
Width:160 Width:PARENT_RIGHT
Height:25 Height:PARENT_BOTTOM
Text:Close Children:
Font:Bold Label@PLAYER_HEADER:
Key:escape X:45
Y:40
Width:160
Height:25
Font:Bold
Text:Player
Label@THEIR_STANCE_HEADER:
X:265
Y:40
Width:80
Height:25
Font:Bold
Text:Their Stance
Label@MY_STANCE_HEADER:
X:385
Y:40
Width:60
Height:25
Font:Bold
Text:My Stance
ScrollPanel@DIPLOMACY_PANEL:
X:25
Y:70
Width:PARENT_RIGHT-50
Height:PARENT_BOTTOM-45-50
ItemSpacing:5
Children:
ScrollItem@TEAM_TEMPLATE:
X:0
Y:0
Width:PARENT_RIGHT-35
Height:25
Children:
Label@TEAM:
X:10
Y:0
Width:PARENT_RIGHT
Height:PARENT_BOTTOM
Font:Bold
ScrollItem@PLAYER_TEMPLATE:
X:0
Y:0
Width:PARENT_RIGHT-35
Height:25
Children:
Image@FLAG:
X:20
Y:5
Width:35
Height:PARENT_BOTTOM-5
ImageName:random
ImageCollection:flags
Label@PLAYER:
X:55
Y:0
Width:160
Height:PARENT_BOTTOM
Font:Bold
Label@THEIR_STANCE:
X:265
Y:0
Width:80
Height:PARENT_BOTTOM
DropDownButton@MY_STANCE:
X:345
Y:0
Width:100
Height:PARENT_BOTTOM

View File

@@ -101,7 +101,7 @@ Background@LOBBY_OPTIONS_BIN:
Y:40 Y:40
Width:220 Width:220
Height:20 Height:20
Text:Team Changes Text:Diplomacy Changes
Label@STARTINGCASH_DESC: Label@STARTINGCASH_DESC:
Y:87 Y:87
Width:80 Width:80

View File

@@ -92,6 +92,7 @@ ChromeLayout:
mods/ra/chrome/gameinit.yaml mods/ra/chrome/gameinit.yaml
mods/ra/chrome/ingame.yaml mods/ra/chrome/ingame.yaml
mods/ra/chrome/ingame-chat.yaml mods/ra/chrome/ingame-chat.yaml
mods/ra/chrome/ingame-diplomacy.yaml
mods/ra/chrome/ingame-fmvplayer.yaml mods/ra/chrome/ingame-fmvplayer.yaml
mods/ra/chrome/ingame-menu.yaml mods/ra/chrome/ingame-menu.yaml
mods/ra/chrome/ingame-objectives.yaml mods/ra/chrome/ingame-objectives.yaml