using Content.Client.Stylesheets; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.IoC; using Robust.Shared.Timing; using Robust.Shared.Localization; using Robust.Shared.Network; namespace Content.Client.Launcher { [GenerateTypedNameReferences] public sealed partial class LauncherConnectingGui : Control { private const float RedialWaitTimeSeconds = 15f; private readonly LauncherConnecting _state; private float _redialWaitTime = RedialWaitTimeSeconds; public LauncherConnectingGui(LauncherConnecting state) { _state = state; RobustXamlLoader.Load(this); LayoutContainer.SetAnchorPreset(this, LayoutContainer.LayoutPreset.Wide); Stylesheet = IoCManager.Resolve().SheetSpace; ReconnectButton.OnPressed += _ => _state.RetryConnect(); // Redial shouldn't fail, but if it does, try a reconnect (maybe we're being run from debug) RedialButton.OnPressed += _ => { if (!_state.Redial()) _state.RetryConnect(); }; RetryButton.OnPressed += _ => _state.RetryConnect(); ExitButton.OnPressed += _ => _state.Exit(); var addr = state.Address; if (addr != null) ConnectingAddress.Text = addr; state.PageChanged += OnPageChanged; state.ConnectFailReasonChanged += ConnectFailReasonChanged; state.ConnectionStateChanged += ConnectionStateChanged; ConnectionStateChanged(state.ConnectionState); // Redial flag setup var edim = IoCManager.Resolve(); edim.LastNetDisconnectedArgsChanged += LastNetDisconnectedArgsChanged; LastNetDisconnectedArgsChanged(edim.LastNetDisconnectedArgs); } private void ConnectFailReasonChanged(string? reason) { ConnectFailReason.Text = reason == null ? null : Loc.GetString("connecting-fail-reason", ("reason", reason)); } private void LastNetDisconnectedArgsChanged(NetDisconnectedArgs? args) { var redialFlag = args?.RedialFlag ?? false; RedialButton.Visible = redialFlag; ReconnectButton.Visible = !redialFlag; } protected override void FrameUpdate(FrameEventArgs args) { base.FrameUpdate(args); _redialWaitTime -= args.DeltaSeconds; if (_redialWaitTime <= 0) { RedialButton.Disabled = false; RedialButton.Text = Loc.GetString("connecting-redial"); } else { RedialButton.Disabled = true; RedialButton.Text = Loc.GetString("connecting-redial-wait", ("time", _redialWaitTime)); } } private void OnPageChanged(LauncherConnecting.Page page) { ConnectingStatus.Visible = page == LauncherConnecting.Page.Connecting; ConnectFail.Visible = page == LauncherConnecting.Page.ConnectFailed; Disconnected.Visible = page == LauncherConnecting.Page.Disconnected; if (page == LauncherConnecting.Page.Disconnected) DisconnectReason.Text = _state.LastDisconnectReason; } private void ConnectionStateChanged(ClientConnectionState state) { ConnectStatus.Text = Loc.GetString($"connecting-state-{state}"); } } }