Skip to content

Fix #2769 (recovered after Claude Code exited before committing)#2772

Merged
ten9876 merged 2 commits into
mainfrom
aetherclaude/issue-2769
May 17, 2026
Merged

Fix #2769 (recovered after Claude Code exited before committing)#2772
ten9876 merged 2 commits into
mainfrom
aetherclaude/issue-2769

Conversation

@aethersdr-agent

Copy link
Copy Markdown
Contributor

Summary

Fixes #2769

What was changed

Fix #2769 (recovered after Claude Code exited before committing)

Files modified

  • src/gui/MainWindow.cpp
  • src/gui/RadioSetupDialog.cpp
  • src/gui/RadioSetupDialog.h
 src/gui/MainWindow.cpp       | 111 +++++++++++++++++++++----------------------
 src/gui/RadioSetupDialog.cpp |  56 +++-------------------
 src/gui/RadioSetupDialog.h   |   8 ++--
 3 files changed, 64 insertions(+), 111 deletions(-)

Generated by AetherClaude (automated agent for AetherSDR)

@aethersdr-agent aethersdr-agent Bot enabled auto-merge (squash) May 16, 2026 23:12
@ten9876 ten9876 merged commit a0512d9 into main May 17, 2026
5 checks passed
@ten9876 ten9876 deleted the aetherclaude/issue-2769 branch May 17, 2026 00:40
ten9876 added a commit that referenced this pull request May 17, 2026
…ust/#2780) (#2786)

## Summary

Cherry-pick of @rfoust's panadapter persistence and macOS GPU lifecycle
work from PR #2780, applied cleanly onto current main with the
stale-snapshot reverts left out.

## Why a cherry-pick rather than merge of #2780

PR #2780 was based on commit \`a0512d99\` (PR #2772 merge), and its
single Codex-generated commit included **stale-snapshot content for
files outside the intended scope**. Squash-merging #2780 as-is would
have silently reverted two recently-landed PRs:

- **PR #2770** (\`aether.ax25\` Q_LOGGING_CATEGORY consolidation) —
\`AetherAx25LibmodemShim.cpp\`, \`Ax25HfPacketDecodeDialog.cpp\`, plus
the test-target linkage in \`CMakeLists.txt\`
- **PR #2772** (RadioSetupDialog → PersistentDialog migration) —
\`RadioSetupDialog.{cpp,h}\`

Verified by three-way merge dry run: post-merge state showed \`class
RadioSetupDialog : public QDialog\` (pre-#2772) and 5 occurrences of
\`lcAetherAx25Shim\` (pre-#2770).

The actual panadapter work in PR #2780 is real and valuable, so this PR
extracts it onto a fresh branch from current main and skips the
unintentional reverts.

## What's in this PR (= the intended scope of #2780)

Cherry-picked verbatim from #2780:

| File | Change |
|---|---|
| \`src/gui/MainWindow.{cpp,h}\` | Persist/restore PanadapterLayout +
FloatingPanIds; expand layout count handling from 4 to 8 pans; preserve
unseen floating IDs across reconnect |
| \`src/gui/PanadapterStack.{cpp,h}\` | Sensible-fallback
docked-splitter layouts when some pans are floating or saved layout
count mismatches |
| \`src/gui/SpectrumWidget.{cpp,h}\` | macOS QRhiWidget lifecycle:
\`WindowAboutToChangeInternal\` before reparent; QRhi resource release
during shutdown while parent backing stores are valid; guarded late
callbacks; auto FFT floor relock after geometry/ypixels changes |
| \`src/core/PanadapterStream.cpp\` | Defensive dBm-range clamping (-180
floor, ≥10 dB span); FFT decode clamps pixel input and dbm output to
range |
| \`src/models/RadioModel.cpp\` | Use actual FFT pane height for radio
\`ypixels\` rather than total widget height |

Net: **+548 / -215** across 8 files.

## What was NOT cherry-picked (stale-snapshot reverts)

| File | Reason |
|---|---|
| \`CMakeLists.txt\` | -7 lines reverting #2770's test-target linkage I
added to fix the link error |
| \`src/core/tnc/AetherAx25LibmodemShim.cpp\` | Robbie's content has
local \`Q_LOGGING_CATEGORY(lcAetherAx25Shim, ...)\` — pre-#2770. Main
has the consolidated \`lcAx25\` from LogManager |
| \`src/gui/Ax25HfPacketDecodeDialog.cpp\` | Same pattern —
\`lcAetherAx25Dialog\` local, pre-#2770 |
| \`src/gui/RadioSetupDialog.{cpp,h}\` | Robbie's diff was **100% pure
revert** of #2772 — no new content, no panadapter-related additions.
Confirmed by inspecting the full \`git diff a0512d9..e72d7e4 --
RadioSetupDialog.cpp\` output |

## Attribution

Commit author is set to **Robbie Foust** so his contribution shows in
\`git log\` and the contributor stats. PR #2780 is being reset to
**Draft** (not closed) so Robbie has a clean reference point + can
update with fresh work if he wants.

## Test plan

- [x] Local build clean (402/402 link, only pre-existing warnings)
- [x] Three-way merge dry-run against current main: clean
- [ ] Manual on Linux: multi-pan layout, detached panadapter, restart,
confirm layout + detached state restore
- [ ] Manual on macOS GPU build: two detached panadapter windows, Cmd-Q,
restart, confirm both restore without the QRhi cleanup callback crash
- [ ] Manual: detach/redock panadapter and confirm auto FFT floor
relocks

## Cross-references

- Replaces #2780 (will be set to Draft after this PR opens)
- Same stale-snapshot pattern as aetherclaude #34 (Claude Code), but
from OpenAI Codex this time — worth a heads-up to whoever's watching
agent-output quality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Robbie Foust <rfoust@duke.edu>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
aethersdr-agent Bot added a commit that referenced this pull request May 17, 2026
…ersistent (#2781). Principle III.

Settings → FlexControl, Settings → USB Cables, and the XVTR overlay button each
called `new RadioSetupDialog(...)` directly, bypassing the m_persistentDialogs
registry that PR #2772 (RadioSetupDialog → PersistentDialog migration) set up.
Symptoms: clicking any two entries opens two windows, frameless toggle skips
the shortcut-opened dialog, and "first opener wins" signal wiring diverges.

This pass routes all four entry points (primary Radio Setup, FlexControl, USB
Cables, XVTR overlay) through showOrRaisePersistent + selectTab, and factors
the txBandSettingsRequested / serialSettingsChanged / sliceLetterDisplayModeChanged
/ QDialog::finished wiring into a single private helper wireRadioSetupDialogSignals
so a fresh construction picks up the full handler set regardless of which menu
clicked first.  The dialog now lives in m_persistentDialogs unconditionally, so
the special-case qobject_cast in setFramelessWindow is removed — the
persistentDialogs loop below already handles it.

Also re-asserts the primary Radio Setup entry's #2772 migration that #2786
silently reverted during a panadapter-layout merge.

Blast radius (codegraph impact on MainWindow::buildMenuBar, max_depth=3):
risk_score=0.7297, 18 high_risk affected (top: MainWindow::MainWindow,
AppSettings::instance, AppSettings::value).  The score reflects buildMenuBar's
breadth across the menu surface; the actual edit is four lambda bodies plus a
helper, none of which alter buildMenuBar's caller-facing contract.  No new
test-target link dependencies (wireRadioSetupDialogSignals is private to
MainWindow.cpp, RadioSetupDialog.h was already #included).
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.

Migrate RadioSetupDialog to PersistentDialog (#2679 follow-up 3/3)

1 participant