fix(clip): 选区截取面板五处缺陷(条目/空白/多信号截取/滚轮)
一、未启用双光标时不再显示信号条目
EdgePanelLayoutFor 与绘制侧都只判 clipPanel、没判双光标是否启用,
于是照常累加内容高度、生成行矩形并绘制条目。
- 高度算式新增 clipReady = clipPanel && CursorMode()==DOUBLE,未就绪时内容只占一行(提示);
- 行几何循环加 clipRowsVisible,未就绪时不生成任何行矩形 => 绘制自然为空;
- footer 同步改为"未就绪 = 0"。
二、条目区与底部按钮之间的大段空白(未启用双光标时也有)
两个叠加根因:
1) 高度算式的 maxContent 有"至少 3 行"下限 => 只有 1 个信号也硬撑 3 行高;
改为 min(上限, max(1 行, budget))。
2) 几何侧 viewHeight 多减了一个 pad(高度算式只含一个 pad + bottomPad);
统一为 height - titleHeight - pad - footerHeight。
高度算式与内容区几何必须严格同源。
三、多个信号「原始信号截取」结果不对
同组信号共享同一条时间轴,ClipSignalRange 每次都裁剪 axis.time
=> 截完第一条后其它信号时间基准被改短 => 采样与时间错位。
- 新增 DataSet::ForkAxisForSignal:轴非独占时复制一份新轴并让信号指向它;
- ClipSignalRange 内再加一道守卫:轴仍被共享时直接返回 false(不改任何数据);
- Application::ClipSignalInPlace 先 fork 再裁剪。
四、有滚动条时滚轮滚不到底
1) OnMouseWheel 的 current 取值链漏了 CLIP => 读到 meanFilterScroll(恒 0)而写入 clipScroll,
补上 CLIP 分支;
2) PanelSlotKey 里 clipScroll 被写成布尔(>0 ? 1 : 0)=> 滚到 1px 后键不再变化,
改为 mixFloat(lane.clipScroll) 真实值。
删 .o 全量重编译:零 error、零 warning,产物 861,184 B。
按用户要求未占用鼠标/键盘/屏幕,未运行 GUI 探针。
This commit is contained in:
1 parent
62220477c0
commit
21a9865365
7 files changed
+199
-12
No files matched your search
@@ -9952,3 +9952,66 @@ MEAN_SCROLL / 滚轮 / 悬停 / `SetLanePanelCollapsed` / `LanePanelCollapsed` /
|
||||
本轮因此连续 3 次编译失败。**改这类表达式时先用 Python 数列数括号**,或改成查表。
|
||||
* `make clean` 在用户正开着 `Target.exe` 时会失败(文件被占用),
|
||||
改用"删 `Build/Release/*.o` + `make`"做全量重编译验证即可。
|
||||
|
||||
---
|
||||
|
||||
## 2026-11-03 第二十八轮(本机 dev):选区截取面板五处缺陷修复
|
||||
|
||||
> 用户实测报告的五个问题:①未启用双光标时仍显示信号条目、过多信号还能滚动;
|
||||
> ②条目滚动区与底部按钮之间有一大段空白(未启用双光标时也有);
|
||||
> ③多个信号同时「原始信号截取」结果不对;④有滚动条时滚轮滚不到底。
|
||||
|
||||
### 1. 未启用双光标时不应显示信号条目
|
||||
|
||||
**根因**:`EdgePanelLayoutFor` 与绘制侧都只判断 `clipPanel`,没有判断「双光标是否启用」,
|
||||
于是照常按信号数累加内容高度、生成行矩形、绘制条目。
|
||||
|
||||
**修法**(`PlotViewPanels.cpp`):
|
||||
* 高度算式新增 `clipReady = clipPanel && CursorMode()==DOUBLE`:
|
||||
未就绪时 `content = 一行高度`(只放提示),不遍历信号。
|
||||
* 行几何循环加 `clipRowsVisible = !clipPanel || clipReadyHere`,未就绪时**不生成任何行矩形**
|
||||
⇒ 绘制侧(依赖 `layout.rowRefs`)自然什么都不画。
|
||||
* footer 也改为「未就绪 = 0」:`clipPanel ? (clipReady ? 两行按钮 : 0) : ...`。
|
||||
|
||||
### 2. ⭐ 条目区与按钮之间的大段空白
|
||||
|
||||
**两个叠加根因**:
|
||||
1. 高度算式里 `maxContent = max(3*groupRow, min(上限, max(3*groupRow, budget)))`
|
||||
—— 那个「至少 3 行」的下限让只有 1 个信号的面板硬撑到 3 行高。
|
||||
⇒ 改为 `maxContent = min(上限, max(groupRow, budget))`(只保留 1 行下限)。
|
||||
2. 几何侧 `viewHeight = height - titleHeight - pad - pad - footerHeight` **多减了一个 pad**,
|
||||
而高度算式是 `height = title + pad + view + bottomPad + footer`(`bottomPad = pad`)。
|
||||
⇒ 统一为 `viewHeight = height - titleHeight - pad - footerHeight`。
|
||||
⚠️ **高度算式与内容区几何必须严格同源**,多减一个 pad 就会在底部留出一条空白。
|
||||
|
||||
### 3. ⭐⭐ 多个信号「原始信号截取」结果不对
|
||||
|
||||
**根因**:同组的信号**共享同一条时间轴**(合并网格/同文件多通道)。
|
||||
`DataSet::ClipSignalRange` 每次截取都会裁剪 `axes[signal.axisIndex].time`
|
||||
⇒ 截完第一条,后面信号的时间基准已被改短 ⇒ 采样与时间错位("截取出来的信号不对")。
|
||||
|
||||
**修法**:
|
||||
* 新增 `DataSet::ForkAxisForSignal(group, signal, &axisIndex)`:
|
||||
若该信号的时间轴**不是独占**,就复制一份新轴并把信号指向它(已独占则直接返回)。
|
||||
* `ClipSignalRange` 内再兜一层:检测到轴仍被其它信号共享时**直接返回 false**(不改任何数据),
|
||||
避免任何调用方绕过 fork 造成错位。
|
||||
* `Application::ClipSignalInPlace`:**先** `ForkAxisForSignal` 再 `ClipSignalRange`。
|
||||
* 降序处理多个信号时,每条信号各自 fork 出自己的轴,互不影响。
|
||||
|
||||
### 4. ⭐ 有滚动条时滚轮滚不到底
|
||||
|
||||
**根因**(典型的三元式漏分支):
|
||||
`OnMouseWheel` 的 `current` 取值链只列了 CENTER/PEAK/COUNT/RESAMPLE,**漏了 CLIP**
|
||||
⇒ 读到的是 `meanFilterScroll`(恒 0),而写入的是 `clipScroll`
|
||||
⇒ 每次滚轮都从 0 开始算,永远只能滚一小步、滚不到底部。
|
||||
⇒ 补上 `(hoveredKind == CLIP) ? wheelLane.clipScroll : ...`。
|
||||
|
||||
**并发现第二个隐患**:`PanelSlotKey` 里 CLIP 的滚动量被写成
|
||||
`mix(lane.clipScroll > 0.0f ? 1 : 0)`(布尔)⇒ 滚到 1px 之后键不再变化、面板不重绘。
|
||||
⇒ 改为 `mixFloat(lane.clipScroll)`(真实值)。
|
||||
|
||||
### 5. 验证与提交
|
||||
|
||||
* 三处 `switch/tag` 均已逐个 grep 核对(`EdgePanelKind::RESAMPLE` 反查法)。
|
||||
* 删 `.o` 全量重编译:**零 error、零 warning**,产物 861,184 B(< 1MB)。
|
||||
* 用户要求不占用鼠标键盘屏幕 ⇒ 本轮**未跑任何 GUI 探针**,仅做编译验证与源码级核对。
|
||||
Reference in new issue
Block a user