public MultiplayerAddEditServerState(string serverType, string name, string address,
                                             Action <AddOrEditCallback> callbackAction,
                                             GuiPanoramaSkyBox skyBox) :
            base(callbackAction)
        {
            _serverTypeManager = GetService <ServerTypeManager>();
            _skyBox            = skyBox;

            Title = "Add Server";
            TitleTranslationKey = "addServer.title";

            base.HeaderTitle.Anchor    = Alignment.MiddleCenter;
            base.HeaderTitle.FontStyle = FontStyle.Bold | FontStyle.DropShadow;
            Body.BackgroundOverlay     = new Color(Color.Black, 0.5f);

            Body.ChildAnchor = Alignment.MiddleCenter;

            var usernameRow = AddGuiRow(new GuiTextElement()
            {
                Text           = "Server Name:",
                TranslationKey = "addServer.enterName",
                Margin         = new Thickness(0, 0, 5, 0)
            }, _nameInput = new GuiTextInput()
            {
                TabIndex = 1,

                Width = 200,

                PlaceHolder = "Name of the server",
                Margin      = new Thickness(23, 5, 5, 5),
            });

            usernameRow.ChildAnchor = Alignment.MiddleCenter;
            usernameRow.Orientation = Orientation.Horizontal;

            var hostnameRow = AddGuiRow(new GuiTextElement()
            {
                Text           = "Server Address:",
                TranslationKey = "addServer.enterIp",
                Margin         = new Thickness(0, 0, 5, 0)
            }, _hostnameInput = new GuiTextInput()
            {
                TabIndex = 2,

                Width = 200,

                PlaceHolder = "Hostname or IP",
                Margin      = new Thickness(5),
            });

            hostnameRow.ChildAnchor = Alignment.MiddleCenter;
            hostnameRow.Orientation = Orientation.Horizontal;

            var typeLabelRow = AddGuiRow(_serverTypeLabel = new GuiTextElement()
            {
                Text   = "Server Type:",
                Margin = new Thickness(0, 0, 5, 0)
            });

            typeLabelRow.ChildAnchor = Alignment.MiddleCenter;
            typeLabelRow.Orientation = Orientation.Horizontal;

            AddGuiRow(_serverTypeGroup = new GuiButtonGroup()
            {
                Orientation = Orientation.Horizontal,
                ChildAnchor = Alignment.MiddleCenter
            });

            int tabIndex = 3;

            foreach (var type in _serverTypeManager.GetAll())
            {
                if (_selectedImplementation == null)
                {
                    _selectedImplementation = type;
                }

                GuiToggleButton element;
                _serverTypeGroup.AddChild(
                    element = new GuiToggleButton(type.DisplayName)
                {
                    Margin  = new Thickness(5),
                    Modern  = true,
                    Width   = 50,
                    Checked = serverType == type.Id,
                    CheckedOutlineThickness = new Thickness(1),
                    DisplayFormat           = new ValueFormatter <bool>((val) => $"{type.DisplayName} {(val ? "[Active]" : "")}"),
                    TabIndex = tabIndex++
                });

                element.ValueChanged += (sender, value) =>
                {
                    if (value)
                    {
                        _selectedImplementation = type;
                    }
                };
            }

            var buttonRow = AddGuiRow(_saveButton = new GuiButton(OnSaveButtonPressed)
            {
                AccessKey = Keys.Enter,

                TranslationKey = "addServer.add",
                Margin         = new Thickness(5),
                Modern         = false,
                Width          = 100,
                TabIndex       = 5
            }, new GuiButton(OnCancelButtonPressed)
            {
                AccessKey = Keys.Escape,

                TranslationKey = "gui.cancel",
                Margin         = new Thickness(5),
                Modern         = false,
                Width          = 100,
                TabIndex       = 6
            });

            buttonRow.ChildAnchor = Alignment.MiddleCenter;


            AddGuiElement(_errorMessage = new GuiTextElement()
            {
                TextColor = TextColor.Red
            });

            if (!string.IsNullOrWhiteSpace(name))
            {
                _nameInput.Value = name;
            }

            if (!string.IsNullOrWhiteSpace(address))
            {
                _hostnameInput.Value = address;
            }

            if (_entry != null)
            {
                //EnableButtonsFor(_entry.ServerType);
            }

            Background = new GuiTexture2D(_skyBox, TextureRepeatMode.Stretch);
        }
        public MultiplayerAddEditServerState(ServerType serverType, string name, string address,
                                             Action <SavedServerEntry> callbackAction,
                                             GuiPanoramaSkyBox skyBox) :
            base(callbackAction)
        {
            _savedServersStorage = GetService <IListStorageProvider <SavedServerEntry> >();
            _skyBox = skyBox;

            Title = "Add Server";
            TitleTranslationKey = "addServer.title";

            base.HeaderTitle.Anchor    = Alignment.MiddleCenter;
            base.HeaderTitle.FontStyle = FontStyle.Bold | FontStyle.DropShadow;
            Body.BackgroundOverlay     = new Color(Color.Black, 0.5f);

            Body.ChildAnchor = Alignment.MiddleCenter;

            var usernameRow = AddGuiRow(new GuiTextElement()
            {
                Text           = "Server Name:",
                TranslationKey = "addServer.enterName",
                Margin         = new Thickness(0, 0, 5, 0)
            }, _nameInput = new GuiTextInput()
            {
                TabIndex = 1,

                Width = 200,

                PlaceHolder = "Name of the server",
                Margin      = new Thickness(23, 5, 5, 5),
            });

            usernameRow.ChildAnchor = Alignment.MiddleCenter;
            usernameRow.Orientation = Orientation.Horizontal;

            var hostnameRow = AddGuiRow(new GuiTextElement()
            {
                Text           = "Server Address:",
                TranslationKey = "addServer.enterIp",
                Margin         = new Thickness(0, 0, 5, 0)
            }, _hostnameInput = new GuiTextInput()
            {
                TabIndex = 2,

                Width = 200,

                PlaceHolder = "Hostname or IP",
                Margin      = new Thickness(5),
            });

            hostnameRow.ChildAnchor = Alignment.MiddleCenter;
            hostnameRow.Orientation = Orientation.Horizontal;

            var typeLabelRow = AddGuiRow(_serverTypeLabel = new GuiTextElement()
            {
                Text   = "Server Type:",
                Margin = new Thickness(0, 0, 5, 0)
            });

            typeLabelRow.ChildAnchor = Alignment.MiddleCenter;
            typeLabelRow.Orientation = Orientation.Horizontal;

            AddGuiRow(_serverTypeGroup = new GuiButtonGroup()
            {
                Orientation = Orientation.Horizontal,
                ChildAnchor = Alignment.MiddleCenter
            });
            _serverTypeGroup.AddChild(_javaEditionButton = new GuiToggleButton("Java")
            {
                Margin  = new Thickness(5),
                Modern  = true,
                Width   = 50,
                Checked = serverType == ServerType.Java,
                CheckedOutlineThickness = new Thickness(1),
                DisplayFormat           = new ValueFormatter <bool>((val) => $"Java {(val ? "[Active]" : "")}"),
                TabIndex = 3
            });
            _serverTypeGroup.AddChild(_bedrockEditionButton = new GuiToggleButton("Bedrock")
            {
                Margin  = new Thickness(5),
                Modern  = true,
                Width   = 50,
                Checked = serverType == ServerType.Bedrock,
                CheckedOutlineThickness = new Thickness(1),
                DisplayFormat           = new ValueFormatter <bool>((val) => $"Bedrock {(val ? "[Active]" : "")}"),
                TabIndex = 4
            });

            //	var portRow = AddGuiRow();
            //  portRow.ChildAnchor = Alignment.MiddleCenter;

            var buttonRow = AddGuiRow(_saveButton = new GuiButton(OnSaveButtonPressed)
            {
                AccessKey = Keys.Enter,

                TranslationKey = "addServer.add",
                Margin         = new Thickness(5),
                Modern         = false,
                Width          = 100,
                TabIndex       = 5
            }, new GuiButton(OnCancelButtonPressed)
            {
                AccessKey = Keys.Escape,

                TranslationKey = "gui.cancel",
                Margin         = new Thickness(5),
                Modern         = false,
                Width          = 100,
                TabIndex       = 6
            });

            buttonRow.ChildAnchor = Alignment.MiddleCenter;


            AddGuiElement(_errorMessage = new GuiTextElement()
            {
                TextColor = TextColor.Red
            });

            if (!string.IsNullOrWhiteSpace(name))
            {
                _nameInput.Value = name;
            }

            if (!string.IsNullOrWhiteSpace(address))
            {
                _hostnameInput.Value = address;
            }

            if (_entry != null)
            {
                //EnableButtonsFor(_entry.ServerType);
            }

            Background = new GuiTexture2D(_skyBox, TextureRepeatMode.Stretch);
        }