feat: wheel over RST; PSK Reporter keeps the band's window
The mouse wheel steps the RST fields — one S-unit on an RST or RS, one decibel on a digital report, up for a better one — in the entry strip and in the QSO editor. The dropdown beside them lists the reports worth having to hand, not all 41 decibels, so the wheel works on the value rather than walking the list. The listener is native and non-passive: React attaches onWheel passively, where preventDefault does nothing and the panel scrolls away under the field being adjusted. PSK Reporter, whole-band scope: clicking a decode reset the report count to zero. The window there is the BAND's — every FTx report on it, filtered by target only when the analysis is drawn — and it was emptied on every target change, throwing away an hour of evidence at the moment the operator asked the question it answers. The narrow scope still clears it: there the window is one station's, and keeping it would answer the new question with the old station's evidence.
This commit is contained in:
@@ -36,3 +36,34 @@ export function rstOptions(mode: string, lists: RSTLists): string[] {
|
||||
if (l && l.length) return l;
|
||||
return cat === 'phone' ? ['59', '58', '57'] : cat === 'cw' ? ['599', '589', '579'] : ['+00', '-10', '-20'];
|
||||
}
|
||||
|
||||
// stepRST moves a report one step up or down, the way an operator would say it.
|
||||
//
|
||||
// The dropdown beside these fields is a list of the values worth having to hand,
|
||||
// not of every legal report: nobody keeps 41 dB figures in it. So the wheel
|
||||
// works on the VALUE, not on the list — a digital report moves by a decibel and
|
||||
// an RST by one S-unit, which is what the hand on the wheel is asking for.
|
||||
//
|
||||
// dir is +1 for wheel up (a better report) and -1 for down.
|
||||
export function stepRST(value: string, dir: number, mode: string): string {
|
||||
const v = (value || '').trim();
|
||||
if (v === '') return v;
|
||||
if (rstCategory(mode) === 'digital') {
|
||||
// A dB report: "-12", "+05", "0". Kept in its own shape — signed and two
|
||||
// digits — because that is how every decoder writes it and how the operator
|
||||
// reads it back off the screen.
|
||||
const n = parseInt(v, 10);
|
||||
if (!Number.isFinite(n)) return v;
|
||||
// The range WSJT-X itself reports in, with room either side. Beyond it the
|
||||
// number stops meaning anything.
|
||||
const next = Math.max(-30, Math.min(35, n + dir));
|
||||
return (next < 0 ? '-' : '+') + String(Math.abs(next)).padStart(2, '0');
|
||||
}
|
||||
// RST/RS: the S digit is the one that moves. R and T are judgements about
|
||||
// readability and tone that a wheel has no business changing, and S is the
|
||||
// figure an operator actually adjusts.
|
||||
const m = /^(\d)(\d)(\d?)((?:\+\d+)?)$/.exec(v);
|
||||
if (!m) return v;
|
||||
const s = Math.max(1, Math.min(9, parseInt(m[2], 10) + dir));
|
||||
return m[1] + String(s) + m[3] + m[4];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user