From 088573f2b7af6e2a2a8c54e8e0410d41b6bfad80 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Mon, 20 Jun 2011 21:44:14 +1200 Subject: [PATCH] Disable controls instead of hiding when ready. Fixes #889 --- .../Widgets/Logic/CncLobbyLogic.cs | 106 ++++++++---------- mods/cnc/chrome/lobby.yaml | 14 --- 2 files changed, 47 insertions(+), 73 deletions(-) diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncLobbyLogic.cs index 0c76835497..1cb8910d6c 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncLobbyLogic.cs @@ -174,20 +174,22 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic var disconnectButton = lobby.GetWidget("DISCONNECT_BUTTON"); disconnectButton.OnClick = () => { CloseWindow(); onExit(); }; - + var gameStarting = false; var lockTeamsCheckbox = lobby.GetWidget("LOCKTEAMS_CHECKBOX"); lockTeamsCheckbox.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.LockTeams; - lockTeamsCheckbox.IsDisabled = () => !Game.IsHost || gameStarting; + lockTeamsCheckbox.IsDisabled = () => !Game.IsHost || gameStarting || orderManager.LocalClient == null + || orderManager.LocalClient.State == Session.ClientState.Ready; lockTeamsCheckbox.OnClick = () => orderManager.IssueOrder(Order.Command( "lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams))); - + var allowCheats = lobby.GetWidget("ALLOWCHEATS_CHECKBOX"); allowCheats.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.AllowCheats; - allowCheats.IsDisabled = () => !Game.IsHost || gameStarting; + allowCheats.IsDisabled = () => !Game.IsHost || gameStarting || orderManager.LocalClient == null + || orderManager.LocalClient.State == Session.ClientState.Ready; allowCheats.OnClick = () => orderManager.IssueOrder(Order.Command( "allowcheats {0}".F(!orderManager.LobbyInfo.GlobalSettings.AllowCheats))); - + var startGameButton = lobby.GetWidget("START_GAME_BUTTON"); startGameButton.IsVisible = () => Game.IsHost; startGameButton.IsDisabled = () => gameStarting; @@ -196,7 +198,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic gameStarting = true; orderManager.IssueOrder(Order.Command("startgame")); }; - + bool teamChat = false; var chatLabel = lobby.GetWidget("LABEL_CHATTYPE"); var chatTextField = lobby.GetWidget("CHAT_TEXTFIELD"); @@ -424,11 +426,13 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic { template = EmptySlotTemplate.Clone(); Func getText = () => slot.Closed ? "Closed" : "Open"; + var ready = orderManager.LocalClient.State == Session.ClientState.Ready; if (Game.IsHost) { var name = template.GetWidget("NAME_HOST"); name.IsVisible = () => true; + name.IsDisabled = () => ready; name.GetText = getText; name.OnMouseDown = _ => ShowSlotDropDown(name, slot, client); } @@ -440,28 +444,32 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic } var join = template.GetWidget("JOIN"); - if (join != null) - { - join.OnMouseUp = _ => { orderManager.IssueOrder(Order.Command("slot " + key)); return true; }; - join.IsVisible = () => !slot.Closed && orderManager.LocalClient.State != Session.ClientState.Ready; - } + join.IsVisible = () => !slot.Closed; + join.IsDisabled = () => ready; + join.OnClick = () => orderManager.IssueOrder(Order.Command("slot " + key)); } // Editable player in slot - else if ((client.Index == orderManager.LocalClient.Index && client.State != Session.ClientState.Ready) || + else if ((client.Index == orderManager.LocalClient.Index) || (client.Bot != null && Game.IsHost)) { template = EditablePlayerTemplate.Clone(); + var botReady = (client.Bot != null && Game.IsHost + && orderManager.LocalClient.State == Session.ClientState.Ready); + var ready = botReady || client.State == Session.ClientState.Ready; + if (client.Bot != null) { var name = template.GetWidget("BOT_DROPDOWN"); name.IsVisible = () => true; + name.IsDisabled = () => ready; name.GetText = () => client.Name; - name.OnMouseDown = _ => ShowSlotDropDown(name, slot, client); + name.OnMouseDown = _ => name.IsDisabled() ? true : ShowSlotDropDown(name, slot, client); } else { var name = template.GetWidget("NAME"); name.IsVisible = () => true; + name.IsDisabled = () => ready; name.Text = client.Name; name.OnEnterKey = () => { @@ -482,15 +490,15 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic } var color = template.GetWidget("COLOR"); - color.IsDisabled = () => slot.LockColor; - color.OnMouseDown = _ => { if (slot.LockColor) return true; return ShowColorDropDown(color, client); }; + color.IsDisabled = () => slot.LockColor || ready; + color.OnMouseDown = _ => color.IsDisabled() ? true : ShowColorDropDown(color, client); var colorBlock = color.GetWidget("COLORBLOCK"); colorBlock.GetColor = () => client.ColorRamp.GetColor(0); var faction = template.GetWidget("FACTION"); - faction.IsDisabled = () => slot.LockRace; - faction.OnMouseDown = _ => { if (slot.LockRace) return true; return ShowRaceDropDown(faction, client); }; + faction.IsDisabled = () => slot.LockRace || ready; + faction.OnMouseDown = _ => faction.IsDisabled() ? true : ShowRaceDropDown(faction, client); var factionname = faction.GetWidget("FACTIONNAME"); factionname.GetText = () => CountryNames[client.Country]; @@ -499,20 +507,20 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic factionflag.GetImageCollection = () => "flags"; var team = template.GetWidget("TEAM"); - team.IsDisabled = () => slot.LockTeam || client.Bot != null; - team.OnMouseDown = _ => { if (team.IsDisabled()) return true; return ShowTeamDropDown(team, client); }; + team.IsDisabled = () => slot.LockTeam || ready || client.Bot != null; + team.OnMouseDown = _ => team.IsDisabled() ? true : ShowTeamDropDown(team, client); team.GetText = () => (client.Team == 0) ? "-" : client.Team.ToString(); var spawn = template.GetWidget("SPAWN"); - spawn.IsDisabled = () => slot.LockSpawn; - spawn.OnMouseDown = _ => { if (spawn.IsDisabled()) return true; return ShowSpawnDropDown(spawn, client); }; + spawn.IsDisabled = () => slot.LockSpawn || ready; + spawn.OnMouseDown = _ => spawn.IsDisabled() ? true : ShowSpawnDropDown(spawn, client); spawn.GetText = () => (client.SpawnPoint == 0) ? "-" : client.SpawnPoint.ToString(); if (client.Bot == null) { // local player var status = template.GetWidget("STATUS_CHECKBOX"); - status.IsChecked = () => client.State == Session.ClientState.Ready; + status.IsChecked = () => ready; status.IsVisible = () => true; status.OnClick += CycleReady; } @@ -540,25 +548,13 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic var spawn = template.GetWidget("SPAWN"); spawn.GetText = () => (client.SpawnPoint == 0) ? "-" : client.SpawnPoint.ToString(); - if (client.Index == orderManager.LocalClient.Index) - { - // "Ready" local player -> status still needs to be editable - var status = template.GetWidget("STATUS_CHECKBOX"); - status.IsChecked = () => client.State == Session.ClientState.Ready; - status.IsVisible = () => true; - status.OnClick += CycleReady; - } - else - template.GetWidget("STATUS_IMAGE").IsVisible = () => - client.Bot != null || client.State == Session.ClientState.Ready; + template.GetWidget("STATUS_IMAGE").IsVisible = () => + client.Bot != null || client.State == Session.ClientState.Ready; var kickButton = template.GetWidget("KICK"); kickButton.IsVisible = () => Game.IsHost && client.Index != orderManager.LocalClient.Index; - kickButton.OnMouseUp = mi => - { - orderManager.IssueOrder(Order.Command("kick " + client.Index)); - return true; - }; + kickButton.IsDisabled = () => orderManager.LocalClient.State == Session.ClientState.Ready; + kickButton.OnClick = () => orderManager.IssueOrder(Order.Command("kick " + client.Index)); } template.IsVisible = () => true; @@ -569,11 +565,13 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic foreach (var client in orderManager.LobbyInfo.Clients.Where(client => client.Slot == null)) { Widget template; + var ready = client.State == Session.ClientState.Ready; // Editable spectator - if (client.Index == orderManager.LocalClient.Index && client.State != Session.ClientState.Ready) + if (client.Index == orderManager.LocalClient.Index) { template = EditableSpectatorTemplate.Clone(); var name = template.GetWidget("NAME"); + name.IsDisabled = () => ready; name.Text = client.Name; name.OnEnterKey = () => { @@ -593,13 +591,14 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic name.OnLoseFocus = () => name.OnEnterKey(); var color = template.GetWidget("COLOR"); - color.OnMouseDown = _ => ShowColorDropDown(color, client); + color.IsDisabled = () => ready; + color.OnMouseDown = _ => color.IsDisabled() ? true : ShowColorDropDown(color, client); var colorBlock = color.GetWidget("COLORBLOCK"); colorBlock.GetColor = () => client.ColorRamp.GetColor(0); var status = template.GetWidget("STATUS_CHECKBOX"); - status.IsChecked = () => client.State == Session.ClientState.Ready; + status.IsChecked = () => ready; status.OnClick += CycleReady; } // Non-editable spectator @@ -610,25 +609,13 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic var color = template.GetWidget("COLOR"); color.GetColor = () => client.ColorRamp.GetColor(0); - if (client.Index == orderManager.LocalClient.Index) - { - // "Ready" local player -> status still needs to be editable - var status = template.GetWidget("STATUS_CHECKBOX"); - status.IsChecked = () => client.State == Session.ClientState.Ready; - status.IsVisible = () => true; - status.OnClick += CycleReady; - } - else - template.GetWidget("STATUS_IMAGE").IsVisible = () => - client.Bot != null || client.State == Session.ClientState.Ready; + template.GetWidget("STATUS_IMAGE").IsVisible = () => + client.Bot != null || client.State == Session.ClientState.Ready; var kickButton = template.GetWidget("KICK"); kickButton.IsVisible = () => Game.IsHost && client.Index != orderManager.LocalClient.Index; - kickButton.OnMouseUp = mi => - { - orderManager.IssueOrder(Order.Command("kick " + client.Index)); - return true; - }; + kickButton.IsDisabled = () => orderManager.LocalClient.State == Session.ClientState.Ready; + kickButton.OnClick = () => orderManager.IssueOrder(Order.Command("kick " + client.Index)); } template.IsVisible = () => true; @@ -636,11 +623,12 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic } // Spectate button - if (orderManager.LocalClient.Slot != null && orderManager.LocalClient.State != Session.ClientState.Ready) + if (orderManager.LocalClient.Slot != null) { var spec = NewSpectatorTemplate.Clone(); var btn = spec.GetWidget("SPECTATE"); - btn.OnMouseUp = _ => { orderManager.IssueOrder(Order.Command("spectate")); return true; }; + btn.OnClick = () => orderManager.IssueOrder(Order.Command("spectate")); + btn.IsDisabled = () => orderManager.LocalClient.State == Session.ClientState.Ready; spec.IsVisible = () => true; Players.AddChild(spec); } diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index c2282fde02..6614374cc2 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -208,13 +208,6 @@ Container@SERVER_LOBBY: Height:20 ImageCollection:checkbox-bits ImageName:checked - Checkbox@STATUS_CHECKBOX: - Id:STATUS_CHECKBOX - Visible:false - X:448 - Y:2 - Width:20 - Height:20 Container@TEMPLATE_EMPTY: Id:TEMPLATE_EMPTY X:5 @@ -333,13 +326,6 @@ Container@SERVER_LOBBY: Height:20 ImageCollection:checkbox-bits ImageName:checked - Checkbox@STATUS_CHECKBOX: - Id:STATUS_CHECKBOX - Visible:false - X:448 - Y:2 - Width:20 - Height:20 Container@TEMPLATE_NEW_SPECTATOR: Id:TEMPLATE_NEW_SPECTATOR X:5