100 lines
2.8 KiB
C#
100 lines
2.8 KiB
C#
|
|
using VoiceCat.Interop;
|
||
|
|
|
||
|
|
namespace VoiceCat.App.Forms;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 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.
|
||
|
|
/// </summary>
|
||
|
|
public sealed class UserPickerDialog : Form
|
||
|
|
{
|
||
|
|
private readonly ListBox _lstUsers;
|
||
|
|
private readonly Button _btnOk;
|
||
|
|
private readonly Button _btnCancel;
|
||
|
|
|
||
|
|
private readonly List<UserInfo> _users;
|
||
|
|
|
||
|
|
public uint SelectedUserId { get; private set; }
|
||
|
|
|
||
|
|
public UserPickerDialog(List<UserInfo> 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;
|
||
|
|
}
|
||
|
|
}
|