Compare commits

..
Author SHA1 Message Date
sjg b4ea35baf8 feat(ui): add dedicated audio controls section
CI / lint (pull_request) Failing after 1s
CI / test (pull_request) Failing after 0s
CI / reuse (pull_request) Failing after 0s
CI / lint (push) Failing after 1s
CI / test (push) Failing after 1s
CI / reuse (push) Failing after 0s
2026-08-01 11:32:34 +02:00
3 changed files with 25 additions and 16 deletions
@@ -419,20 +419,24 @@ SPDX-License-Identifier: GPL-2.0-or-later
<button id="tx-limit-btn" type="button">Set</button> <button id="tx-limit-btn" type="button">Set</button>
</div> </div>
</div> </div>
<div class="full-row label-below-row" id="audio-row"> <details id="audio-controls" class="advanced-radio-controls audio-controls-section">
<div class="label"><span>Audio</span></div> <summary>Audio controls</summary>
<div class="inline" style="gap: 0.6rem; flex-wrap: wrap; align-items: center;"> <div class="advanced-radio-body">
<button id="rx-audio-btn" type="button">Play Audio</button> <div class="full-row" id="audio-row">
<button id="tx-audio-btn" type="button">Transmit Audio</button> <div class="inline" style="gap: 0.6rem; flex-wrap: wrap; align-items: center;">
<label class="vol-label">RX<input type="range" id="rx-vol" min="0" max="100" value="80" class="vol-slider" /><small class="vol-pct" id="rx-vol-pct">80%</small></label> <button id="rx-audio-btn" type="button">Play Audio</button>
<label class="vol-label">TX<input type="range" id="tx-vol" min="0" max="100" value="80" class="vol-slider" /><small class="vol-pct" id="tx-vol-pct">80%</small></label> <button id="tx-audio-btn" type="button">Transmit Audio</button>
<label class="vol-label" id="sdr-squelch-wrap" style="display:none;">SQL<input type="range" id="sdr-squelch" min="0" max="100" value="0" class="vol-slider" /><small class="vol-pct" id="sdr-squelch-pct">Open</small><button id="sdr-squelch-auto" type="button" class="sql-auto-btn" title="Set squelch to current noise level">Auto</button></label> <label class="vol-label">RX<input type="range" id="rx-vol" min="0" max="100" value="80" class="vol-slider" /><small class="vol-pct" id="rx-vol-pct">80%</small></label>
<div id="audio-level"> <label class="vol-label">TX<input type="range" id="tx-vol" min="0" max="100" value="80" class="vol-slider" /><small class="vol-pct" id="tx-vol-pct">80%</small></label>
<div id="audio-level-fill"></div> <label class="vol-label" id="sdr-squelch-wrap" style="display:none;">SQL<input type="range" id="sdr-squelch" min="0" max="100" value="0" class="vol-slider" /><small class="vol-pct" id="sdr-squelch-pct">Open</small><button id="sdr-squelch-auto" type="button" class="sql-auto-btn" title="Set squelch to current noise level">Auto</button></label>
<div id="audio-level">
<div id="audio-level-fill"></div>
</div>
<small id="audio-status" style="min-width: 60px;">Off</small>
</div>
</div> </div>
<small id="audio-status" style="min-width: 60px;">Off</small>
</div> </div>
</div> </details>
</div> </div>
</div> </div>
</div> </div>
@@ -126,10 +126,10 @@
}; };
const layouts = { const layouts = {
compact: { label: "Compact", advanced: false, preferredTab: "main" }, compact: { label: "Compact", advanced: false, audio: false, scheduler: false, preferredTab: "main" },
broadcast: { label: "Broadcast", unavailable: "Broadcast requires an enumerated WFM-capable receiver", advanced: false, preferredTab: "main", capability: "broadcast" }, broadcast: { label: "Broadcast", unavailable: "Broadcast requires an enumerated WFM-capable receiver", advanced: false, audio: true, scheduler: false, preferredTab: "main", capability: "broadcast" },
digital: { label: "Digital", unavailable: "Digital requires a compatible rig mode and an available decoder", advanced: false, preferredTab: "digital-modes", capability: "digital" }, digital: { label: "Digital", unavailable: "Digital requires a compatible rig mode and an available decoder", advanced: false, audio: false, scheduler: false, preferredTab: "digital-modes", capability: "digital" },
full: { label: "Full controls", advanced: true, preferredTab: "main" }, full: { label: "Full controls", advanced: true, audio: true, scheduler: true, preferredTab: "main" },
}; };
const layoutCapabilities = { broadcast: false, digital: false }; const layoutCapabilities = { broadcast: false, digital: false };
let activeRigId = null; let activeRigId = null;
@@ -195,6 +195,10 @@
if (options.persist !== false) localStorage.setItem(layoutStorageKey(), document.body.dataset.operatorLayout); if (options.persist !== false) localStorage.setItem(layoutStorageKey(), document.body.dataset.operatorLayout);
const details = document.getElementById("advanced-radio-controls"); const details = document.getElementById("advanced-radio-controls");
if (details) details.open = layout.advanced; if (details) details.open = layout.advanced;
const audioDetails = document.getElementById("audio-controls");
if (audioDetails) audioDetails.open = layout.audio;
const schedulerDetails = document.getElementById("scheduler-controls");
if (schedulerDetails) schedulerDetails.open = layout.scheduler;
if (options.navigate && typeof window.navigateToTab === "function") { if (options.navigate && typeof window.navigateToTab === "function") {
window.navigateToTab(layout.preferredTab); window.navigateToTab(layout.preferredTab);
} }
@@ -89,5 +89,6 @@ mod tests {
); );
assert!(UI_CORE_JS.contains("window.trxUi")); assert!(UI_CORE_JS.contains("window.trxUi"));
assert!(html.contains("<summary>Scheduler controls</summary>")); assert!(html.contains("<summary>Scheduler controls</summary>"));
assert!(html.contains("<summary>Audio controls</summary>"));
} }
} }