feat(slices): per-pan tuning wheel and per-slice RX mute on TX

Mouse wheel over an extra panadapter now retunes that pan's primary
slice (first created on that receiver) instead of the main VFO; a slice
flag under the cursor still wins, pan 0 keeps driving the VFO.

Slice flags get a clickable RXM badge: RX audio of the slice is muted
while transmitting (default), so the operator no longer hears himself on
every slice in full duplex. State persists with the workspace.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 22:35:19 +03:00
co-authored by Claude Opus 4.8
parent fa5a95ca5d
commit 28ae832b71
5 changed files with 112 additions and 8 deletions
+3
View File
@@ -104,6 +104,7 @@ type
AGC: Integer; // Ord(TWDSPAGCMode)
Volume: Double; // 0..1
Muted: Boolean;
RxMuteOnTx: Boolean; // True = слайс молчит на передаче (self-monitor выкл)
FMSQOn: Boolean;
FMSQLevel: Integer;
DevName: string; // имя PortAudio-устройства ('' = default)
@@ -1783,6 +1784,7 @@ begin
SliceObj.Add('agc', P.Pans[i].Slices[j].AGC);
SliceObj.Add('volume', P.Pans[i].Slices[j].Volume);
SliceObj.Add('muted', P.Pans[i].Slices[j].Muted);
SliceObj.Add('rx_mute_on_tx', P.Pans[i].Slices[j].RxMuteOnTx);
SliceObj.Add('fmsq_on', P.Pans[i].Slices[j].FMSQOn);
SliceObj.Add('fmsq_level', P.Pans[i].Slices[j].FMSQLevel);
SliceObj.Add('dev_name', P.Pans[i].Slices[j].DevName);
@@ -1860,6 +1862,7 @@ begin
P.Pans[id].Slices[n].AGC := JI(SliceObj, 'agc', 1);
P.Pans[id].Slices[n].Volume := EnsureRange(JD(SliceObj, 'volume', 0.7), 0.0, 1.0);
P.Pans[id].Slices[n].Muted := JB(SliceObj, 'muted', False);
P.Pans[id].Slices[n].RxMuteOnTx := JB(SliceObj, 'rx_mute_on_tx', True);
P.Pans[id].Slices[n].FMSQOn := JB(SliceObj, 'fmsq_on', False);
P.Pans[id].Slices[n].FMSQLevel := JI(SliceObj, 'fmsq_level', 30);
P.Pans[id].Slices[n].DevName := JS(SliceObj, 'dev_name', '');