弱峰增强改回逐信号滑块;迭代次数上限可就地编辑

一、参数输入方式(回到滑块形态,但每个信号各有一套)
- 面板布局:每个被勾选的信号 = 名称行(+复选框)+ 两行滑块:
  「增强等级 %」(0~200%)与「迭代次数 N」(1 ~ 该信号自己的上限)。
  EdgePanelLayout 新增逐信号矩形 rowLevelTracks/rowLevelValues/rowIterTracks/rowIterValues;
  PEAK 的 rowPoints/rowIterations 恒为空(MEAN/CENTER 仍用文本输入框)。
- 恢复 kWeakPeakSliderRowHeight/kWeakPeakTrackHeight/kWeakPeakTrackMinWidth 与
  WeakPeakSliderHit();恢复 PlotDragMode::PEAK_LEVEL/PEAK_ITERATIONS,
  并新增 m_peakDragRef(拖动时必须知道是哪个信号)。
- 列宽算式集中在 WeakPeakLabelColumnWidth()/WeakPeakValueColumnWidth(),
  与 EdgePanelWidth 共用,避免布局与面板宽度计算漂移。

二、迭代次数滑块上限可就地编辑(用户要求的行为)
- 点击「迭代次数 N」滑块右侧的数值文本 → 整条滑块行(轨道 + 数值)变成一个输入框;
  左侧标签保留可见。
- 输入框以空内容开始;空内容时以灰色提示当前上限值(m_peakEditCurrentMax,EndEdit 清零)。
- 过滤器为 EditFilter::BYTE(纯数字):负号、小数点、字母无法键入,粘贴同样被清洗,
  从源头满足"只允许输入正整数"。
- 提交(回车 / 点击别处):仅当解析成功且 1 <= 值 <= 1000 时才作为新上限;
  空内容、0、超范围一律保持原上限不变;生效后若当前迭代次数超过新上限则自动替换为新上限。
- 输入框在 paintOverlays() 中与 Y 轴上下限输入框一起绘制(覆盖在面板之上)。
- 新增 PlotEditTarget::PEAK_ITERATIONS_MAX;删除 PEAK_LEVEL_PERCENT/PEAK_ITERATIONS
  (等级只能拖滑块,迭代次数只能拖滑块)。

三、数据与缓存
- Lane::WeakPeakItem 新增 maxIterations(默认 10)。
- maxIterations 参与 PanelSlotKey(决定圆钮位置,面板必须重画),
  但不参与 SceneContentHash(不影响网格内曲线,不应触发波形重画)。

四、测试
- uitest [X] 改为:滑块存在性/层序/列宽、等级滑块拖动(中间=100%、右端=200%)、
  迭代滑块拖动(左端=1、右端=当前上限)、点击数值进入上限编辑(空内容 + 提示值 + 输入框
  横跨整行、空内容回车不改、'-'/字母被拒、输入 40 生效且右端变 40、下调到 4 时当前值被夹到 4、
  输入 0 被拒、点击别处提交),并保存编辑态截图供目视核对。
- make all 零警告;uitest 409/409 通过;panperf PASS;layercheck 保持像素一致。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-12 13:35:50 +08:00
1 parent 1ddbc37b78
commit a30a6fcf4d
4 files changed
+598 -112

No files matched your search

