ODS sheets now carry a per-connection meta block (Connection / Transform
/ Left / Right) above the data; the header row anchors the freeze, the
auto-filter range, and the zebra striping. CSV stays a single flat
15-column table whose names match the ODS headers exactly.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
LibreOffice rejected the generated `.ods` with `Format error at 2,39
in content.xml`. Root cause: `pugi::format_no_declaration` suppresses
only the *implicit* declaration auto-added at save time — the explicit
`node_declaration` I had appended to the document still got serialised,
on top of a manual `<?xml…?>` string prepend in the output. Two
declarations back-to-back, invalid XML.
Fix: let pugixml emit the explicit declaration node, drop the manual
prepend.
Also harden the sheet-name sanitiser in the export action: ODS / Excel
also forbid `< > &` in raw cell or table names, so the default
connection name `bp/J20 <-> payload1/P0` made content.xml entity-
escape `<` to `<`, which a few viewers handle but Excel rejects.
Clip to 31 chars too (Excel's hard limit) so multi-name connections
don't blow up the open.
Verified by `soffice --headless --convert-to csv` round-tripping the
output without errors.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Two focused, behaviour-preserving moves:
1. `OpenSignalTypeDialog` + `ApplySignalTypeChoice` moved from
`shell.cpp` to `screen_sigtype_modal.cpp` so the popup owns all of
its logic instead of having its open/apply functions live in the
shell file.
2. The `export` command extracted from `commands.cpp` to a new
`commands_export.cpp` under a `Tui::RegisterExportCommands()`
member. `RegisterCommands()` calls it at the end. File-local
helpers (`csv_quote`, `pin_side`) move alongside in an anonymous
namespace.
Establishes the pattern for future per-group splits: declare a
`Register<X>Commands()` member, define it in its own file, call it
from the orchestrator. Other groups stay in `commands.cpp` for now —
nothing else has grown large enough to warrant the split.
Sizes: shell.cpp 497 → 448, commands.cpp 846 → 675 (+ 191 for the
new commands_export.cpp). DESIGN.md updated.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>