refactor(panels): 几何算式收敛为单一来源 + 参数行提取(§17.6 第 1/2 项)
第 1 项:宽度算式与行高累加各自合并成一份来源
- 新增 `PanelColumnMetrics` + `MeasurePanelColumns(lane, kind)`:全仓唯一的一次"逐信号量宽"。
* `EdgePanelWidth(laneIndex, kind)` 退化为"量一次 + 算一次"(`EdgePanelWidthFor`);
* `EdgePanelLayoutFor` 量一次后,宽度与列几何(表格列 / 滑块轨道)都读同一份度量。
* 改前两者各写一份同名同形的 UiMeasureTextWidth 链,注释只写着"同一组算式 ⇒ 不会漂移",
那是靠人守的约定,改一处漏一处就是"面板变宽而列不动"(文字压到轨道上)。
- 新增 `PanelRowPlan` + `PlanListPanelRows(lane, kind)`:行高累加与行几何的唯一来源。
* 改前 `EdgePanelLayoutFor` 对同一批信号遍历两趟(先算总高、再出行几何),
两处判定(可见/勾选/收起/统计行/参数行数)必须逐字一致 —— 这类"两趟必须同步修改"
正是"改一次布局就出错"的另一半机制。
* 现在一个 {ref, checked, collapsed, hasStats, sliderRows} 数组同时喂高度算式与几何生成。
- 合并前先做等价性判别:`valueColumn` 两处算法不同但结果相同(100000 最宽)⇒ 可合并;
`sliderLabel` 与 `resampleLabel` 不可合并(重采样标签更长,并进会让均值/弱峰变宽)。
第 2 项:`PaintPanelListRows` 的通用参数行提取
- 新增 `PaintPanelParamRows(g, layout, row, kind, PanelParamState{…})`:中心轴统计行 +
两条滑块分支(均值/弱峰),`paintCounts`/`paintMeanSlider`/`paintPeakSlider` 三个 lambda
与 `valueColumn` 随之迁入。
- 逐行状态打包进 `PanelParamState`(解析结果 / 两种条目指针 / 网格下标)⇒ 参数表 5 个,
而不是 9 个散参数(签名比函数体更难读)。
- `PaintPanelListRows` 由约 300 行降到约 120 行,只负责"条目栏 + 按 kind 分派"。
- 顺手把机械搬移遗留的"整个函数体多缩进 2 个 tab"修正。
过程记录(两次锚点误伤,已写入文档避免重犯)
- 锚点 `// 两行滑块` 在 `EdgePanelWidthFor` 内也匹配 ⇒ 误删宽度函数尾部;
- 锚点 `float rowY = ...` 在表格分支先出现 ⇒ 误删「边沿计数」的行发射。
两次都是编译器立刻报错,从 Temp 备份回滚后重做。规则:整段替换的锚点必须唯一,
同名语句多次出现时先定位所属区块再取偏移。
第 3 项(体积)按用户指示暂停投入。
验证(双基线均为"零差异")
- make release / make debug / make -C Tools:零 warning;产物 782,336 → 781,824 B(−512)
- UnitTests:checks=260 failed=0 cases=19
- OffscreenChecks -all:7 检查 / 133 断言全 PASS
- panels -mode compare:7 面板像素哈希逐项不变(含 resample=2BFC74B3D9B3239C)
- rowgeom -mode compare:965+7 键 0 差异;-data MF4-Record.MF4 时 1268+7 键 0 差异
文档:Plan §十二、Progress 第 40 轮、Report §17、agent_mem 第 40 轮
This commit is contained in:
1 parent
1463f9d3f8
commit
a9f1563896
7 files changed
+1023
-599
No files matched your search
@@ -10758,3 +10758,59 @@ brace 不平衡。用备份回滚后重做。
|
||||
(`g, layout, row, kind, state`)。
|
||||
3. 体积剩余空间主要在字符串/浮点格式化(gdtoa 30+ KB 不可去掉,见 §11)。
|
||||
|
||||
---
|
||||
|
||||
## 2026-11-04 · 第 40 轮(`Code_Review` 分支):几何算式重写 + 参数行提取(§17.7 第 1/2 项)
|
||||
|
||||
> 规则原文:`Documents/Code_Review_Report.md` §17、`Code_Review_Plan.md` §十二、
|
||||
> `Code_Review_Progress.md` 第 40 轮。
|
||||
|
||||
### 1. ✅ 宽度算式与列几何共用一份 `PanelColumnMetrics`
|
||||
|
||||
```cpp
|
||||
PanelColumnMetrics MeasurePanelColumns(const Lane&, EdgePanelKind) const;
|
||||
float EdgePanelWidthFor(const Lane&, EdgePanelKind, const PanelColumnMetrics&) const;
|
||||
```
|
||||
`EdgePanelWidth(laneIndex, kind)` = 量一次 + 算一次;`EdgePanelLayoutFor` 量一次,
|
||||
宽度与列几何都读它。
|
||||
**硬规则**:`EdgePanelLayoutFor` 里**禁止**再写 `UiMeasureTextWidth` 链算列宽。
|
||||
|
||||
⚠️ 可合并 / 不可合并的判别(做这类"算式重写"时必须先做):
|
||||
* `valueColumn`:宽度用 `max("100000","-400%")`、几何用 `max("100000","1000")` → **等价**,可合并;
|
||||
* `sliderLabel` 与 `resampleLabel`:**不能**合并(重采样标签更长,并进会让均值/弱峰变宽)。
|
||||
|
||||
### 2. ✅ 行高累加与行几何共用一份 `PanelRowPlan`
|
||||
|
||||
```cpp
|
||||
struct PanelRowPlan { SignalRef ref; bool checked, collapsed, hasStats; int sliderRows; };
|
||||
std::vector<PanelRowPlan> PlanListPanelRows(const Lane&, EdgePanelKind) const;
|
||||
```
|
||||
高度 = `groupRow + (hasStats?groupRow:0) + sliderRows*sliderRow`;几何按同一份计划派发。
|
||||
**禁止**再出现"第一趟算高度、第二趟出几何"的双遍历(两趟判定必须逐字一致 = 错误温床)。
|
||||
|
||||
### 3. ✅ 参数行绘制提取 `PaintPanelParamRows(g, layout, row, kind, PanelParamState{…})`
|
||||
|
||||
`paintCounts` / `paintMeanSlider` / `paintPeakSlider` 与 `valueColumn` 随之迁入。
|
||||
`PaintPanelListRows` 现在只剩"条目栏 + 按 kind 分派"。
|
||||
|
||||
### 4. ⚠️ 整段替换的锚点必须是**唯一**的(本轮两次误伤)
|
||||
|
||||
1. `// 两行滑块` 在 `EdgePanelWidthFor` 里也有一份 ⇒ 误删宽度函数尾部;
|
||||
2. `float rowY = layout.content.Y - scrollMetrics.scroll;` 在**表格分支**先出现
|
||||
⇒ 误删「边沿计数」的行发射。
|
||||
对策:先定位所属区块(如"第二个 `else if (listStyle)`")再取偏移;改前 `Copy-Item` 备份到 `Temp\`。
|
||||
|
||||
### 5. 本轮数字
|
||||
|
||||
* Release 782,336 → **781,824 B**(−512);release/debug/tools 全零 warning。
|
||||
* `UnitTests` 260/19;`OffscreenChecks -all` 7 检查 / 133 断言全 PASS。
|
||||
* `panels -mode compare` 7 面板像素哈希逐项不变;`rowgeom compare` 965+7 / 1268+7 键 0 差异。
|
||||
* `PlotViewPanelPaint.cpp` 935 → 939;`PlotViewPanels.cpp` 1729 → 1766。
|
||||
|
||||
### 6. 下一步
|
||||
|
||||
1. 三处穷举 switch(`PanelStyleOf` / `PanelTitle` / `LanePanelScrollOf`)合成一张 constexpr 表 ——
|
||||
但 `PanelTitle` 依赖运行时 `EdgeRangeSuffix()`,需先解决"标题是函数"。
|
||||
2. `PaintPanelMarkerGroups`(约 260 行)按"分组栏 / 表头 / 条目吸顶"再拆。
|
||||
3. **体积按用户指示暂停投入**(等后续功能更新产生新冗余时再做)。
|
||||
|
||||
Reference in new issue
Block a user