diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index d516020996..fff4d6f045 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -238,7 +238,7 @@ namespace OpenRA { var isLocalPlayer = client.Index == Game.orderManager.Connection.LocalClientId; var paletteRect = new Rectangle(r.Left + 130, y - 2, 65, 22); - + /* if (isLocalPlayer) { // todo: name editing @@ -264,9 +264,9 @@ namespace OpenRA DrawDialogBackground(readyRect, "dialog3"); AddButton(readyRect, CycleReady); } - + */ shpRenderer.Flush(); - + /* f = renderer.RegularFont; f.DrawText(client.Name, new int2(r.Left + 40, y), Color.White); lineRenderer.FillRect(RectangleF.FromLTRB(paletteRect.Left + Game.viewport.Location.X + 5, @@ -280,7 +280,7 @@ namespace OpenRA f.DrawText((client.Team == 0)? "-" : client.Team.ToString(), new int2(r.Left + 395 + 20, y), Color.White); f.DrawText(client.State.ToString(), new int2(r.Left + 475, y), Color.White); y += 30; - + */ rgbaRenderer.Flush(); } diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index 316ecf4746..7faf0c0cbe 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -19,6 +19,7 @@ #endregion using System.Drawing; +using System; namespace OpenRA.Widgets { @@ -27,6 +28,14 @@ namespace OpenRA.Widgets public string Text = ""; public bool Depressed = false; public int VisualHeight = 1; + public Func GetText; + + public ButtonWidget() + : base() + { + GetText = () => { return Text; }; + } + public override bool HandleInput(MouseInput mi) { if (Chrome.selectedWidget == this) @@ -79,5 +88,20 @@ namespace OpenRA.Widgets base.Draw(world); } + + public override Widget Clone() + { + Log.Write("Foo"); + var widget = (base.Clone() as ButtonWidget); + Log.Write(widget.Id); + + widget.Text = Text; + widget.Depressed = Depressed; + widget.VisualHeight = VisualHeight; + widget.GetText = GetText; + + return widget; + } + } } \ No newline at end of file diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index 9f831feeab..b803a73356 100644 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -1,20 +1,55 @@ using System; +using System.Collections.Generic; +using System.Drawing; namespace OpenRA.Widgets.Delegates { public class LobbyDelegate : IWidgetDelegate { + Widget PlayerTemplate; + Widget Players; + public LobbyDelegate () { var r = Chrome.rootWidget; var lobby = r.GetWidget("SERVER_LOBBY"); + Players = Chrome.rootWidget.GetWidget("SERVER_LOBBY").GetWidget("PLAYERS"); + PlayerTemplate = Players.GetWidget("TEMPLATE"); + + var mapButton = lobby.GetWidget("CHANGEMAP_BUTTON"); mapButton.OnMouseUp = mi => { r.OpenWindow("MAP_CHOOSER"); return true; }; mapButton.IsVisible = () => {return (mapButton.Visible && Game.IsHost);}; + + Game.LobbyInfoChanged += () => { UpdatePlayerList(); }; + + UpdatePlayerList(); + } + + void UpdatePlayerList() + { + Log.Write("UpdatePlayerList"); + + Players.Children.Clear(); + int i = 0; + foreach(var client in Game.LobbyInfo.Clients) + { + Log.Write("Client {0}",client.Name); + var template = PlayerTemplate.Clone(); + template.Id = "PLAYER_{0}".F(client.Name); + template.GetWidget("NAME").GetText = () => client.Name; + template.Bounds = new Rectangle(template.Bounds.X, template.Bounds.Y + i, template.Bounds.Width, template.Bounds.Height); + template.Visible = true; + Players.AddChild(template); + i += 30; + } + Log.Write("Players has {0} children",Players.Children.Count); + foreach (var foo in Players.Children) + Log.Write("{0} {1} {2}",foo.Id, foo.GetWidget("NAME").GetText(), foo.Bounds.Y); } } } diff --git a/OpenRA.Game/Widgets/LabelWidget.cs b/OpenRA.Game/Widgets/LabelWidget.cs index a6c580cf9a..de29d1f413 100644 --- a/OpenRA.Game/Widgets/LabelWidget.cs +++ b/OpenRA.Game/Widgets/LabelWidget.cs @@ -35,11 +35,6 @@ namespace OpenRA.Widgets { GetText = () => { return Text; }; } - - public override void Initialize() - { - base.Initialize(); - } public override void Draw(World world) { diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index fc9e5321a0..32e778fe21 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -54,7 +54,34 @@ namespace OpenRA.Widgets public Func IsVisible; public Widget() { IsVisible = () => Visible; } - + + public virtual Widget Clone() + { + Widget widget = new Widget(); + + widget.Id = Id; + widget.X = X; + widget.Y = Y; + widget.Width = Width; + widget.Height = Height; + widget.Delegate = Delegate; + widget.ClickThrough = ClickThrough; + widget.Visible = Visible; + + widget.Bounds = Bounds; + widget.Parent = Parent; + + widget.OnMouseDown = OnMouseDown; + widget.OnMouseUp = OnMouseUp; + widget.OnMouseMove = OnMouseMove; + widget.IsVisible = IsVisible; + + foreach(var child in Children) + widget.AddChild(child.Clone()); + + return widget; + } + public virtual void Initialize() { // Parse the YAML equations to find the widget bounds diff --git a/mods/ra/menus.yaml b/mods/ra/menus.yaml index 7be217aa24..a8dc4abd62 100644 --- a/mods/ra/menus.yaml +++ b/mods/ra/menus.yaml @@ -288,6 +288,55 @@ Container: Y:4 Width:244 Height:244 + Container@PLAYERS + Id:PLAYERS + X:30 + Y:75 + Children: + Container@TEMPLATE + Id:TEMPLATE + Visible:false + Children: + Button@NAME + Id:NAME + Text:Name + Width:95 + Height:25 + X:0 + Y:0 + Button@COLOR + Id:NAME + Text:Color + Width:65 + Height:25 + X:100 + Y:0 + Button@FACTION + Id:FACTION + Text:Faction + Width:90 + Height:25 + X:180 + Y:0 + Button@SPAWN + Id:SPAWN + Text:Spawn + Width:70 + Height:25 + X:275 + Y:0 + Button@TEAM + Id:TEAM + Text:Team + Width:70 + Height:25 + X:355 + Y:0 + Button@STATUS + Id:STATUS + Text:Foo + X:430 + Y:0 Button@CHANGEMAP_BUTTON: Id:CHANGEMAP_BUTTON Visible:true