fix foreach/closure bugs in RA LobbyLogic; factor out name widget setup

This commit is contained in:
Chris Forbes
2011-07-17 12:10:49 +12:00
parent 8b78bc0602
commit c05215c477

View File

@@ -356,24 +356,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
else if (c.Index == orderManager.LocalClient.Index && c.State != Session.ClientState.Ready) else if (c.Index == orderManager.LocalClient.Index && c.State != Session.ClientState.Ready)
{ {
template = LocalPlayerTemplate.Clone(); template = LocalPlayerTemplate.Clone();
var name = template.GetWidget<TextFieldWidget>("NAME"); SetupNameWidget(c, template.GetWidget<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();
var color = template.GetWidget<DropDownButtonWidget>("COLOR"); var color = template.GetWidget<DropDownButtonWidget>("COLOR");
color.IsDisabled = () => s.LockColor; color.IsDisabled = () => s.LockColor;
@@ -435,56 +418,40 @@ namespace OpenRA.Mods.RA.Widgets.Logic
// Add spectators // Add spectators
foreach (var client in orderManager.LobbyInfo.Clients.Where(client => client.Slot == null)) foreach (var client in orderManager.LobbyInfo.Clients.Where(client => client.Slot == null))
{ {
var c = client;
Widget template; Widget template;
// Editable spectator // 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(); template = LocalSpectatorTemplate.Clone();
var name = template.GetWidget<TextFieldWidget>("NAME"); SetupNameWidget(c, template.GetWidget<TextFieldWidget>("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();
var color = template.GetWidget<DropDownButtonWidget>("COLOR"); var color = template.GetWidget<DropDownButtonWidget>("COLOR");
color.OnMouseDown = _ => ShowColorDropDown(color, client); color.OnMouseDown = _ => ShowColorDropDown(color, c);
var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK"); var colorBlock = color.GetWidget<ColorBlockWidget>("COLORBLOCK");
colorBlock.GetColor = () => client.ColorRamp.GetColor(0); colorBlock.GetColor = () => c.ColorRamp.GetColor(0);
var status = template.GetWidget<CheckboxWidget>("STATUS"); var status = template.GetWidget<CheckboxWidget>("STATUS");
status.IsChecked = () => client.State == Session.ClientState.Ready; status.IsChecked = () => c.State == Session.ClientState.Ready;
status.OnClick += CycleReady; status.OnClick += CycleReady;
} }
// Non-editable spectator // Non-editable spectator
else else
{ {
template = RemoteSpectatorTemplate.Clone(); template = RemoteSpectatorTemplate.Clone();
template.GetWidget<LabelWidget>("NAME").GetText = () => client.Name; template.GetWidget<LabelWidget>("NAME").GetText = () => c.Name;
var color = template.GetWidget<ColorBlockWidget>("COLOR"); var color = template.GetWidget<ColorBlockWidget>("COLOR");
color.GetColor = () => client.ColorRamp.GetColor(0); color.GetColor = () => c.ColorRamp.GetColor(0);
var status = template.GetWidget<CheckboxWidget>("STATUS"); var status = template.GetWidget<CheckboxWidget>("STATUS");
status.IsChecked = () => client.State == Session.ClientState.Ready; status.IsChecked = () => c.State == Session.ClientState.Ready;
if (client.Index == orderManager.LocalClient.Index) if (c.Index == orderManager.LocalClient.Index)
status.OnClick += CycleReady; status.OnClick += CycleReady;
var kickButton = template.GetWidget<ButtonWidget>("KICK"); var kickButton = template.GetWidget<ButtonWidget>("KICK");
kickButton.IsVisible = () => Game.IsHost && client.Index != orderManager.LocalClient.Index; kickButton.IsVisible = () => Game.IsHost && c.Index != orderManager.LocalClient.Index;
kickButton.OnClick = () => orderManager.IssueOrder(Order.Command("kick " + client.Index)); kickButton.OnClick = () => orderManager.IssueOrder(Order.Command("kick " + c.Index));
} }
template.IsVisible = () => true; template.IsVisible = () => true;
@@ -501,6 +468,27 @@ namespace OpenRA.Mods.RA.Widgets.Logic
Players.AddChild(spec); 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); } bool SpawnPointAvailable(int index) { return (index == 0) || orderManager.LobbyInfo.Clients.All(c => c.SpawnPoint != index); }