+64
View File
@@ -2484,3 +2484,67 @@ Documents/ 项目文档(含本文件)
- 新增离屏探针 `.preflight/panperf`(平移帧耗时 + 按住键静止帧耗时)。
- **验证**:`make all` 零警告;`uitest` **388/388 通过**;`panperf` PASS;
`.preflight/layercheck` 保持“居中图层 vs 整幅重绘逐像素 0 差异 / 平移对齐 ≤1px / 0 次视界覆盖”。
---
## 本轮(2026-10-12,起源设备):弱峰增强改回**逐信号滑块** + 「迭代次数 N」上限可编辑
用户要求:把上一轮改成“逐信号两个输入框”的参数输入方式,改回**上一次提交之前**的输入方式
(滑块),但**每个信号各自一套滑块**;并且「迭代次数 N」滑块右侧的数值可以点击,
整行(滑块 + 数值)变成一个输入框来修改该滑块的**上限**。
### 数据模型
- `Lane::WeakPeakItem` 新增 `int maxIterations = 10;`(**该信号迭代次数滑块的上限**,用户可改)。
- 上限参与 `PanelSlotKey`(决定圆钮位置 → 面板必须重画),但**不进 `SceneContentHash`**
(上限不影响网格内画出的曲线,因此不该让波形重画)。
### 面板输入方式(滑块的“上一次提交之前”形态,但逐信号)
- `EdgePanelLayout` 新增四个**逐信号**矩形数组(`std::vector<gd::RectF>`,与 `rowRefs` 同序):
`rowLevelTracks` / `rowLevelValues`(增强等级滑块 + 右侧数值)、
`rowIterTracks` / `rowIterValues`(迭代次数滑块 + 右侧数值)。
PEAK 面板的 `rowPoints`/`rowIterations`(文本输入框)**恒为空矩形**(MEAN/CENTER 仍用它们)。
- 行高:每个**被勾选**的信号 = 名称行(22)+ **两行滑块**(各 26)= 74;未勾选只占名称行。
- 列宽算式集中在两个文件内辅助函数里,`EdgePanelWidth` 与 `EdgePanelLayoutFor` 共用,
避免两处漂移:`WeakPeakLabelColumnWidth(uiSmall)`、`WeakPeakValueColumnWidth(monoSmall)`
(后者取 `"200%"` 与 `"10000"` 的较宽者,为可改大的上限留位宽)。
轨道最小宽度用恢复的 `kWeakPeakTrackMinWidth = 120`。
- 恢复 `WeakPeakSliderHit()`(按轨道矩形上下各放宽 ≥8px 命中)与
`PlotDragMode::PEAK_LEVEL / PEAK_ITERATIONS`、`m_peakDragLane` + 新增 **`m_peakDragRef`**
(每个信号一套参数,拖动时必须记住是**哪个信号**)。
- 删除 `PlotEditTarget::PEAK_LEVEL_PERCENT` / `PEAK_ITERATIONS`
(等级只能拖滑块;迭代次数只能拖滑块),新增 **`PlotEditTarget::PEAK_ITERATIONS_MAX`**。
### 「迭代次数 N」上限的就地编辑(用户明确要求)
- **触发**:点击**迭代次数滑块右侧的数值文本**(`rowIterValues[i]`)。
- **输入框范围**:整条滑块行 —— 从轨道左端到数值文本右端
(`rowRect = {track.X, value.Y, value.X + value.Width - track.X, value.Height}`),
即“整个滑动条部分包括数字完整变为一个输入框”。左侧的「迭代次数 N」标签保留可见。
- **初始内容为空**:`BeginEdit(PEAK_ITERATIONS_MAX, lane, L"", rowRect)` 之后
再用 `m_edit.Begin(L"", false, EditFilter::BYTE, 0u)` 覆盖过滤器
(`BeginEdit` 默认 `NUMBER`,允许负号/小数点)。
- **灰色提示**:`PaintEditField()` 里当 `m_editTarget == PEAK_ITERATIONS_MAX && m_edit.Text().empty()`
时用 `UiTextAtClipped` 画当前上限(`m_peakEditCurrentMax`,进入编辑时记录、`EndEdit` 清零);
提示文本比插入符右移 `11 * scale`,避免插入符压在数字上。
该输入框在 `paintOverlays()` 里与 Y 轴上下限输入框一起绘制(在面板之上)。
- **提交**:回车 / 点击别处(沿用既有 `EndEdit` 路径)。规则:
* `EditFilter::BYTE` = **只允许数字**(负号、小数点、字母根本无法键入,粘贴同样被清洗);
* `parsedOk` 且 `1 ≤ value ≤ kWeakPeakIterationsMaxLimit(=1000)` → 生效为新上限;
否则(空内容 / `0` / 超出范围)→ **保持原上限不变**;
* 生效后若 `iterations > maxIterations` → **自动替换为新上限**(并清 `m_weakPeakCurveCache`)。
- **滑块量程**:`1 … maxIterations`;比例 = `(iterations-1)/(maxIterations-1)`(`max≤1` 时取 0)。
- 「构建为新信号」按该信号自己的量程夹取迭代次数。
### 验证(全部离屏,不占用鼠标/键盘/屏幕)
- `uitest` `[X]` 重写为:逐信号滑块存在性/层序/列宽/面板内、**等级滑块拖动**(中间=100%、
右端=200%)、**迭代滑块拖动**(左端=1、右端=当前上限 10)、
**点击数值进入 `PEAK_ITERATIONS_MAX` 编辑**(空内容 + 提示值 10 + 输入框横跨整行、
空内容回车不改、`-`/字母被拒、输入 40 生效、右端变为 40、下调到 4 时当前值被夹到 4、
输入 0 被拒、点击别处也能提交),并保存编辑态截图 `X_peak_max_edit.png` 供目视核对。
- ⚠️ 测试坐标坑:`UiPointInRect` 右边界为**开区间**,按压“轨道最右端”的取整坐标可能落在
命中区之外 → 测试里按 `lround(X+W) - 1`;而**拖拽**可以超出(`UiSliderRatioFromX` 会夹到 1)。
- `make all` 零警告;`uitest` **409/409 通过**;`panperf` PASS;
`layercheck` 保持“居中图层逐像素 0 差异 / 平移对齐 ≤1px / 0 次视界覆盖”。