PrefsAppPanel/PrefsProfilePanel/PrefsUpdatePanel wire every
AutoCollapsibleSection's animation-finished callback to
AbstractPanel::shrink(), which does adjustSize() followed by
resize(0, 0) to force a re-layout. That idiom is only safe for the
top-level QDialogs it was copied from elsewhere in Companion; these
panels are child widgets hosted in a QScrollArea, and forcing them to
(0, 0) can leave them stuck at zero size instead of being regrown by
the scroll area - blanking the whole tab, e.g. when collapsing "Radio
Profiles" on the Application tab while "General" is left expanded.
Give PrefsPanel its own non-destructive shrink() (updateGeometry())
that shadows AbstractPanel::shrink() for these scroll-area-hosted
panels.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MAYL7FYuZNTmb4sEaig3bN
firmware builds invoke radio/util/elf2uf2.py to produce firmware.uf2,
which imports elftools but the package was missing from requirements.txt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>