From 60b3601ffa7c0233403ee7ea6106f96a412375ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 17 Aug 2013 12:28:05 +0200 Subject: [PATCH] rewrite the Diplomacy panel now with scrollbars, fixes #3443 --- .../Widgets/Logic/DiplomacyLogic.cs | 120 ++++++------------ OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs | 11 ++ .../Widgets/Logic/ObserverStatsLogic.cs | 21 +-- mods/ra/chrome/ingame-diplomacy.yaml | 95 +++++++++++--- mods/ra/chrome/lobby-dialogs.yaml | 2 +- mods/ts/mod.yaml | 1 + 6 files changed, 134 insertions(+), 116 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs index 0b52f765c9..8cde095269 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs @@ -13,109 +13,61 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.Traits; +using OpenRA.Network; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Logic { public class DiplomacyLogic { - static List controls = new List(); - readonly World world; + ScrollPanelWidget diplomacyPanel; + [ObjectCreator.UseCtor] public DiplomacyLogic(Widget widget, Action onExit, World world) { this.world = world; - var root = Ui.Root.Get("DIPLOMACY"); - var diplomacyBG = root.Get("DIPLOMACY_BG"); - LayoutDialog(diplomacyBG); - var close = widget.GetOrNull("CLOSE_DIPLOMACY"); - if (close != null) - close.OnClick = () => { Ui.CloseWindow(); onExit(); }; + diplomacyPanel = widget.Get("DIPLOMACY_PANEL"); + + LayoutPlayers(); } - // This is shit - void LayoutDialog(Widget bg) + void LayoutPlayers() { - foreach (var c in controls) - bg.RemoveChild(c); - controls.Clear(); - - var y = 50; - var margin = 20; - var labelWidth = (bg.Bounds.Width - 3 * margin) / 3; - - var ts = new LabelWidget + var teamTemplate = diplomacyPanel.Get("TEAM_TEMPLATE"); + var players = world.Players.Where(p => p != world.LocalPlayer && !p.NonCombatant); + var teams = players.GroupBy(p => (world.LobbyInfo.ClientWithIndex(p.ClientIndex) ?? new Session.Client()).Team).OrderBy(g => g.Key); + foreach (var t in teams) { - Font = "Bold", - Bounds = new Rectangle(margin + labelWidth + 10, y, labelWidth, 25), - Text = "Their Stance", - Align = TextAlign.Left, - }; - - 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 + var team = t; + var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { }); + tt.IgnoreMouseOver = true; + tt.Get("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key; + diplomacyPanel.AddChild(tt); + foreach (var p in team) { - Bounds = new Rectangle(margin, y, labelWidth, 25), - Text = p.PlayerName, - 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; + var player = p; + diplomacyPanel.AddChild(DiplomaticStatus(player)); + } } } + ScrollItemWidget DiplomaticStatus(Player player) + { + var playerTemplate = diplomacyPanel.Get("PLAYER_TEMPLATE"); + var pt = ScrollItemWidget.Setup(playerTemplate, () => false, () => { }); + pt.IgnoreMouseOver = true; + LobbyUtils.AddPlayerFlagAndName(pt, player); + pt.Get("THEIR_STANCE").GetText = () => player.Stances[world.LocalPlayer].ToString(); + var myStance = pt.Get("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) { var stances = Enum.GetValues(); @@ -135,9 +87,9 @@ namespace OpenRA.Mods.RA.Widgets.Logic void SetStance(ButtonWidget bw, Player p, Stance ss) { 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) { TargetLocation = new CPos((int)ss, 0), TargetString = p.InternalName }); diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs index d87e1a327e..b348311e17 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs @@ -348,5 +348,16 @@ namespace OpenRA.Mods.RA.Widgets.Logic { parent.Get("STATUS_IMAGE").IsVisible = () => c.IsReady || c.Bot != null; } + + public static void AddPlayerFlagAndName(ScrollItemWidget template, Player player) + { + var flag = template.Get("FLAG"); + flag.GetImageName = () => player.Country.Race; + flag.GetImageCollection = () => "flags"; + + var playerName = template.Get("PLAYER"); + playerName.GetText = () => player.PlayerName + (player.WinState == WinState.Undefined ? "" : " (" + player.WinState + ")"); + playerName.GetColor = () => player.Color.RGB; + } } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs index 4b03b0818a..57fa13c1a1 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs @@ -170,7 +170,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic var team = t; var tt = ScrollItemWidget.Setup(teamTemplate, () => false, () => { }); tt.IgnoreMouseOver = true; - tt.Get("TEAM").GetText = () => team.Key == 0 ? "No team" : "Team " + team.Key; + tt.Get("TEAM").GetText = () => team.Key == 0 ? "No Team" : "Team " + team.Key; playerStatsPanel.AddChild(tt); foreach (var p in team) { @@ -185,7 +185,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic combatStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(combatPlayerTemplate, player); - AddPlayerFlagAndName(template, player); + LobbyUtils.AddPlayerFlagAndName(template, player); var stats = player.PlayerActor.TraitOrDefault(); if (stats == null) return template; @@ -205,7 +205,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic productionStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(productionPlayerTemplate, player); - AddPlayerFlagAndName(template, player); + LobbyUtils.AddPlayerFlagAndName(template, player); template.Get("PRODUCTION_ICONS").GetPlayer = () => player; template.Get("SUPPORT_POWER_ICONS").GetPlayer = () => player; @@ -218,7 +218,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic economyStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(economyPlayerTemplate, player); - AddPlayerFlagAndName(template, player); + LobbyUtils.AddPlayerFlagAndName(template, player); var res = player.PlayerActor.Trait(); var stats = player.PlayerActor.TraitOrDefault(); @@ -246,7 +246,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic basicStatsHeaders.Visible = true; var template = SetupPlayerScrollItemWidget(basicPlayerTemplate, player); - AddPlayerFlagAndName(template, player); + LobbyUtils.AddPlayerFlagAndName(template, player); var res = player.PlayerActor.Trait(); template.Get("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"); } - static void AddPlayerFlagAndName(ScrollItemWidget template, Player player) - { - var flag = template.Get("FLAG"); - flag.GetImageName = () => player.Country.Race; - flag.GetImageCollection = () => "flags"; - - var playerName = template.Get("PLAYER"); - playerName.GetText = () => player.PlayerName + (player.WinState == WinState.Undefined ? "" : " (" + player.WinState + ")"); - playerName.GetColor = () => player.Color.RGB; - } - static Color GetPowerColor(PowerState state) { if (state == PowerState.Critical) return Color.Red; diff --git a/mods/ra/chrome/ingame-diplomacy.yaml b/mods/ra/chrome/ingame-diplomacy.yaml index 3daa20dd46..481f98f480 100644 --- a/mods/ra/chrome/ingame-diplomacy.yaml +++ b/mods/ra/chrome/ingame-diplomacy.yaml @@ -2,29 +2,94 @@ Container@DIPLOMACY: Logic:DiplomacyLogic X:25 Y:50 - Width:950 - Height:500 + Width:540 + Height:400 Visible:false Children: Background@DIPLOMACY_BG: - X:(WINDOW_RIGHT - WIDTH)/2 - Y:(WINDOW_BOTTOM - HEIGHT)/2 - Width:450 - Height:400 + Width:PARENT_RIGHT + Height:PARENT_BOTTOM Children: Label@LABEL_TITLE: X:(PARENT_RIGHT - WIDTH)/2 - Y:20 + Y:10 Width:250 Height:25 Text:Diplomacy Align:Center Font:Bold - Button@CLOSE_DIPLOMACY: - X:(PARENT_RIGHT - WIDTH)/2 - Y:350 - Width:160 - Height:25 - Text:Close - Font:Bold - Key:escape \ No newline at end of file + Container@DIPLOMACY_HEADERS: + X:0 + Y:0 + Width:PARENT_RIGHT + Height:PARENT_BOTTOM + Children: + Label@PLAYER_HEADER: + 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 \ No newline at end of file diff --git a/mods/ra/chrome/lobby-dialogs.yaml b/mods/ra/chrome/lobby-dialogs.yaml index 633f4d6c5b..45a6782d75 100644 --- a/mods/ra/chrome/lobby-dialogs.yaml +++ b/mods/ra/chrome/lobby-dialogs.yaml @@ -101,7 +101,7 @@ Background@LOBBY_OPTIONS_BIN: Y:40 Width:220 Height:20 - Text:Team Changes + Text:Diplomacy Changes Label@STARTINGCASH_DESC: Y:87 Width:80 diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index 9c893483c1..3f07d212d5 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -92,6 +92,7 @@ ChromeLayout: mods/ra/chrome/gameinit.yaml mods/ra/chrome/ingame.yaml mods/ra/chrome/ingame-chat.yaml + mods/ra/chrome/ingame-diplomacy.yaml mods/ra/chrome/ingame-fmvplayer.yaml mods/ra/chrome/ingame-menu.yaml mods/ra/chrome/ingame-objectives.yaml