85aaed55f64b1f0ef1a50a951a577654eed663f4
背景:Code Review 报告 §12.7 建议 1。"改一次面板布局就出错"的**机制性**原因,
是 `EdgePanelLayout` 的每一行对应 **18 个按行平行的 `std::vector`**,
而每个排版分支都要在同一位置、按同一顺序 push 恰好 18 项。只要某个分支少推一项,
那一列之后的所有行都会读到**别人的**矩形(`panels` 的长度不变式只能事后报警)。
本次做法(比"合并成一个 PanelRow 结构体 + 314 处引用"风险低得多、收益相同)
* `EdgePanelLayout::AppendRow(ref, header, nameRect, triangle, check)`:
**唯一**允许新增行的入口,18 个数组一次补齐(参数行/重采样行一律为空矩形)。
* 三个 push 块改为:
* 边沿计数表格:13 次 push → **1 次 `AppendRow`**;
* 列表式:13 次 push → **1 次 `AppendRow`**;参数行/重采样行改为
`rowXxx.back() = …` **赋值**(长度天然对齐,不再需要 push);
* 「未勾选/收起」分支里那 6+4 次补空 push **整个删掉**(AppendRow 已补过)。
* ⇒ 新增一列只需改 `AppendRow` 一处(新增行的分支不必逐个补);
新增行必须走 `AppendRow`(新增列不会漏)。
为什么没有做"完整合并成 std::vector<PanelRow> + 列视图"
* 列视图方案需要给 `EdgePanelLayout` 写自定义拷贝构造/赋值(视图持有 `panelRows` 的地址),
而该类型是 `EdgePanelLayoutFor()` 的返回值、又被存进 `std::vector`,
拷贝路径是热路径 —— 一旦拷贝语义写错,会产生**比原缺陷更隐蔽**的悬垂视图。
* 本轮先消除"错位"这个真实隐患(AppendRow 已做到),
完整结构合并留到有"逐行几何基线"检查之后再做(已记入后续建议)。
验证
* `panels -mode compare` → 7 个面板像素哈希 + 几何**逐项不变**。
* `panelscroll`(MF4-Record,566 行)→ 7 种面板的行数组长度全部等于 566,行为不变。
* `OffscreenChecks -all` → 6/6 PASS,`checks=108 failed=0`。
* `UnitTests` → `checks=260 failed=0`。
* release 全量零 error / 零 warning;产物 786,432 → **785,408 B**(−1,024)。
Languages
C++
99.5%
Makefile
0.5%