Peer rename + details box on Connectivity tab; Add band dialog fixes
Add band dialog (from testing feedback): * Tab order is now Start, End, Gain, OK, Cancel (OK was after Cancel). * Gain box takes decimals like 1.5 (half-dB steps); parametric list shows one decimal. * The two frequency boxes start empty — nothing prepopulated to mislead; both required on OK. New Connectivity-tab feature (held for next release): * Rename peer (Alt+M) opens a dialog to give a peer a friendly name, with a Clear custom name button. Names are keyed by the peer's MACHINE NAME (stable across restarts, IP changes and networks), stored machine-wide in AppConfig.PeerFriendlyNames, and resolved everywhere a peer shows: both peer lists (via PeerListItem.DisplayNameProvider), the volume/pan/EQ list, the status line and split-recording filenames. Manual-by-IP peers with no announced name fall back to keying by address. * Peer details (Alt+E): a read-only box for the highlighted connected peer showing name, machine name, IP, connected-for, link health + ping, what they're sending, and whether they're receiving our audio. "Sending: 2 devices on ASIO at 48 kHz, Opus" is derived from the live receive streams — each stream is one device and its lane gives WASAPI vs ASIO — so NO protocol change and no new privacy exposure. AudioReceiver.ActiveFormatsFromAddress added for this. Manual updated (readme.html + MANUAL.md). Build clean; --selftest passes; deployed to both test folders. Held for next release. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
033edd776f
commit
f35f6c3c28
@@ -0,0 +1,84 @@
|
||||
namespace RemSound.App;
|
||||
|
||||
/// <summary>Modal dialog for giving a peer a friendly name. Shows the machine name for reference, a
|
||||
/// text box for the custom name, and a "Clear custom name" button that wipes it back to the machine
|
||||
/// name. OK (or Clear) returns DialogResult.OK; the caller reads <see cref="FriendlyName"/> — null
|
||||
/// meaning "no custom name" (cleared or left blank). Cancel/Escape makes no change.</summary>
|
||||
internal sealed class RenamePeerDialog : Form
|
||||
{
|
||||
private readonly TextBox nameBox = new()
|
||||
{
|
||||
Width = 260,
|
||||
TabIndex = 0,
|
||||
AccessibleName = "Friendly name (Alt+N)",
|
||||
};
|
||||
|
||||
/// <summary>The chosen name, valid only when ShowDialog returned OK. Null = no custom name.</summary>
|
||||
public string? FriendlyName { get; private set; }
|
||||
|
||||
public RenamePeerDialog(string machineName, string? currentCustomName)
|
||||
{
|
||||
Text = "Rename peer";
|
||||
StartPosition = FormStartPosition.CenterParent;
|
||||
FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
MinimizeBox = false;
|
||||
MaximizeBox = false;
|
||||
ShowInTaskbar = false;
|
||||
ClientSize = new Size(380, 170);
|
||||
|
||||
nameBox.Text = currentCustomName ?? "";
|
||||
|
||||
var grid = new TableLayoutPanel
|
||||
{
|
||||
Dock = DockStyle.Fill,
|
||||
Padding = new Padding(12),
|
||||
ColumnCount = 2,
|
||||
RowCount = 3,
|
||||
};
|
||||
grid.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
|
||||
grid.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
|
||||
|
||||
var machineLabel = new Label
|
||||
{
|
||||
Text = $"Machine name: {machineName}",
|
||||
AutoSize = true,
|
||||
Anchor = AnchorStyles.Left,
|
||||
Margin = new Padding(0, 0, 0, 8),
|
||||
};
|
||||
grid.Controls.Add(machineLabel, 0, 0);
|
||||
grid.SetColumnSpan(machineLabel, 2);
|
||||
|
||||
// Plain label with '&' wires the mnemonic to the next control in tab order (the text box).
|
||||
var nameLabel = new Label { Text = "Friendly &name (Alt+N)", AutoSize = true, Anchor = AnchorStyles.Left, Margin = new Padding(0, 4, 8, 0) };
|
||||
grid.Controls.Add(nameLabel, 0, 1);
|
||||
grid.Controls.Add(nameBox, 1, 1);
|
||||
|
||||
var clearButton = new Button { Text = "&Clear custom name (Alt+C)", AutoSize = true, AccessibleName = "Clear custom name", TabIndex = 1 };
|
||||
var okButton = new Button { Text = "OK", AutoSize = true, DialogResult = DialogResult.OK, TabIndex = 2 };
|
||||
var cancelButton = new Button { Text = "Cancel", AutoSize = true, DialogResult = DialogResult.Cancel, TabIndex = 3 };
|
||||
|
||||
clearButton.Click += (_, _) =>
|
||||
{
|
||||
FriendlyName = null;
|
||||
DialogResult = DialogResult.OK;
|
||||
Close();
|
||||
};
|
||||
okButton.Click += (_, _) =>
|
||||
{
|
||||
var t = nameBox.Text.Trim();
|
||||
FriendlyName = t.Length == 0 ? null : t; // blank box = clear, same as the Clear button
|
||||
};
|
||||
|
||||
var buttonRow = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.LeftToRight, AutoSize = true, TabIndex = 2 };
|
||||
buttonRow.Controls.Add(clearButton);
|
||||
buttonRow.Controls.Add(okButton);
|
||||
buttonRow.Controls.Add(cancelButton);
|
||||
grid.Controls.Add(buttonRow, 1, 2);
|
||||
|
||||
Controls.Add(grid);
|
||||
AcceptButton = okButton;
|
||||
CancelButton = cancelButton;
|
||||
|
||||
Shown += (_, _) => { nameBox.Focus(); nameBox.SelectAll(); };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user