fix: give the idle MOX button a distinct accent color so it reads as the transmit button#3763
Conversation
The MOX button shared the neutral blue btnStyle with TUNE/ATU/MEM at idle, so it was visually indistinguishable from its neighbors even though it is the primary manual-transmit control. Give the idle MOX button its own amber accent border/text at construction and in the non-transmitting branch of the moxChanged handler. The solid-red active-TX appearance and the other three buttons are unchanged. Refs aethersdr#3663
There was a problem hiding this comment.
Thanks @mvanhorn — this is a clean, well-scoped change. I traced both MOX styling sites in the base file and they're exactly the two you touched:
buildUI()construction (wasbtnStyle→ nowmoxIdleStyle)- the
moxChangedhandler's non-TX branch (blue#205070→ amber#d08020)
There's no third reset path, so the idle MOX button reliably renders amber in both the initial and post-TX-release states, and the solid-red active branch plus the TUNE/ATU/MEM neighbors are untouched. The amber idle and red active stylesheets stay byte-identical between the two sites, which is what keeps the toggle visually consistent. No transmit-keying, model, or protocol behavior is affected, consistent with the Principle VI note.
Conventions and safety all check out: no AppSettings/QSettings involvement, no new allocations or ownership, no null-deref or boundary concerns (pure stylesheet strings). Nothing here is outside the stated scope.
Two optional, non-blocking notes:
-
Duplicated literal. The amber idle stylesheet now appears verbatim in both spots. If they ever drift, the idle/post-TX appearance would diverge silently. A shared
static const char*(or member) would make that impossible. That said, this matches the file's existing pattern — the red active style is already inlined in two places — so it's fine to leave as-is for a fix this small. -
Hardcoded vs. themeable. These colors are literal hex rather than
ThemeManagercolor.*tokens (cf. the APD button just below atm_apdBtn, and the token work in #3761). Again, the wholebtnStyleblock is hardcoded today, so you're correctly matching the surrounding code — just flagging that a future theming pass would likely want acolor.transmit.*-style token here.
Neither blocks merge. Nice incremental UX fix.
🤖 aethersdr-agent · cost: $2.6664 · model: claude-opus-4-8
ten9876
left a comment
There was a problem hiding this comment.
Clean, correct, well-scoped UX fix — the idle MOX button now reads as the primary transmit control instead of blending with TUNE/ATU/MEM. Verified both MOX styling sites are the only ones touched, active-TX red and the neighbor buttons unchanged, no keying/model effect (Principle VI holds). CI fully green.
Follow-up: I'll tokenize the MOX accent (color.tx.mox.*) so it becomes independently editable in the Theme Editor, mirroring the waterfall LIVE chip (#3761) — keeping that out of this fork PR's scope. Thanks @mvanhorn!
…) (#3768) ## Summary Follow-up to #3763, mirroring the waterfall LIVE chip (#3761). #3763 gave the idle MOX button a distinct amber accent so it reads as the primary transmit control — but with hardcoded hex literals duplicated across its two styling sites. This tokenizes that accent behind dedicated `color.tx.mox.*` tokens so it becomes **editable in the Theme Editor**: | Token | Default | Role | |---|---|---| | `color.tx.mox.border` | `#d08020` | idle amber border | | `color.tx.mox.text` | `#f0c890` | idle amber text | | `color.tx.mox.border.hover` | `#e09030` | hover border | | `color.tx.mox.text.hover` | `#ffd8a0` | hover text | ### What changed - Both MOX styling sites (construction + the `moxChanged` return-to-idle branch) now share a single `kMoxIdleStyle` template via `ThemeManager::applyStyleSheet()`, which also removes the **duplicated-literal drift risk** the #3763 review flagged. - The **active-TX red branch** is converted from `setStyleSheet()` to `applyStyleSheet()` as well. Its template stays byte-identical literal hex, but routing it through the tracked path fixes a latent bug: a Theme Editor recolor *mid-transmit* would otherwise re-resolve the stale idle template over the active red. (The TUNE button already uses `applyStyleSheet` for both states for exactly this reason.) - Seed defaults (`ThemeManager::seedBuiltinDefaults`) and **both** preset JSONs carry the same literal values the buttons used before. The buttons don't respond to theme today (hardcoded hex), so seeding both presets identically preserves the rendered appearance exactly — only the editability is new. Background / hover-background / disabled colors stay literal (structural, shared with the neutral TUNE/ATU/MEM `btnStyle`); only the amber **accent** that defines MOX's identity is tokenized — the same focused scope as #3761. ## Constitution - **Principle VI** — appearance-only; no transmit-keying, interlock, or model path touched. - **Principle IV** — tokens and templates are original. ## Test plan - [x] Local build passes (`cmake --build build --target AetherSDR`) - [x] Both preset JSONs validate (`json.load`) - [ ] Visual: idle MOX renders amber identically to #3763; pressing MOX still shows solid red; releasing returns to amber; recoloring `color.tx.mox.border` in the Theme Editor moves only the MOX accent (and updates live, including while transmitting) Refs #3663. Follows #3763, #3761. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Summary
Gives the idle MOX button a distinct amber accent border and text so it reads as the primary transmit control, instead of sharing the neutral blue
btnStylewith its TUNE / ATU / MEM neighbors. Before this change the MOX button only became visually distinct (solid red) while transmitting; at idle it was indistinguishable from the other three buttons. The change touches onlysrc/gui/TxApplet.cppin two MOX-specific spots: the idle style at button construction now uses a dedicatedmoxIdleStyle(amber border#d08020/ amber text#f0c890), and the non-transmitting branch of themoxChangedhandler reverts MOX to that same amber accent rather than the neutral blue style. The solid-red active-TX appearance, the other three buttons, and all model/protocol paths are unchanged.The issue also floated an optional "customize applet buttons" idea; that is a larger separate theming feature and is intentionally out of scope here.
Refs #3663
Constitution principle honored
Principle VI — AetherSDR Never Transmits Without Operator Intent: this is an appearance-only change with no effect on transmit keying or interlock state. Principle IV — Every Contribution Is Clean-Room: the new stylesheet is original, not derived from any proprietary binary.
Test plan
cmake --build build) — CSS-string-only change in one file; the newmoxIdleStyleC-string literal is well-formed and consumed on the next line.Checklist
docs/COMMIT-SIGNING.md)AppSettingscalls — use nested-JSON-under-one-key (Principle V)MeterSmoother(AGENTS.md convention) — n/a, no meter UI touchedAI was used for assistance.