Skip to content

Toggle AetherDSP Settings from the DSP-tab ADSP button (#3877). Principle II.#3881

Merged
aethersdr-agent[bot] merged 1 commit into
mainfrom
aetherclaude/issue-3877
Jun 28, 2026
Merged

Toggle AetherDSP Settings from the DSP-tab ADSP button (#3877). Principle II.#3881
aethersdr-agent[bot] merged 1 commit into
mainfrom
aetherclaude/issue-3877

Conversation

@aethersdr-agent

Copy link
Copy Markdown
Contributor

Summary

Fixes #3877

What was changed

Toggle AetherDSP Settings from the DSP-tab ADSP button (#3877). Principle II.

Files modified

  • src/gui/MainWindow.cpp
  • src/gui/MainWindow.h
  • src/gui/MainWindow_Wiring.cpp
 src/gui/MainWindow.cpp        | 12 ++++++++++++
 src/gui/MainWindow.h          |  9 +++++++++
 src/gui/MainWindow_Wiring.cpp | 10 ++++++----
 3 files changed, 27 insertions(+), 4 deletions(-)

Generated by AetherClaude (automated agent for AetherSDR)


🤖 aethersdr-agent · cost: $2.1156 · model: claude-opus-4-8

…iple II.

The per-slice DSP-tab ADSP button was a one-way launcher: ensureAetherDspDialog()
is show-or-raise only, so a second press just re-raised the already-visible
AetherDSP Settings window and the only way to dismiss it was the title-bar X.
Its sibling AetherVoice button is a genuine toggle (toggleAetherialStrip).

Add toggleAetherDspDialog() — close() when the dialog is visible (WA_DeleteOnClose
deletes it and clears the QPointer; the next press re-creates and re-wires via
ensureAetherDspDialog()'s wasFresh path), ensureAetherDspDialog() otherwise — and
rewire the single VfoWidget::aetherDspRequested connect to it. The menu action,
RX-chain double-click, and chain/strip ADSP launchers keep pure open semantics by
calling ensureAetherDspDialog() directly, so the toggle is scoped to the one button
the report is about. UI-consistency only; no protocol/audio behavior change.

Principle II honored: this is a client-side window-visibility toggle that reads and
writes only local UI state (the m_dspDialog QPointer); it sends no command to the
radio and does not touch live or persisted radio state, so the radio remains the
sole authority on live state.

Blast radius: ensureAetherDspDialog impact risk_score=0.250, 6 high-risk affected
(top: MainWindow::MainWindow, buildMenuBar, AppSettings::instance). That symbol is
unchanged by this fix — its signature and show-or-raise semantics are preserved at
every existing caller; only wireVfoWidget's lambda changes, routing through the new
wrapper that calls ensureAetherDspDialog() unchanged on the open path. No cross-TU
symbol motion, so test-target link surface is unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@aethersdr-agent aethersdr-agent Bot requested review from a team as code owners June 28, 2026 15:00
@aethersdr-agent aethersdr-agent Bot enabled auto-merge (squash) June 28, 2026 15:00

@aethersdr-agent aethersdr-agent Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the diff against the surrounding code — this is a clean, correct fix for #3877. Thanks for the well-documented change.

Verified the load-bearing assumptions:

  • The comment's claim that close() deletes the dialog and clears the QPointer is accurate: showOrRaisePersistent() sets Qt::WA_DeleteOnClose (MainWindow.h:1264), and m_dspDialog is a QPointer<AetherDspDialog> (MainWindow.h:927), so it auto-nulls on delete.
  • The re-create path is sound: after a close-then-reopen, ensureAetherDspDialog()'s wasFresh branch (MainWindow.cpp:2509-2513) re-runs wireAetherDspWidget(), so the freshly-constructed dialog is fully re-wired rather than silently inert.
  • The m_dspDialog && m_dspDialog->isVisible() guard is null-safe, and geometry survives the toggle since PersistentDialog persists/restores under its geomKey on close/show.
  • Scope is tight: only the DSP-tab aetherDspRequested wiring switches to the toggle; the Settings menu action and RX-chain/strip launchers (MainWindow.cpp:7246) correctly keep pure open-via-ensureAetherDspDialog() semantics, as the comment states.

Minor, non-blocking: the cited sibling toggleAetherialStrip() toggles via hide()/show() on a persistent widget, whereas this destroys and re-creates because the DSP dialog is WA_DeleteOnClose. That's the right call given the dialog's design and the UX is identical — just noting the mechanisms differ in case a future reader expects them to match line-for-line. No change needed.

LGTM. 73


🤖 aethersdr-agent · cost: $2.5058 · model: claude-opus-4-8

@ten9876 ten9876 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. Verified the toggle is correct and null-safe: m_dspDialog is a QPointer with WA_DeleteOnClose (set by showOrRaisePersistent), so close() deletes + auto-nulls it, and the recreate path re-wires via ensureAetherDspDialog()'s wasFresh branch (wireAetherDspWidget). Scope is tight — only the DSP-tab button toggles; the menu action and RX-chain launcher keep pure-open semantics. Geometry persists via PersistentDialog. Not a keying path. CI green on all 6. (Minor: the 'Principle II' citation doesn't really apply to a UI toggle — cosmetic only.)

@aethersdr-agent aethersdr-agent Bot merged commit 18cd044 into main Jun 28, 2026
6 checks passed
@aethersdr-agent aethersdr-agent Bot deleted the aetherclaude/issue-3877 branch June 28, 2026 16:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Minor bug: AetherDSP Settings behavior

1 participant