using VoiceCat.Interop; namespace VoiceCat.App.Forms; /// /// Simple modal dialog for picking one user from a list of all server users. /// Used by "New Private Message" to let the user send a PM to anyone on the server. /// public sealed class UserPickerDialog : Form { private readonly ListBox _lstUsers; private readonly Button _btnOk; private readonly Button _btnCancel; private readonly List _users; public uint SelectedUserId { get; private set; } public UserPickerDialog(List users) { _users = users; Text = "New Private Message"; ClientSize = new Size(280, 320); MinimumSize = new Size(220, 240); FormBorderStyle = FormBorderStyle.FixedDialog; MaximizeBox = false; MinimizeBox = false; StartPosition = FormStartPosition.CenterParent; var lbl = new Label { Text = "Select a user:", AutoSize = true, Padding = new Padding(6, 6, 6, 2), Dock = DockStyle.Top, }; _lstUsers = new ListBox { Dock = DockStyle.Fill, AccessibleName = "User list", }; foreach (var u in users) _lstUsers.Items.Add(new UserItem(u.Id, u.Nickname)); var btnPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, FlowDirection = FlowDirection.RightToLeft, Height = 40, Padding = new Padding(4), AutoSize = false, }; _btnCancel = new Button { Text = "Cancel", DialogResult = DialogResult.Cancel, AutoSize = true, }; _btnOk = new Button { Text = "OK", DialogResult = DialogResult.OK, AutoSize = true, Enabled = false, }; AcceptButton = _btnOk; CancelButton = _btnCancel; btnPanel.Controls.Add(_btnCancel); btnPanel.Controls.Add(_btnOk); Controls.Add(_lstUsers); Controls.Add(lbl); Controls.Add(btnPanel); _lstUsers.SelectedIndexChanged += (_, _) => _btnOk.Enabled = _lstUsers.SelectedItem is UserItem; _lstUsers.DoubleClick += (_, _) => { if (_lstUsers.SelectedItem is UserItem) DialogResult = DialogResult.OK; }; } protected override void OnFormClosing(FormClosingEventArgs e) { if (DialogResult == DialogResult.OK && _lstUsers.SelectedItem is UserItem item) SelectedUserId = item.UserId; base.OnFormClosing(e); } private sealed class UserItem(uint userId, string nickname) { public uint UserId { get; } = userId; public override string ToString() => nickname; } }