diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index d27d0f9685..469a033f26 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -139,35 +139,27 @@ namespace OpenRA.Mods.Cnc.Widgets var disconnectButton = lobby.GetWidget("DISCONNECT_BUTTON"); disconnectButton.OnClick = onExit; - var lockTeamsCheckbox = lobby.GetWidget("LOCKTEAMS_CHECKBOX"); + var gameStarting = false; + var lockTeamsCheckbox = lobby.GetWidget("LOCKTEAMS_CHECKBOX"); lockTeamsCheckbox.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.LockTeams; - lockTeamsCheckbox.OnChange += _ => - { - if (Game.IsHost) - orderManager.IssueOrder(Order.Command( + lockTeamsCheckbox.IsDisabled = () => !Game.IsHost || gameStarting; + lockTeamsCheckbox.OnClick = () => orderManager.IssueOrder(Order.Command( "lockteams {0}".F(!orderManager.LobbyInfo.GlobalSettings.LockTeams))); - }; - - var allowCheats = lobby.GetWidget("ALLOWCHEATS_CHECKBOX"); + + var allowCheats = lobby.GetWidget("ALLOWCHEATS_CHECKBOX"); allowCheats.IsChecked = () => orderManager.LobbyInfo.GlobalSettings.AllowCheats; - allowCheats.OnChange += _ => - { - if (Game.IsHost) - orderManager.IssueOrder(Order.Command( + allowCheats.IsDisabled = () => !Game.IsHost || gameStarting; + 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; startGameButton.OnClick = () => { - mapButton.Visible = false; - disconnectButton.Visible = false; - lockTeamsCheckbox.Visible = false; + gameStarting = true; orderManager.IssueOrder(Order.Command("startgame")); }; - - // Todo: Only show if the map requirements are met for player slots - startGameButton.IsVisible = () => Game.IsHost; bool teamChat = false; var chatLabel = lobby.GetWidget("LABEL_CHATTYPE"); diff --git a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs index 2a0230c1ba..aa41c6fd8a 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncMenuButton.cs @@ -23,13 +23,13 @@ namespace OpenRA.Mods.Cnc.Widgets public CncMenuButtonWidget() : base() { - OnMouseUp = mi => { OnClick(); return true; }; + OnMouseUp = mi => { if (!IsDisabled()) OnClick(); return true; }; } protected CncMenuButtonWidget(CncMenuButtonWidget widget) : base(widget) { - OnMouseUp = mi => { OnClick(); return true; }; + OnMouseUp = mi => { if (!IsDisabled()) OnClick(); return true; }; } public override int2 ChildOrigin { get { return RenderOrigin; } } @@ -50,5 +50,37 @@ namespace OpenRA.Mods.Cnc.Widgets font.Measure(text).Y / 2), IsDisabled() ? Color.Gray : Color.White); } } + + public class CncCheckboxWidget : CncMenuButtonWidget + { + public CncCheckboxWidget() + : base() { } + protected CncCheckboxWidget(CncCheckboxWidget widget) + : base(widget) { } + + public Func IsChecked = () => false; + public int baseLine = 1; + + public override void DrawInner() + { + var state = IsDisabled() ? "button-disabled" : + Depressed ? "button-pressed" : + RenderBounds.Contains(Viewport.LastMousePos) ? "button-hover" : + "button"; + + var font = Game.Renderer.BoldFont; + var rect = RenderBounds; + WidgetUtils.DrawPanel(state, new Rectangle(rect.Location, new Size(Bounds.Height, Bounds.Height))); + + var textSize = font.Measure(Text); + font.DrawText(Text, + new float2(rect.Left + rect.Height * 1.5f, RenderOrigin.Y - baseLine + (Bounds.Height - textSize.Y)/2), Color.White); + + if (IsChecked()) + WidgetUtils.DrawRGBA( + ChromeProvider.GetImage("checkbox", "checked"), + new float2(rect.Left + 2, rect.Top + 2)); + } + } } diff --git a/mods/cnc/chrome/lobby.yaml b/mods/cnc/chrome/lobby.yaml index d16b9034ac..d0e02d6867 100644 --- a/mods/cnc/chrome/lobby.yaml +++ b/mods/cnc/chrome/lobby.yaml @@ -31,14 +31,14 @@ Container@SERVER_LOBBY: Y:1 Width:192 Height:192 - Checkbox@LOCKTEAMS_CHECKBOX: + CncCheckbox@LOCKTEAMS_CHECKBOX: Id:LOCKTEAMS_CHECKBOX X:PARENT_RIGHT-209 Y:230 Width:80 Height:20 Text: Lock Teams - Checkbox@ALLOWCHEATS_CHECKBOX: + CncCheckbox@ALLOWCHEATS_CHECKBOX: Id:ALLOWCHEATS_CHECKBOX X:PARENT_RIGHT-209 Y:255