* Connectivity tab order: Add peer by IP now sits right after Rename peer (before the Discovered list), grouped with the connected-peer actions, per Ed's requested order. Dropped the second section header (only the lock toggle was under it). * Audio I/O labels: "Set volume for all received audio" → "Master volume for received audio" (the code never got this rename, only the manual had). Device lists now say "audio": "...for received audio" and "WASAPI/ASIO audio inputs/outputs to send". Labels + AccessibleNames updated together. * Add EQ band dialog: the spin/edit boxes now select-all on focus, so a typed value REPLACES what's there instead of being inserted next to it and reverting (typing 2.5 over 4.0 now works). * Parametric bands list: Left/Right arrow nudge the selected band's gain by half a dB, live — up/down still move between bands. NVDA re-reads the band's new dB. * Recording settings: source list reordered to Both (top, now the default) / Received / Sent; display order decoupled from the RecordingSource enum. Default RecordingSettings.Source = Both. * Preferences: Colour theme is now first in the General tab order. Manual updated. Build clean; --selftest passes; deployed to both test folders. Held for next release. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
89 lines
3.5 KiB
C#
89 lines
3.5 KiB
C#
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 = 4,
|
|
};
|
|
grid.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
|
|
grid.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
|
|
|
|
var heading = Theme.Heading("Rename peer");
|
|
grid.Controls.Add(heading, 0, 0);
|
|
grid.SetColumnSpan(heading, 2);
|
|
|
|
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, 1);
|
|
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, 2);
|
|
grid.Controls.Add(nameBox, 1, 2);
|
|
|
|
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, 3);
|
|
|
|
Controls.Add(grid);
|
|
AcceptButton = okButton;
|
|
CancelButton = cancelButton;
|
|
|
|
Shown += (_, _) => { nameBox.Focus(); nameBox.SelectAll(); };
|
|
}
|
|
}
|