diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/app.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/app.js index 0b3c9f52..7b78e7c0 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/app.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/app.js @@ -2293,6 +2293,7 @@ async function restorePreviousTuneState() { savePreviousTuneState(); if (saved.mode && modeEl && modeEl.value !== saved.mode) { modeEl.value = saved.mode; + syncModePicker(); await postPath(`/set_mode?mode=${encodeURIComponent(saved.mode)}`); updateWfmControls(); } @@ -4127,6 +4128,7 @@ function setDisabled(disabled) { [freqEl, centerFreqEl, modeEl, pttBtn, powerBtn, txLimitInput, txLimitBtn, lockBtn].forEach((el) => { if (el) el.disabled = disabled; }); + syncModePicker(); } var serverVersion = null; var serverBuildDate = null; @@ -4458,6 +4460,7 @@ function render(update) { opt.textContent = m; modeEl.appendChild(opt); }); + renderModePicker(); } } if (update.info && update.info.capabilities) { @@ -4584,6 +4587,7 @@ function render(update) { const onVirtual = window.trx.modules.vchan?.isOnVirtual() === true; if (!onVirtual) { modeEl.value = modeUpper2; + syncModePicker(); if (modeUpper2 === "WFM" && lastModeName !== "WFM") { setJogDivisor(10); resetRdsDisplay(); @@ -5341,6 +5345,33 @@ if (jogMultEl) { } jogStep = Math.max(Math.round(jogUnit / jogMult), minFreqStepHz); } +var modePickerEl = requiredElement("mode-picker"); +function renderModePicker() { + modePickerEl.replaceChildren(); + for (const option of Array.from(modeEl.options)) { + const btn = document.createElement("button"); + btn.type = "button"; + btn.dataset.mode = option.value; + btn.textContent = option.textContent; + btn.addEventListener("click", () => { + if (btn.disabled || modeEl.value === option.value) return; + modeEl.value = option.value; + syncModePicker(); + void applyModeFromPicker(); + }); + modePickerEl.appendChild(btn); + } + syncModePicker(); +} +function syncModePicker() { + const active = (modeEl.value || "").toUpperCase(); + modePickerEl.querySelectorAll("button").forEach((btn) => { + const selected = (btn.dataset.mode || "").toUpperCase() === active; + btn.classList.toggle("active", selected); + btn.disabled = modeEl.disabled; + btn.setAttribute("aria-pressed", String(selected)); + }); +} async function applyModeFromPicker() { const mode = modeEl.value || ""; if (!mode) { @@ -5349,6 +5380,7 @@ async function applyModeFromPicker() { } updateWfmControls(); setControlPending(modeEl, true); + syncModePicker(); showHint("Setting mode…"); try { if (await window.trx.modules.vchan?.interceptMode(mode)) { @@ -5366,6 +5398,7 @@ async function applyModeFromPicker() { console.error(err); } finally { setControlPending(modeEl, false); + syncModePicker(); } } modeEl.addEventListener("change", applyModeFromPicker); @@ -5955,6 +5988,7 @@ var trxCore = Object.freeze({ syncBandwidthInput, scheduleSpectrumDraw, onDecoderRegistryReady, + syncModePicker, formatFreqForStep: formatFrequencyForStep, refreshFreqDisplay, setJogDivisor, diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/bookmarks.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/bookmarks.js index 2fd2631a..224b5fd8 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/bookmarks.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/bookmarks.js @@ -328,6 +328,7 @@ function bmApply(bm) { const modeEl = document.getElementById("mode"); if (modeEl) { modeEl.value = (bm.mode || "").toUpperCase(); + hostCore.syncModePicker(); } if (bm.bandwidth_hz) { hostState.currentBandwidthHz = bm.bandwidth_hz; diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/vchan.js b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/vchan.js index 409eb20b..2c3b2ad7 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/vchan.js +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/generated/vchan.js @@ -286,7 +286,10 @@ function vchanSyncModeDisplay() { if (!modeEl) return; if (vchanIsOnVirtual()) { const ch = vchanActiveChannel(); - if (ch && ch.mode) modeEl.value = ch.mode.toUpperCase(); + if (ch && ch.mode) { + modeEl.value = ch.mode.toUpperCase(); + hostCore.syncModePicker(); + } } const modeUpper = (modeEl.value || "").toUpperCase(); if (typeof hostState.lastModeName === "string") { diff --git a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html index 27ddb8aa..a543fa80 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html +++ b/src/trx-client/trx-frontend/trx-frontend-http/assets/web/index.html @@ -212,31 +212,20 @@ SPDX-License-Identifier: GPL-2.0-or-later
Center Frequency
-
-
- - - -
-
Unit
-
-
-
- - -
-
Step Scale
-
-
+
Mode
- + + +
@@ -248,6 +237,25 @@ SPDX-License-Identifier: GPL-2.0-or-later
+
+
+
+
+ + + +
+
Unit
+
+
+
+ + +
+
Step Scale
+
+
+