refactor(panels): 删除 rowPoints/rowIterations 死列 + 提取 PaintPanelResampleRows

对应 Code_Review_Report §14.5 第 1 项与第 3 项。

第 1 项:删除 EdgePanelLayout::rowPoints / rowIterations(行数组 18 → 16)
- 写入方只有 AppendRow(推空矩形),读取方只有调试框 AddAll 与 PanelSlotKey 的 mix 循环,
  绘制方零(旧式“点数 / 迭代次数”输入框早被滑块版 rowLevelTracks / rowIterTracks 取代)。
- 连带同步:AppendRow、调试框、缓存键、rowgeom 导出、panels/panelscroll 长度不变式、
  文档里的列数(18/14 → 16/12)。

等价性由基线证伪,而不是靠人工 grep:
  old lines = 983, new lines = 919
  only in OLD = 64, only in NEW = 0
  only-in-OLD lines NOT belonging to rowPoints/rowIterations = 0
即除被删两列外,其余 919 条键逐字节相同。

第 3 项(前半):提取 PlotView::PaintPanelResampleRows
- PaintPanelListRows 里 `if (resamplePanel) { …; continue; }` 共 132 行整块提取,
  签名 (g, layout, rowIndex, laneIndex, ref, item);两个局部 lambda
  (paintInfoRow 只读统计行 / paintInputRow 联动输入框)随之迁移。
- maxInterval / minInterval 两个纯拷贝局部量直接用 item.maxInterval / item.minInterval。
- 通用参数行(中心轴统计 + 两行滑块)未提取:需 9 个参数,签名比函数体更难读。

§14.5 第 2 项(完整结构合并)本轮不做,方案已定并写入文档:
- 列视图(PanelColumn<T>)方案否决:拷贝忘重绑 = 静默悬垂,需额外自检兜住;
- 若要做就做“vector<PanelRow> + 具名成员访问(无视图)”,242 处读点(127 处命中判定),
  必须单独一轮。它属整洁性收益(漏推一列已被 AppendRow + 长度不变式挡住),不是紧急项。

验证
- make release:零 warning;785,408 → 784,896 B(−512);make debug 同样零 warning
- make -C Tools:零 warning
- UnitTests:checks=260 failed=0 cases=19
- OffscreenChecks -all:7 检查 / 127 断言全 PASS
- panels -mode compare:7 面板像素哈希 + 几何逐项不变(resample=2BFC74B3D9B3239C)
- rowgeom -mode compare:919 + 7 键,0 差异(基线已按 16 列重录)
- PlotViewPaint.cpp 5575 → 5565;PlotViewPanelPaint.cpp 1016 → 1020

文档:Plan §十、Progress 第 38 轮、Report §15、agent_mem 第 38 轮、Tools/README §4.4
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-11-04 16:02:15 +08:00
1 parent 353c553721
commit f07ac74988
9 files changed
+384 -150

No files matched your search

+57
View File
@@ -10638,3 +10638,60 @@ MARK 面板**只填** `rowNameRects` / `rowNameCloses`,其余 14 列**必须
`EdgePanelLayout` 加"视图自检"(比对 `rows` 容量与视图长度)。
3. `PaintPanelListRows` 再拆三段(纯可读性)。
---
## 2026-11-04 · 第 38 轮(`Code_Review` 分支):删死列 + 拆重采样参数行(§14.5 第 1 / 第 3 项)
> 规则原文:`Documents/Code_Review_Report.md` §15、`Code_Review_Plan.md` §十、
> `Code_Review_Progress.md` 第 38 轮。
### 1. ✅ 删除 `EdgePanelLayout::rowPoints` / `rowIterations`(行数组 18 → **16**)
* 写入方**只有** `AppendRow`(推空矩形),读取方**只有**调试框 `AddAll` 与 `PanelSlotKey` 的 mix 循环,
绘制方零(旧式"点数 / 迭代次数"输入框早被滑块版取代)。
* 任何"面板行数组清单"现在都是 **16 列**:`rowgeom` 导出、`panels`/`panelscroll` 长度不变式、
调试框、缓存键、`AppendRow`。
### 2. ⭐ 方法论:**先有全字段基线,再删字段**
本轮"删两列"的等价性不是靠 grep 完整性,而是靠 `rowgeom` 证伪:
```text
old lines = 983, new lines = 919 ; only in OLD = 64 ; only in NEW = 0
only-in-OLD lines NOT belonging to rowPoints/rowIterations = 0
```
⇒ 以后删任何 `EdgePanelLayout` 字段,都走这个流程:
`record 旧 → 改代码 → record 新到独立目录 → 集合差只应包含被删字段 → 再 record 正式基线`。
### 3. ✅ 提取 `PaintPanelResampleRows`(132 行)
`PaintPanelListRows` 里 `if (resamplePanel) { …; continue; }` 整块提取;签名
`(g, layout, rowIndex, laneIndex, ref, item)`;两个局部 lambda(只读统计行 / 联动输入框)随之迁移。
**通用参数行(中心轴统计 + 两行滑块)未提取**:需 9 个参数,签名比函数体更难读。
### 4. ⛔ §14.5 第 2 项(完整结构合并)**仍未做**,且方案已定
| 方案 | 结论 |
| --- | --- |
| A:`vector<PanelRow>` + `PanelColumn<T>` 列视图 | ❌ 不做:242 处读点看似"零改动",但自定义拷贝忘重绑 = **静默悬垂**,只能靠新增自检兜住 |
| B:`vector<PanelRow>` + 具名成员访问(无视图) | ✅ 若要做就做这个:所有访问变 `rows[i].check`,**结构上不可能悬垂**,可省略自检 |
B 的规模:242 处读点(**127** 在 `PlotViewInteraction.cpp` 命中判定里)+ 30 余处 range-for / `.size()`。
**必须单独一轮**,判据 = 编译通过 + `rowgeom`/`panels` 双基线归零。
B 属**整洁性收益**(漏推一列已被 `AppendRow` + 长度不变式挡住),不是正确性收益 —— 别再当紧急项。
### 5. 本轮数字
* Release 785,408 → **784,896 B**(−512);零 warning。
* `UnitTests` 260/19;`OffscreenChecks -all` 7 检查 / 127 断言全 PASS。
* `panels -mode compare` 7 面板像素哈希逐项不变(含 `resample=2BFC74B3D9B3239C`)。
* `rowgeom -mode compare` 919 + 7 键 0 差异(基线已按 16 列重新录)。
* `PlotViewPaint.cpp` 5575 → 5565;`PlotViewPanelPaint.cpp` 1016 → 1020。
### 6. 下一步
1. 方案 B(`vector<PanelRow>` 无视图)单独一轮;顺带把 `rowRefs` 的双语义拆成
`rows[].ref` + `markerGroups[]`,让"MARK 面板 12 列为空"的注释消失。
2. 面板几何算式重写(§13.6 遗留):基线已就绪,但需先完成 1。