public ServerWindow(Manager manager, ServerScreen screen) : base(manager) { this.screen = screen; // Setup the window CaptionVisible = false; TopPanel.Visible = false; Movable = false; Resizable = false; Width = 550; Height = 500; Shadow = true; Center(); // Create main server list lstServers = new ControlList <ServerDataControl>(manager) { Left = 8, Top = 8, Width = ClientWidth - 16, Height = ClientHeight - BottomPanel.Height - 16, }; lstServers.Init(); Add(lstServers); RefreshServerList(); lstServers.DoubleClick += (sender, args) => { if (lstServers.ItemIndex < 0) { return; } var sdc = (ServerDataControl)lstServers.Items[lstServers.ItemIndex]; // Make sure the user clicks the item and not the empty space in the list if (sdc.CheckPositionMouse(((MouseEventArgs)args).Position - lstServers.AbsoluteRect.Location)) { this.screen.Client.Network.SendSessionRequest(servers[lstServers.ItemIndex].Host, servers[lstServers.ItemIndex].Port); } }; // Add controls to the bottom panel. (Add server, edit server, etc.) btnEdit = new Button(manager) { Text = "Edit", Top = 8, Width = 64 }; btnEdit.Init(); btnEdit.Left = (Width / 2) - (btnEdit.Width / 2); btnEdit.Click += (sender, args) => { if (lstServers.Items.Count <= 0) { return; } var window = new AddServerDialog(Manager, this, lstServers.ItemIndex, true, servers[lstServers.ItemIndex].Name, servers[lstServers.ItemIndex].Host, servers[lstServers.ItemIndex].Port); window.Init(); Manager.Add(window); window.ShowModal(); }; BottomPanel.Add(btnEdit); btnRemove = new Button(manager) { Text = "Remove", Left = btnEdit.Right + 8, Top = 8, Width = 64 }; btnRemove.Init(); btnRemove.Click += (clickSender, clickArgs) => { // Show a messagebox that asks for confirmation to delete the selected server. if (lstServers.Items.Count > 0) { var confirm = new MessageBox(manager, MessageBoxType.YesNo, "Are you sure you would like to remove\nthis server from your server list?", "Confirm Removal"); confirm.Init(); // When the message box is closed, check if the user clicked yes, if so, removed the server from the list. confirm.Closed += (closedSender, closedArgs) => { var dialog = closedSender as Dialog; if (dialog?.ModalResult != ModalResult.Yes) { return; } // If user clicked Yes servers.RemoveAt(lstServers.ItemIndex); lstServers.Items.RemoveAt(lstServers.ItemIndex); screen.Client.IO.WriteServers(servers); // Write the new server list to disk. }; Manager.Add(confirm); confirm.Show(); } }; BottomPanel.Add(btnRemove); btnAdd = new Button(manager) { Text = "Add", Top = 8, Width = 64 }; btnAdd.Init(); btnAdd.Right = btnEdit.Left - 8; btnAdd.Click += (sender, args) => { // Show add server dialog var window = new AddServerDialog(Manager, this, lstServers.ItemIndex, false, string.Empty, string.Empty, Globals.Values.DefaultServerPort); window.Init(); Manager.Add(window); window.ShowModal(); }; BottomPanel.Add(btnAdd); btnJoin = new Button(manager) { Text = "Connect", Top = 8, Width = 100 }; btnJoin.Init(); btnJoin.Right = btnAdd.Left - 8; btnJoin.Click += (sender, args) => { if (lstServers.ItemIndex < 0) { return; } btnJoin.Enabled = false; btnJoin.Text = "Connecting..."; this.screen.Client.Network.SendSessionRequest(servers[lstServers.ItemIndex].Host, servers[lstServers.ItemIndex].Port); }; BottomPanel.Add(btnJoin); btnRefresh = new Button(manager) { Text = "Refresh", Left = btnRemove.Right + 8, Top = 8, Width = 64 }; btnRefresh.Init(); btnRefresh.Click += (sender, args) => { RefreshServerList(); }; BottomPanel.Add(btnRefresh); // Listen for when init message is recieved screen.Client.Events.Network.Game.InitReceived.AddHandler(OnInit); // If user was disconnected from the server screen.Client.Events.Network.Game.Disconnected.AddHandler(OnDisconnect); }
public ServerDataControl(ServerScreen screen, Manager manager, ServerData server, Control parent) : base(manager) { this.screen = screen; this.manager = manager; // Setup Passive = false; Height = 76; data = server; Width = parent.Width + 8; // Background "gradient" image // TODO: Make an actual control. not a statusbar gradient = new StatusBar(manager); gradient.Init(); gradient.Height = ClientHeight; gradient.Alpha = .8f; Add(gradient); // Add controls lblName = new Label(Manager) { Width = Width, Text = data.Name, Left = 4, Top = 4, Font = FontSize.Default14, Alignment = Alignment.TopLeft }; lblName.Init(); Add(lblName); lblStats = new Label(Manager) { Width = Width, Text = string.Empty, Alignment = Alignment.TopLeft, Top = 4, Font = FontSize.Default12 }; lblStats.Init(); Add(lblStats); lblDescription = new Label(Manager) { Width = Width, Left = 4, Top = lblName.Bottom + 6, Font = FontSize.Default8, Alignment = Alignment.TopLeft }; lblDescription.Init(); lblDescription.Text = "Querying server for data..."; lblDescription.Height = Manager.Skin.Fonts["Default8"].Height * 2; Add(lblDescription); imgStatus = new ImageBox(Manager) { Top = lblStats.Top + 6, Left = 4, Width = 10, Height = 10, Image = screen.Client.Content["gui.icons.ping"], }; imgStatus.Init(); imgStatus.Color = Color.Transparent; Add(imgStatus); lblHost = new Label(Manager) { Width = Width, Text = data.GetHostString(), Alignment = Alignment.TopLeft, Left = 4, Top = lblDescription.Bottom, TextColor = Color.Gray }; lblHost.Init(); Add(lblHost); this.screen.Client.Events.Network.Game.ServerInfoReceived.AddHandler(args => { if (endPoint != null && args.Host.Equals(endPoint)) { pingTimer?.Dispose(); lblStats.Text = args.Players + "/" + args.MaxPlayers; lblDescription.Text = args.Description; lblStats.TextColor = onlineColor; lblStats.Left = (ClientWidth - (int)Manager.Skin.Fonts["Default12"].Resource.MeasureString(lblStats.Text).X) - 4 - 32; imgStatus.Right = lblStats.Left - 2; imgStatus.Color = onlineColor; } }); }