diff --git a/OpenRA.Game/Chrome/ButtonWidget.cs b/OpenRA.Game/Chrome/ButtonWidget.cs index c206347d74..41ee2e530a 100644 --- a/OpenRA.Game/Chrome/ButtonWidget.cs +++ b/OpenRA.Game/Chrome/ButtonWidget.cs @@ -6,7 +6,7 @@ namespace OpenRA.Widgets { class ButtonWidget : Widget { - public readonly string Text = ""; + public string Text = ""; public bool Depressed = false; public int VisualHeight = 1; public override bool HandleInput(MouseInput mi) diff --git a/OpenRA.Game/Chrome/DefaultWidgetDelegates.cs b/OpenRA.Game/Chrome/DefaultWidgetDelegates.cs index b05d108b50..ab9d77fd30 100644 --- a/OpenRA.Game/Chrome/DefaultWidgetDelegates.cs +++ b/OpenRA.Game/Chrome/DefaultWidgetDelegates.cs @@ -155,4 +155,33 @@ namespace OpenRA.Widgets.Delegates return false; } } + + public class ConnectionDialogsDelegate : WidgetDelegate + { + public override bool OnMouseUp(Widget w, MouseInput mi) + { + // Main Menu root + if (w.Id == "CONNECTION_BUTTON_ABORT") + { + Game.chrome.rootWidget.GetWidget("MAINMENU_BG").Visible = true; + Game.chrome.rootWidget.GetWidget("CONNECTING_BG").Visible = false; + return true; + } + + if (w.Id == "CONNECTION_BUTTON_CANCEL") + { + Game.chrome.rootWidget.GetWidget("MAINMENU_BG").Visible = true; + Game.chrome.rootWidget.GetWidget("CONNECTION_FAILED_BG").Visible = false; + return true; + } + + if (w.Id == "CONNECTION_BUTTON_RETRY") + { + Game.JoinServer(Game.CurrentHost,Game.CurrentPort); + return true; + } + return false; + } + } + } \ No newline at end of file diff --git a/OpenRA.Game/Chrome/LabelWidget.cs b/OpenRA.Game/Chrome/LabelWidget.cs index e06d46528e..fe36f5c877 100644 --- a/OpenRA.Game/Chrome/LabelWidget.cs +++ b/OpenRA.Game/Chrome/LabelWidget.cs @@ -6,8 +6,8 @@ namespace OpenRA.Widgets { class LabelWidget : Widget { - public readonly string Text = null; - public readonly string Align = "Left"; + public string Text = ""; + public string Align = "Left"; public override void Draw() { diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index a0ad4e5f66..dd5b61862d 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -146,9 +146,13 @@ namespace OpenRA JoinLocal(); } + public static string CurrentHost = ""; + public static int CurrentPort = 0; internal static void JoinServer(string host, int port) { - orderManager = new OrderManager(new NetworkConnection( host, port ), "replay.rep"); + CurrentHost = host; + CurrentPort = port; + orderManager = new OrderManager(new NetworkConnection( host, port )); // TODO: supplying a replay file prevents osx from joining a game } internal static void JoinLocal() diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index 6a0b0fc366..c85d0eb01b 100644 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -22,6 +22,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Network; using OpenRA.Traits; +using OpenRA.Widgets; namespace OpenRA.Graphics { @@ -60,7 +61,8 @@ namespace OpenRA.Graphics this.scrollPosition = Game.CellSize* mapStart; } - + + ConnectionState lastConnectionState = ConnectionState.PreConnecting; public void DrawRegions( World world ) { world.WorldRenderer.palette.Update(world.Queries.WithTraitMultiple().Select(t=>t.Trait)); @@ -81,22 +83,52 @@ namespace OpenRA.Graphics } else { - // what a hack. as soon as we have some real chrome stuff... - - Game.chrome.DrawWidgets(world); - switch( Game.orderManager.Connection.ConnectionState ) + // Still hacky, but at least it uses widgets + // TODO: Clean up the logic of this beast + // TODO: Have a proper "In main menu" state + ConnectionState state = Game.orderManager.Connection.ConnectionState; + if (state != lastConnectionState) { - case ConnectionState.Connecting: - Game.chrome.DrawDialog("Connecting to {0}:{1}...".F( Game.Settings.NetworkHost, Game.Settings.NetworkPort )); - break; - case ConnectionState.NotConnected: - // Todo: Hook these up - Game.chrome.DrawDialog("Connection failed.", "Retry", _ => {}, "Cancel",_ => {}); - break; - case ConnectionState.Connected: - Game.chrome.DrawLobby( world ); - break; + switch( Game.orderManager.Connection.ConnectionState ) + { + case ConnectionState.PreConnecting: + Game.chrome.rootWidget.GetWidget("MAINMENU_BG").Visible = true; + Game.chrome.rootWidget.GetWidget("CONNECTING_BG").Visible = false; + Game.chrome.rootWidget.GetWidget("CONNECTION_FAILED_BG").Visible = false; + break; + case ConnectionState.Connecting: + Game.chrome.rootWidget.GetWidget("MAINMENU_BG").Visible = false; + Game.chrome.rootWidget.GetWidget("CONNECTING_BG").Visible = true; + Game.chrome.rootWidget.GetWidget("CONNECTION_FAILED_BG").Visible = false; + + //(Game.chrome.rootWidget.GetWidget("CONNECTION_GROUP_FAILED") as LabelWidget).Text = "Connecting abort"; + + //Game.chrome.DrawDialog("Connecting to {0}:{1}...".F( Game.Settings.NetworkHost, Game.Settings.NetworkPort )); + break; + case ConnectionState.NotConnected: + Game.chrome.rootWidget.GetWidget("MAINMENU_BG").Visible = false; + Game.chrome.rootWidget.GetWidget("CONNECTING_BG").Visible = false; + Game.chrome.rootWidget.GetWidget("CONNECTION_FAILED_BG").Visible = true; + + //(Game.chrome.rootWidget.GetWidget("CONNECTION_GROUP_FAILED") as LabelWidget).Text = "Not Connected Retry/fail"; + //Game.chrome.DrawDialog("Connection failed.", "Retry", _ => {}, "Cancel",_ => {}); + break; + case ConnectionState.Connected: + Game.chrome.rootWidget.GetWidget("MAINMENU_BG").Visible = false; + Game.chrome.rootWidget.GetWidget("CONNECTING_BG").Visible = false; + Game.chrome.rootWidget.GetWidget("CONNECTION_FAILED_BG").Visible = false; + //Game.chrome.DrawLobby( world ); + break; + } } + + // TODO: Kill this (hopefully!) soon + if (state == ConnectionState.Connected) + Game.chrome.DrawLobby( world ); + + lastConnectionState = state; + Game.chrome.DrawWidgets(world); + } var cursorName = Game.chrome.HitTest(mousePos) ? "default" : Game.controller.ChooseCursor( world ); diff --git a/mods/cnc/menus.yaml b/mods/cnc/menus.yaml index f852c8e5d4..e8b57ffa7d 100644 --- a/mods/cnc/menus.yaml +++ b/mods/cnc/menus.yaml @@ -117,51 +117,77 @@ Container: Height:25 Text:Cancel Delegate:ServerBrowserDelegate - Background@CONNECTION_BG: - Id:CONNECTION_BG + Background@CONNECTION_FAILED_BG: + Id:CONNECTION_FAILED_BG X:(WINDOW_RIGHT - WIDTH)/2 Y:(WINDOW_BOTTOM - HEIGHT)/2 Width:450 - Height:400 + Height:150 Visible:false Children: - Label@CONNECTION_LABEL_TITLE: - Id:CONNECTION_LABEL_TITLE + Label@CONNECTION_FAILED_TITLE: + Id:CONNECTION_FAILED_TITLE + X:0 + Y:20 + Width:450 + Height:25 + Text:Connection Failed + Align:Center + Label@CONNECTION_FAILED_DESC: + Id:CONNECTION_FAILED_DESC + X:0 + Y:60 + Width:PARENT_RIGHT + Height:25 + Text:Could not connect to AAA.BBB.CCC.DDD:EEEE + Align:Center + Delegate:ConnectionDialogsDelegate + Button@CONNECTION_BUTTON_RETRY: + Id:CONNECTION_BUTTON_RETRY + X:PARENT_RIGHT - 360 + Y:PARENT_BOTTOM - 45 + Width:160 + Height:25 + Text:Retry + Delegate:ConnectionDialogsDelegate + Button@CONNECTION_BUTTON_CANCEL: + Id:CONNECTION_BUTTON_CANCEL + X:PARENT_RIGHT - 180 + Y:PARENT_BOTTOM - 45 + Width:160 + Height:25 + Text:Cancel + Delegate:ConnectionDialogsDelegate + Background@CONNECTING_BG: + Id:CONNECTING_BG + X:(WINDOW_RIGHT - WIDTH)/2 + Y:(WINDOW_BOTTOM - HEIGHT)/2 + Width:450 + Height:150 + Visible:false + Children: + Label@CONNECTING_TITLE: + Id:CONNECTING_TITLE X:0 Y:20 Width:450 Height:25 Text:Connecting Align:Center - Container@CONNECTION_GROUP_CONNECTING: - Id:CONNECTION_GROUP_CONNECTING - Visible:false - Children: - Button@CONNECTION_BUTTON_ABORT: - Id:CONNECTION_BUTTON_ABORT - X:PARENT_RIGHT - 180 - Y:PARENT_BOTTOM - 45 - Width:160 - Height:25 - Text:Abort - Delegate:ServerBrowserDelegate - Container@CONNECTION_GROUP_FAILED: - Id:CONNECTION_GROUP_FAILED - Visible:false - Children: - Button@CONNECTION_BUTTON_RETRY: - Id:CONNECTION_BUTTON_RETRY - X:PARENT_RIGHT - 360 - Y:PARENT_BOTTOM - 45 - Width:160 - Height:25 - Text:Retry - Delegate:ServerBrowserDelegate - Button@CONNECTION_BUTTON_CANCEL: - Id:CONNECTION_BUTTON_CANCEL - X:PARENT_RIGHT - 180 - Y:PARENT_BOTTOM - 45 - Width:160 - Height:25 - Text:Cancel - Delegate:ServerBrowserDelegate \ No newline at end of file + Label@CONNECTING_DESC: + Id:CONNECTING_DESC + X:0 + Y:60 + Width:PARENT_RIGHT + Height:25 + Text:Connecting to AAA.BBB.CCC.DDD:EEEE... + Align:Center + Delegate:ConnectionDialogsDelegate + Button@CONNECTION_BUTTON_ABORT: + Id:CONNECTION_BUTTON_ABORT + X:PARENT_RIGHT - 180 + Y:PARENT_BOTTOM - 45 + Width:160 + Height:25 + Text:Abort + Delegate:ConnectionDialogsDelegate \ No newline at end of file diff --git a/mods/ra/menus.yaml b/mods/ra/menus.yaml index 18e3d97d7a..e8b57ffa7d 100644 --- a/mods/ra/menus.yaml +++ b/mods/ra/menus.yaml @@ -117,51 +117,77 @@ Container: Height:25 Text:Cancel Delegate:ServerBrowserDelegate - Background@CONNECTION_BG: - Id:CONNECTION_BG + Background@CONNECTION_FAILED_BG: + Id:CONNECTION_FAILED_BG X:(WINDOW_RIGHT - WIDTH)/2 Y:(WINDOW_BOTTOM - HEIGHT)/2 Width:450 - Height:400 + Height:150 Visible:false Children: - Label@CONNECTION_LABEL_TITLE: - Id:CONNECTION_LABEL_TITLE + Label@CONNECTION_FAILED_TITLE: + Id:CONNECTION_FAILED_TITLE + X:0 + Y:20 + Width:450 + Height:25 + Text:Connection Failed + Align:Center + Label@CONNECTION_FAILED_DESC: + Id:CONNECTION_FAILED_DESC + X:0 + Y:60 + Width:PARENT_RIGHT + Height:25 + Text:Could not connect to AAA.BBB.CCC.DDD:EEEE + Align:Center + Delegate:ConnectionDialogsDelegate + Button@CONNECTION_BUTTON_RETRY: + Id:CONNECTION_BUTTON_RETRY + X:PARENT_RIGHT - 360 + Y:PARENT_BOTTOM - 45 + Width:160 + Height:25 + Text:Retry + Delegate:ConnectionDialogsDelegate + Button@CONNECTION_BUTTON_CANCEL: + Id:CONNECTION_BUTTON_CANCEL + X:PARENT_RIGHT - 180 + Y:PARENT_BOTTOM - 45 + Width:160 + Height:25 + Text:Cancel + Delegate:ConnectionDialogsDelegate + Background@CONNECTING_BG: + Id:CONNECTING_BG + X:(WINDOW_RIGHT - WIDTH)/2 + Y:(WINDOW_BOTTOM - HEIGHT)/2 + Width:450 + Height:150 + Visible:false + Children: + Label@CONNECTING_TITLE: + Id:CONNECTING_TITLE X:0 Y:20 Width:450 Height:25 Text:Connecting Align:Center - Container: - Id:CONNECTION_GROUP_CONNECTING - Visible:false - Children: - Button@CONNECTION_BUTTON_ABORT: - Id:CONNECTION_BUTTON_ABORT - X:PARENT_RIGHT - 180 - Y:PARENT_BOTTOM - 45 - Width:160 - Height:25 - Text:Abort - Delegate:ServerBrowserDelegate - Container: - Id:CONNECTION_GROUP_FAILED - Visible:false - Children: - Button@CONNECTION_BUTTON_RETRY: - Id:CONNECTION_BUTTON_RETRY - X:PARENT_RIGHT - 360 - Y:PARENT_BOTTOM - 45 - Width:160 - Height:25 - Text:Retry - Delegate:ServerBrowserDelegate - Button@CONNECTION_BUTTON_CANCEL: - Id:CONNECTION_BUTTON_CANCEL - X:PARENT_RIGHT - 180 - Y:PARENT_BOTTOM - 45 - Width:160 - Height:25 - Text:Cancel - Delegate:ServerBrowserDelegate \ No newline at end of file + Label@CONNECTING_DESC: + Id:CONNECTING_DESC + X:0 + Y:60 + Width:PARENT_RIGHT + Height:25 + Text:Connecting to AAA.BBB.CCC.DDD:EEEE... + Align:Center + Delegate:ConnectionDialogsDelegate + Button@CONNECTION_BUTTON_ABORT: + Id:CONNECTION_BUTTON_ABORT + X:PARENT_RIGHT - 180 + Y:PARENT_BOTTOM - 45 + Width:160 + Height:25 + Text:Abort + Delegate:ConnectionDialogsDelegate \ No newline at end of file