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;
}
}