From c05215c4770e808b1fa5e3fb5206c35bd05ae644 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sun, 17 Jul 2011 12:10:49 +1200 Subject: [PATCH] fix foreach/closure bugs in RA LobbyLogic; factor out name widget setup --- OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs | 82 +++++++++------------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index eb42ea0e47..d31d5c8fc7 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -356,24 +356,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic else if (c.Index == orderManager.LocalClient.Index && c.State != Session.ClientState.Ready) { template = LocalPlayerTemplate.Clone(); - var name = template.GetWidget("NAME"); - name.Text = c.Name; - name.OnEnterKey = () => - { - name.Text = name.Text.Trim(); - if (name.Text.Length == 0) - name.Text = c.Name; - - name.LoseFocus(); - if (name.Text == c.Name) - return true; - - orderManager.IssueOrder(Order.Command("name " + name.Text)); - Game.Settings.Player.Name = name.Text; - Game.Settings.Save(); - return true; - }; - name.OnLoseFocus = () => name.OnEnterKey(); + SetupNameWidget(c, template.GetWidget("NAME")); var color = template.GetWidget("COLOR"); color.IsDisabled = () => s.LockColor; @@ -435,56 +418,40 @@ namespace OpenRA.Mods.RA.Widgets.Logic // Add spectators foreach (var client in orderManager.LobbyInfo.Clients.Where(client => client.Slot == null)) { + var c = client; Widget template; // Editable spectator - if (client.Index == orderManager.LocalClient.Index && client.State != Session.ClientState.Ready) + if (c.Index == orderManager.LocalClient.Index && c.State != Session.ClientState.Ready) { template = LocalSpectatorTemplate.Clone(); - var name = template.GetWidget("NAME"); - name.Text = client.Name; - name.OnEnterKey = () => - { - name.Text = name.Text.Trim(); - if (name.Text.Length == 0) - name.Text = client.Name; - - name.LoseFocus(); - if (name.Text == client.Name) - return true; - - orderManager.IssueOrder(Order.Command("name " + name.Text)); - Game.Settings.Player.Name = name.Text; - Game.Settings.Save(); - return true; - }; - name.OnLoseFocus = () => name.OnEnterKey(); - + SetupNameWidget(c, template.GetWidget("NAME")); + var color = template.GetWidget("COLOR"); - color.OnMouseDown = _ => ShowColorDropDown(color, client); + color.OnMouseDown = _ => ShowColorDropDown(color, c); var colorBlock = color.GetWidget("COLORBLOCK"); - colorBlock.GetColor = () => client.ColorRamp.GetColor(0); + colorBlock.GetColor = () => c.ColorRamp.GetColor(0); var status = template.GetWidget("STATUS"); - status.IsChecked = () => client.State == Session.ClientState.Ready; + status.IsChecked = () => c.State == Session.ClientState.Ready; status.OnClick += CycleReady; } // Non-editable spectator else { template = RemoteSpectatorTemplate.Clone(); - template.GetWidget("NAME").GetText = () => client.Name; + template.GetWidget("NAME").GetText = () => c.Name; var color = template.GetWidget("COLOR"); - color.GetColor = () => client.ColorRamp.GetColor(0); + color.GetColor = () => c.ColorRamp.GetColor(0); var status = template.GetWidget("STATUS"); - status.IsChecked = () => client.State == Session.ClientState.Ready; - if (client.Index == orderManager.LocalClient.Index) + status.IsChecked = () => c.State == Session.ClientState.Ready; + if (c.Index == orderManager.LocalClient.Index) status.OnClick += CycleReady; var kickButton = template.GetWidget("KICK"); - kickButton.IsVisible = () => Game.IsHost && client.Index != orderManager.LocalClient.Index; - kickButton.OnClick = () => orderManager.IssueOrder(Order.Command("kick " + client.Index)); + kickButton.IsVisible = () => Game.IsHost && c.Index != orderManager.LocalClient.Index; + kickButton.OnClick = () => orderManager.IssueOrder(Order.Command("kick " + c.Index)); } template.IsVisible = () => true; @@ -501,6 +468,27 @@ namespace OpenRA.Mods.RA.Widgets.Logic Players.AddChild(spec); } } + + void SetupNameWidget(Session.Client c, TextFieldWidget name) + { + name.Text = c.Name; + name.OnEnterKey = () => + { + name.Text = name.Text.Trim(); + if (name.Text.Length == 0) + name.Text = c.Name; + + name.LoseFocus(); + if (name.Text == c.Name) + return true; + + orderManager.IssueOrder(Order.Command("name " + name.Text)); + Game.Settings.Player.Name = name.Text; + Game.Settings.Save(); + return true; + }; + name.OnLoseFocus = () => name.OnEnterKey(); + } bool SpawnPointAvailable(int index) { return (index == 0) || orderManager.LobbyInfo.Clients.All(c => c.SpawnPoint != index); }