refactor(panels): 平行数组合并为 std::vector<PanelRow>(消除错位与字段重载)
对应 Code_Review_Report §15.6 第 1 项(方案 B:有结构,无列视图)。
结构
- EdgePanelLayout 的 16 个平行 std::vector 合并为 std::vector<PanelRow> rows,
PanelRow 带 17 个具名成员:ref / header / nameRect / nameClose / triangle / check /
stats / levelTrack / levelValue / levelReset / iterTrack / iterValue / iterReset /
infoMaxInterval / infoMinInterval / intervalField / frequencyField。
- 唯一新增入口:AppendRow(ref, header, nameRect, triangle, check)(返回新行引用)与
AppendMarkerGroupRow(ref, nameRect, nameClose)(「自由标记」分组行)。
参数行/重采样行一律 layout.rows.back().xxx = … 赋值。
- 原 int rows(可见信号数)与新容器同名 ⇒ 改名 signalCount,并注明它与 rows.size()
在 MARK 面板里不相等(只有有固定点的信号才有行)。
消掉的两类问题
1. 某分支漏 push 一列 ⇒ 该列之后所有行读到别人的矩形(静默错位)。现在一行一次成型。
2. rowRefs 字段重载(列表式 = 行信号 / MARK = 分组信号,其余 12 列必须为空)。
现在每行自带 ref,语义由“填哪些字段”表达;不变式简化为语义断言
(每行必须有名称区;MARK 行不得带 header/check/stats/滑块/重采样字段)。
顺带清理
- 合并后 rowIndex < layout.rowXxx.size() 全部变成恒真,批量删除 50+ 处
(含 15 元组长度数组、? x : gd::RectF() 三元判空、if(...){extendRow(...)} 包裹)。
- 调试框与缓存键改为逐行遍历(新增字段只需在 PanelRow 与这两处循环各加一行)。
等价性证明(rowgeom 键名刻意保持不变,故可逐键比对)
old keys = 919, new keys = 965
仅存在于旧 = 0;已有键值变化 = 20(全部是 ".count":0 -> N)
仅存在于新 = 46(全部是新增列的 [NNN],值 0.00,0.00,0.00,0.00)
⇒ 逐行逐字段的真实几何零位移;7 个面板像素哈希(含 resample=2BFC74B3D9B3239C)逐项不变。
验证
- make release:零 warning;784,896 → 782,336 B(−2,560);make debug / make -C Tools 同样零 warning
- UnitTests:checks=260 failed=0 cases=19
- OffscreenChecks -all:7 检查 / 133 断言(上轮 127)全 PASS
- panels -mode compare:7 面板像素哈希逐项不变
- rowgeom -mode compare:965+7 键 0 差异;-data MF4-Record.MF4 时 1268+7 键 0 差异
- 读点:旧 243 处 layout.rowXxx[…] → 现 95 处 layout.rows[…](84 命中判定 / 11 绘制)
过程记录:清理恒真判空时曾用整段替换把「均值滤波」双滑块段误换成「弱峰」双滑块,
编译器报 brace 不平衡,用备份回滚后重做 —— 整段替换必须先精确读出上下文。
文档:Plan §十一、Progress 第 39 轮、Report §16、agent_mem 第 39 轮、Tools/README §4.1/§4.4
This commit is contained in:
1 parent
f07ac74988
commit
1463f9d3f8
11 files changed
+672
-591
No files matched your search
@@ -10695,3 +10695,66 @@ B 属**整洁性收益**(漏推一列已被 `AppendRow` + 长度不变式挡
|
||||
`rows[].ref` + `markerGroups[]`,让"MARK 面板 12 列为空"的注释消失。
|
||||
2. 面板几何算式重写(§13.6 遗留):基线已就绪,但需先完成 1。
|
||||
|
||||
---
|
||||
|
||||
## 2026-11-04 · 第 39 轮(`Code_Review` 分支):平行数组合并为 `std::vector<PanelRow>`(§16.6 第 1 项,方案 B)
|
||||
|
||||
> 规则原文:`Documents/Code_Review_Report.md` §16、`Code_Review_Plan.md` §十一、
|
||||
> `Code_Review_Progress.md` 第 39 轮。
|
||||
|
||||
### 1. ✅ `EdgePanelLayout` 的 16 个平行 `std::vector` → `std::vector<PanelRow> rows`
|
||||
|
||||
```cpp
|
||||
struct PanelRow {
|
||||
SignalRef ref; header; nameRect; nameClose; triangle; check; stats;
|
||||
levelTrack; levelValue; levelReset; iterTrack; iterValue; iterReset;
|
||||
infoMaxInterval; infoMinInterval; intervalField; frequencyField;
|
||||
};
|
||||
std::vector<PanelRow> rows;
|
||||
```
|
||||
唯一入口:`AppendRow(ref, header, nameRect, triangle, check)`、
|
||||
`AppendMarkerGroupRow(ref, nameRect, nameClose)`(MARK 分组行)。
|
||||
**参数行一律 `layout.rows.back().xxx = …` 赋值。**
|
||||
|
||||
### 2. 🔴 硬规则(本轮新增)
|
||||
|
||||
1. 行的几何**只能**通过 `rows[i].<字段>` 访问。**禁止**加回平行数组;
|
||||
**禁止**引入 `PanelColumn<T>` 列视图(拷贝后忘重绑 = 静默悬垂,没有检查能抓到)。
|
||||
2. **新增字段**只需在 `PanelRow` 加一个成员 —— 不再需要同步"列清单"
|
||||
(`AppendRow` / 调试框 / 缓存键 / 检查里的 15 元组都已不存在)。
|
||||
3. **`signalCount`(可见信号数)≠ `rows.size()`(本面板行数)**:MARK 面板里只有
|
||||
"有固定点的信号"才有行。原 `int rows` 已改名 `signalCount`。
|
||||
4. 长度不变式在结构上与恒真 ⇒ 已改为**语义断言**:每行必须有名称区;
|
||||
MARK 行不得带 `header`/`check`/`stats`/滑块/重采样字段(防止把列表式布局误用到它上面)。
|
||||
|
||||
### 3. ⭐ `rowgeom` 键名刻意保持不变 ⇒ 等价重构**可证伪**
|
||||
|
||||
```
|
||||
old keys = 919, new keys = 965
|
||||
仅存在于旧 = 0 ; 已有键值变化 = 20(全是 ".count": 0 -> N)
|
||||
仅存在于新 = 46(全是新增列 [NNN],值 0.00,0.00,0.00,0.00)
|
||||
```
|
||||
再叠加 7 面板像素哈希逐项不变 ⇒ 渲染/几何零位移。
|
||||
**以后做"等价重构"都照这个流程:先保键名,再比对。**
|
||||
|
||||
### 4. ⚠️ 事故与教训
|
||||
|
||||
清理恒真判空时用"整段替换"把「均值滤波」双滑块段误换成「弱峰」双滑块,编译器立刻报
|
||||
brace 不平衡。用备份回滚后重做。
|
||||
**整段替换必须先 `read_file` 精确读出上下文,oldString 不能凭记忆拼。**
|
||||
|
||||
### 5. 本轮数字
|
||||
|
||||
* Release 784,896 → **782,336 B**(−2,560);release/debug/tools 全零 warning。
|
||||
* `UnitTests` 260/19;`OffscreenChecks -all` 7 检查 / **133** 断言全 PASS(上轮 127)。
|
||||
* `panels -mode compare` 7 面板像素哈希逐项不变;`rowgeom compare` 965+7 / 1268+7 键 0 差异。
|
||||
* 读点:旧 243 处 `layout.rowXxx[…]` → 现 95 处 `layout.rows[…]`(84 命中判定 / 11 绘制)。
|
||||
|
||||
### 6. 下一步
|
||||
|
||||
1. **面板几何算式重写**(§13.6 遗留)—— 结构与双基线都已就绪,现在改算式是安全的;
|
||||
建议先动 `EdgePanelWidth`(逐信号量宽)与 `EdgePanelLayoutFor` 的行高累加。
|
||||
2. `PaintPanelListRows` 的"通用参数行"提取:现在参数表可从 9 个降到 5 个
|
||||
(`g, layout, row, kind, state`)。
|
||||
3. 体积剩余空间主要在字符串/浮点格式化(gdtoa 30+ KB 不可去掉,见 §11)。
|
||||
|
||||
Reference in new issue
Block a user