弱峰增强改回逐信号滑块;迭代次数上限可就地编辑
一、参数输入方式(回到滑块形态,但每个信号各有一套) - 面板布局:每个被勾选的信号 = 名称行(+复选框)+ 两行滑块: 「增强等级 %」(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:
1 parent
1ddbc37b78
commit
a30a6fcf4d
4 files changed
+598
-112
No files matched your search
@@ -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 次视界覆盖”。
|
||||
Reference in new issue
Block a user