Improvements to allow better connection dialog in content.

This commit is contained in:
Pieter-Jan Briers
2020-04-17 14:44:33 +02:00
parent 04eab336a4
commit 27771a31f0
3 changed files with 104 additions and 13 deletions

View File

@@ -232,14 +232,27 @@ namespace Content.Client
{ {
if (args.NewLevel == ClientRunLevel.Initialize) if (args.NewLevel == ClientRunLevel.Initialize)
{ {
_stateManager.RequestStateChange<MainScreen>(); SwitchToDefaultState(args.OldLevel == ClientRunLevel.Connected ||
args.OldLevel == ClientRunLevel.InGame);
} }
}; };
SwitchToDefaultState();
}
private void SwitchToDefaultState(bool disconnected = false)
{
// Fire off into state dependent on launcher or not. // Fire off into state dependent on launcher or not.
if (_gameController.LaunchState.FromLauncher) if (_gameController.LaunchState.FromLauncher)
{ {
_stateManager.RequestStateChange<LauncherConnecting>(); _stateManager.RequestStateChange<LauncherConnecting>();
var state = (LauncherConnecting) _stateManager.CurrentState;
if (disconnected)
{
state.SetDisconnected();
}
} }
else else
{ {

View File

@@ -21,11 +21,17 @@ namespace Content.Client.State
[Dependency] private readonly IStylesheetManager _stylesheetManager; [Dependency] private readonly IStylesheetManager _stylesheetManager;
[Dependency] private readonly IClientNetManager _clientNetManager; [Dependency] private readonly IClientNetManager _clientNetManager;
[Dependency] private readonly IGameController _gameController; [Dependency] private readonly IGameController _gameController;
[Dependency] private readonly IBaseClient _baseClient;
#pragma warning restore 649 #pragma warning restore 649
private Control _control; private Control _control;
private Label _connectStatus; private Label _connectStatus;
private Control _connectingStatus;
private Control _connectFail;
private Label _connectFailReason;
private Control _disconnected;
public override void Startup() public override void Startup()
{ {
var panelTex = ResC.GetTexture("/Nano/button.svg.96dpi.png"); var panelTex = ResC.GetTexture("/Nano/button.svg.96dpi.png");
@@ -37,11 +43,12 @@ namespace Content.Client.State
back.SetPatchMargin(StyleBox.Margin.All, 10); back.SetPatchMargin(StyleBox.Margin.All, 10);
Button exitButton; Button exitButton;
Label connectFailReason; Button reconnectButton;
Control connectingStatus; Button retryButton;
var address = _gameController.LaunchState.Ss14Address ?? _gameController.LaunchState.ConnectAddress; var address = _gameController.LaunchState.Ss14Address ?? _gameController.LaunchState.ConnectAddress;
VBoxContainer disconnected;
_control = new Control _control = new Control
{ {
Stylesheet = _stylesheetManager.SheetSpace, Stylesheet = _stylesheetManager.SheetSpace,
@@ -101,9 +108,10 @@ namespace Content.Client.State
{ {
new Control new Control
{ {
SizeFlagsVertical = Control.SizeFlags.FillExpand,
Children = Children =
{ {
(connectingStatus = new VBoxContainer (_connectingStatus = new VBoxContainer
{ {
SeparationOverride = 0, SeparationOverride = 0,
Children = Children =
@@ -121,9 +129,52 @@ namespace Content.Client.State
}), }),
} }
}), }),
(connectFailReason = new Label (_connectFail = new VBoxContainer
{ {
Align = Label.AlignMode.Center Visible = false,
SeparationOverride = 0,
Children =
{
(_connectFailReason = new Label
{
Align = Label.AlignMode.Center
}),
(retryButton = new Button
{
Text = "Retry",
SizeFlagsHorizontal = Control.SizeFlags.ShrinkCenter,
SizeFlagsVertical =
Control.SizeFlags.Expand |
Control.SizeFlags.ShrinkEnd
})
}
}),
(_disconnected = new VBoxContainer
{
SeparationOverride = 0,
Children =
{
new Label
{
Text = "Disconnected from server:",
Align = Label.AlignMode.Center
},
new Label
{
Text = _baseClient.LastDisconnectReason,
Align = Label.AlignMode.Center
},
(reconnectButton = new Button
{
Text = "Reconnect",
SizeFlagsHorizontal = Control.SizeFlags.ShrinkCenter,
SizeFlagsVertical =
Control.SizeFlags.Expand |
Control.SizeFlags.ShrinkEnd
})
}
}) })
} }
}, },
@@ -136,8 +187,6 @@ namespace Content.Client.State
Text = address, Text = address,
StyleClasses = {StyleBase.StyleClassLabelSubText}, StyleClasses = {StyleBase.StyleClassLabelSubText},
SizeFlagsHorizontal = Control.SizeFlags.ShrinkCenter, SizeFlagsHorizontal = Control.SizeFlags.ShrinkCenter,
SizeFlagsVertical =
Control.SizeFlags.ShrinkEnd | Control.SizeFlags.Expand,
} }
} }
}, },
@@ -197,15 +246,25 @@ namespace Content.Client.State
_gameController.Shutdown("Exit button pressed"); _gameController.Shutdown("Exit button pressed");
}; };
void Retry(BaseButton.ButtonEventArgs args)
{
_baseClient.ConnectToServer(_gameController.LaunchState.ConnectEndpoint);
SetActivePage(Page.Connecting);
}
reconnectButton.OnPressed += Retry;
retryButton.OnPressed += Retry;
_clientNetManager.ConnectFailed += (sender, args) => _clientNetManager.ConnectFailed += (sender, args) =>
{ {
connectFailReason.Text = Loc.GetString("Failed to connect to server:\n{0}", args.Reason); _connectFailReason.Text = Loc.GetString("Failed to connect to server:\n{0}", args.Reason);
connectingStatus.Visible = false; SetActivePage(Page.ConnectFailed);
connectFailReason.Visible = true;
}; };
_clientNetManager.ClientConnectStateChanged += ConnectStateChanged; _clientNetManager.ClientConnectStateChanged += ConnectStateChanged;
SetActivePage(Page.Connecting);
ConnectStateChanged(_clientNetManager.ClientConnectState); ConnectStateChanged(_clientNetManager.ClientConnectState);
} }
@@ -213,7 +272,7 @@ namespace Content.Client.State
{ {
_connectStatus.Text = Loc.GetString(state switch _connectStatus.Text = Loc.GetString(state switch
{ {
ClientConnectionState.NotConnecting => "Not connecting?", ClientConnectionState.NotConnecting => "You should not be seeing this",
ClientConnectionState.ResolvingHost => "Resolving server address...", ClientConnectionState.ResolvingHost => "Resolving server address...",
ClientConnectionState.EstablishingConnection => "Establishing initial connection...", ClientConnectionState.EstablishingConnection => "Establishing initial connection...",
ClientConnectionState.Handshake => "Doing handshake...", ClientConnectionState.Handshake => "Doing handshake...",
@@ -226,5 +285,24 @@ namespace Content.Client.State
{ {
_control.Dispose(); _control.Dispose();
} }
public void SetDisconnected()
{
SetActivePage(Page.Disconnected);
}
private void SetActivePage(Page page)
{
_connectingStatus.Visible = page == Page.Connecting;
_connectFail.Visible = page == Page.ConnectFailed;
_disconnected.Visible = page == Page.Disconnected;
}
private enum Page
{
Connecting,
ConnectFailed,
Disconnected,
}
} }
} }