自由标记体验重做 + 全部实验性面板可折起
- 网格内固定点:取值胶囊按已放置矩形做纵向避让(不再互相遮挡);行尾 ✕ 改为与 胶囊同高的正方形;移除固定点的纵向半透明竖线 - 新增「标记透明度」(0–100%),作用于本网格全部固定点的圆点/胶囊/描边/文字/✕; 半透明时文字改走 GDI+(GDI DrawTextW 忽略 alpha),100% 时像素零变化; ≤2% 时不绘制且不登记 ✕ 命中矩形(看不见的按钮不可点) - 面板按信号分组:信号色托底分组栏(展开三角 + 信号名 + N 标记点 + ✕,文字/三角/✕ 一律用自适应对比色),点击分组栏收起/展开;条目五列(值/枚举/增量/时刻/间隔), 首项增列与 Δt 显示 N/A,整个面板没有枚举文本时枚举列整列缺省;行尾仍有 ✕ - 面板内容超高时右侧出现滚动条(分组栏与条目一起滚动),滚轮在内容区翻页; 底部按钮与「标记透明度」滑块固定在底部、不参与滚动 - 底部按钮改为「光标选取模式」切换类按钮(外观与工具栏切换按钮一致,激活高亮), 激活时其上方出现「标记透明度」滑动条(与信号样式区的透明度滑块同款) - 所有实验性功能浮动面板支持展开/折起:标题栏 GX 徽标左侧新增「三角 + 横线」指示器, 单击切换、双击标题栏切换;折起的面板只有标题栏 - 数据层:LanePanelState.collapsed、Lane.freeMarkerOpacity/freeMarkerScroll/ freeMarkerCollapsedGroups,LaneCarry 与 SplitLane 一并继承 - 验证:新增离屏 .preflight/perf/mark2check 69/69(含两组 A/B);回归 datacheck 69/69、 verify 49/49、panelanim 158/158、errcheck 19/19;make release/debug 零警告
This commit is contained in:
1 parent
067128f46c
commit
3400ac7c29
9 files changed
+1225
-202
No files matched your search
@@ -3011,6 +3011,10 @@ else if (panelOnly) { /* 只回送“本帧重绘过的区域并集” */ }
|
||||
|
||||
| 2026-10-20 | DeepSeek-V4.1-Flash(**本机**) | **新增实验性功能「自由标记」(网格内跟随鼠标的纵向光标 + 单击固定数据点 + 面板)**(详见 §12 末尾「2026-10-20 第七轮」与 §11.2 第 181–188 条)。① **数据层**:`Lane` 新增 `freeMarker` 开关、`FreeMarkerItem{ref, time}` 列表(`time` 存**显示时刻**,与光标同一口径)与 `freeMarkerPanel`;新增 `AddFreeMarker/RemoveFreeMarker/RemoveFreeMarkerAt/RemoveFreeMarkersOf/FindFreeMarker/HasFreeMarkers`(同一信号同一时刻不重复加入,容差 1e-12 相对量);`LaneCarry` 一并携带(重建网格不丢)。② **网格内交互**:`ProbeFreeMarker` 在「开启该功能的网格」内挑**离鼠标最近**的那个数据点(`MinorCellSparse` 成立时经 `SnapTimeToSample` 吸附到采样时刻并画圆环提示);`PaintFreeMarker` 画**仅限本网格**的纵向光标(上把手尖端朝下、下把手尖端朝上,**不显示时间读数**)+ 就近取值胶囊;已固定点画细线 + 圆点 + `值(±增量) = 枚举` 胶囊 + 行尾 ✕(悬停高亮 + 提示气泡)。**超出视界直接不显示**(不像常规数据点那样贴边定格 + 三角)。③ **单击 vs 框选**:`OnLButtonDown` 只登记 `m_freeMarkerPendingFix`,`OnLButtonUp` 里**原地未拖动**才真正 `AddFreeMarker`;选区放大模式下「按下后拖动」照旧进入框选并缩放。④ **面板**:新 `EdgePanelKind::MARK`(`PLOT_CMD_LANE_FREE_MARKER = 12`),按「网格内信号顺序 → 该信号内时间升序」展开;每行 `值(±增量) = 枚举` + 两列**右对齐**的 `t:<时刻>s` / `Δt:+<复合单位>`;信号名右侧 ✕ 清除该信号全部固定点、行尾 ✕ 移除单个;双击行编辑「自身时刻」或「相对前一固定点的间隔」(秒),提交后 `SortedFreeMarkerIndices` 自动重排(越过后续点即交换条目位置)。⑤ **两处修正**:`EdgePanelWidth` 的 MARK 分支**不做采样查询**(它被 `TopPanelAtPoint`/`SyncPanelOrder` 高频调用,逐行取值会拖慢鼠标),改用固定宽度 `kFreeMarkerPanelWidth` + 绘制侧省略号;`PaintFreeMarker` 与跟随光标共用 `PaintFreeMarkerCapsule`(避免两份重复绘制)。验证:新增离屏 `.preflight/markcheck` **31/31**(探测/就近选择/单击固定/三处✕/增量与时间列对齐/选区放大共存/吸附/越界不显示/间隔编辑后重排);回归 `check` 136/137(唯一失败项为既有不稳定项,基线同样失败)、`editcheck` 20/20、`round3check` 31/31、`round4check` 34/34、`round5check` 5/5、`convcheck` 18/18,真实 MF4 仍 283/8/18/24;`make release`/`make debug` 零警告;`TargetCheck.exe` **833,536 字节(814.0 KiB)** —— 比上一轮 **+24 KB**,**首次超出 800 KiB 的旧红线约 14 KB**。 |
|
||||
|
||||
| 2026-10-21 | DeepSeek-V4.1-Flash(**本机**) | **快进同步远端 5 个提交(`181f95c → 067128f`,35 文件 +3664/−313;未改动任何源码)**:`b315201` MF4 换算 2/3/4/5/6 + `##CA` + 数值 VLSD;`30f853a` `##CA` 全字段/3 维命名 + `cc_type = 8` 区间枚举 + 包络带线宽双向加粗;`53b981a` 全项目大检查(数据层/UI 真 BUG、死代码清理、体积评估);`dd8f63a` 新增实验性「自由标记」;`067128f` 自由标记改进(默认无光标 + 面板四列对齐 + 光标模式切换按钮)。本机验证:`make release TARGET_FILE_NAME=TargetCheck` **零警告**、产物 **857,600 字节**(GCC 16.1 seh 比起源设备 GCC 15.2 UCRT 略大);`.preflight/perf/datacheck` **69/69**,`MF4-Record.MF4` 仍 3 条时间轴 / **283** 信号(与远端记录一致)。 |
|
||||
|
||||
| 2026-10-21 | DeepSeek-V4.1-Flash(**本机**) | **「自由标记」体验重做 + 全部实验性面板可折起(详见 §12 末尾「2026-10-21 第二轮」与 §11.2 第 194–201 条)**。① **网格内固定点**:取值胶囊互相重叠时做**纵向避让**;✕ 改为**与胶囊同高的正方形**;**删除纵向半透明竖线**;新增「标记透明度」(0–100%,作用于本网格全部固定点:圆点 / 胶囊 / 文字 / ✕);⚠️ **GDI `DrawTextW` 忽略 alpha**,因此半透明时文字改走 **GDI+ `DrawString`**(不透明度 100% 时仍走 `UiText`,像素零变化),实测 0% 时胶囊区域与“无标记”帧逐像素相同(1433→**0**)。② **面板布局重做**:每个有固定点的信号一个**信号色托底分组栏**(三角 + 名称 + `N 标记点` + ✕,文字/三角/✕ 一律用 `UiContrastInk` 自适应对比色,点击分组栏收起该组);条目改成**五列**(取值 / 枚举 / 增量 / 时刻 / 间隔),首项增列与Δt列显示 `N/A`,**整个面板没有枚举文本时枚举列整列缺省**。③ **内容滚动**:内容超高时右侧出现滚动条(分组栏与条目一起滚动),滚轮在内容区翻页;底部按钮与透明度滑块**不参与滚动**。④ **面板折起**:`LanePanelState` 新增 `collapsed`,标题栏 GX 徽标左侧新增「三角 + 横线」指示器(`kEdgePanelDisclosureWidth`),单击折起/展开、双击标题栏切换;折起后只剩标题栏(五类面板全部支持)。验证:新增离屏 `.preflight/perf/mark2check.exe`(**69/69**,含 A/B:恢复竖线 ⇒ 1 项失败;禁用避让 ⇒ 2 项失败);回归 `datacheck` 69/69、`verify` 49/49、`panelanim` 158/158、`errcheck` 19/19;`make release`/`make debug` 零警告;`TargetCheck.exe` 866,816 字节。 |
|
||||
|
||||
## 11. 跨设备协作须知(起源设备视角)
|
||||
|
||||
> **本文件是唯一权威记忆**。所有设备 / Agent 共用它,**不要再新建 `agent_mem_origin.md` 等旁支记忆文件**。
|
||||
@@ -3919,6 +3923,31 @@ else if (panelOnly) { /* 只回送“本帧重绘过的区域并集” */ }
|
||||
信号发名称行(`SortedFreeMarkerIndices` 为空就 `continue`),高度分支与矩形分支必须同步
|
||||
跳过,否则面板会多出空白行。
|
||||
|
||||
194. ⚠️⚠️ **GDI 文本(`UiText` → `DrawTextW`)完全不认 alpha**:`SetTextColor` 只接受 RGB,
|
||||
把 alpha 乘进颜色**不会**让文字淡出(实测 0% 时文字仍满不透明,胶囊区域像素差 300+)。
|
||||
需要"文字随不透明度淡出"时只能改用 **GDI+ `DrawString`**(见 `DrawFreeMarkerAlphaText`:
|
||||
由 HFONT 取 `LOGFONTW` 构造 `gd::Font(hdc, &lf)` —— ⚠️ **该构造函数没有 `Unit` 参数**)。
|
||||
⚠️ 只在"确实需要 alpha"的分支改走 GDI+,100% 时继续用 `UiText`,否则整片文字的光栅化都会变。
|
||||
195. ⚠️⚠️ **看不见的元素不得可点**:网格内固定点在 `freeMarkerOpacity <= 2%` 时整段不绘制,
|
||||
因此也**不登记** ✕ 命中矩形(`m_freeMarkerHits`),否则用户会"隔着空气"删掉固定点。
|
||||
196. ⚠️ **面板内容区必须裁剪、且只登记"与内容区相交"的行**:否则滚出视界的条目的 ✕ / 行矩形
|
||||
会落在底部按钮与透明度滑块的位置上抢走点击。交互侧另有
|
||||
`UiPointInRect(layout.content, …)` 兜底。
|
||||
197. ⚠️⚠️ **`LanePanelState::open` 与 `collapsed` 是两件事**:`open == false` = 功能没开(面板不存在);
|
||||
`collapsed == true` = 功能开着但只显示标题栏。`EdgePanelLayoutFor` 折起时仍要算完
|
||||
`title / close / disclosure / badge` 再 return,否则三角指示器与 ✕ 会"消失"。
|
||||
198. ⚠️ **面板的折起状态必须一起继承**:`LaneCarry`(`RebuildLanes`)与 `SplitLane` 都要拷贝
|
||||
`*.collapsed`,否则勾选信号重建网格后面板会自己弹回展开态。
|
||||
199. ⚠️ **`markerColumns` 是 5 列**(值 / 枚举 / 增量 / 时刻 / 间隔)。枚举列缺省时**列宽记 0**
|
||||
并从排版里跳过(后面的列左移);判断"要不要这一列"只允许查 `SignalEnumText::Empty()`
|
||||
(O(1)),**绝不能**逐条采样(布局函数在 `TopPanelAtPoint` / `SyncPanelOrder` 里被高频调用)。
|
||||
200. ⚠️ **面板内容宽度必须给滚动条让位**:`innerWidth = 宽 − 2×pad − (可滚动 ? scrollW + 4 : 0)`,
|
||||
且五列总宽 + 行 ✕ 必须 ≤ `innerWidth`(当前列宽 `{74,80,60,72,78}` + 4×2 间隙 + 13 ✕ = 391 ≤ 399)。
|
||||
201. ⚠️ **MARK 面板的滚动偏移在布局里 clamp、不回写状态**(回写会让面板像素缓存键反复抖动);
|
||||
滚轮与拖滚动条这两条写入路径必须自己按 `markerContentHeight − content.Height` 夹取。
|
||||
202. ⚠️ **固定点取值胶囊的重叠避让只在绘制侧做**(`PaintFreeMarker` 内按已放置矩形纵向错开),
|
||||
命中矩形(`m_freeMarkerHits`)由绘制时登记 ⇒ 自动跟随避让后的位置,**不要**在命中侧重算。
|
||||
|
||||
### 11.3 离屏验证方法学(本机偏好,强烈建议沿用)
|
||||
|
||||
- **不要占用用户的鼠标 / 键盘 / 屏幕**:优先 `.preflight/uitest`(离屏 harness:`SW_HIDE` 窗口 + 直接注入消息 + `BitBlt` 从 `m_backDc` 截图)或 `.preflight/perf`(离屏计时 / 逐像素对比)。
|
||||
@@ -7293,6 +7322,110 @@ DG3 data=0 cycle=0 (空组,一个字符串通道)
|
||||
真实 MF4 仍 **283** 条信号。
|
||||
- `make release` / `make debug` **零警告**;`Build/Release/Target.exe` **834,560 字节(815.0 KiB)**。
|
||||
|
||||
---
|
||||
|
||||
## 本轮(2026-10-21 第二轮,本机):「自由标记」体验重做 + 全部实验性面板可折起
|
||||
|
||||
> 用户需求(逐条):
|
||||
> ① 网格内固定点的**取值显示互相重叠遮挡** ⇒ 加避让;取值后面的 ✕ 改成**与取值同高的正方形**;
|
||||
> 固定点**不再显示纵向半透明竖线**;
|
||||
> ② 面板底部的按钮改为只显示「**光标选取模式**」,交互外观与工具栏的切换类按钮一致(激活高亮),
|
||||
> 激活时在按钮**上方**出现「**标记透明度**」滑动条(外观与信号样式区的「透明度」同款),
|
||||
> 它控制本网格内**所有固定点显示内容**的透明度;
|
||||
> ③ 面板内容重排:与信号列表的「组 → 信号」类似 —— 每个有固定点的信号一个**信号色托底分组栏**
|
||||
> (左:展开/收起三角 + 信号名;右:`N 标记点` + ✕;文字/三角/✕ 都用**自适应对比色**),
|
||||
> 点击分组栏展开/收起;条目五列:**当前值 / 枚举文本 / 增量 / 标记点时刻 / 相对前一点的时间增量**,
|
||||
> 列之间纵向对齐、互不重叠;整个面板都没有枚举文本时**缺省枚举列**;首项增列与 Δt 列显示 `N/A`;
|
||||
> 每行末尾仍有 ✕;
|
||||
> ④ 内容过多时面板要有**上下滚动条**(分组栏 + 条目一起滚动),底部按钮与滑动条**不参与滚动**;
|
||||
> ⑤ **所有**实验性功能浮动面板都支持展开/折起:GX 徽标左边加**三角 + 横线**指示器,
|
||||
> 单击折起/展开,收起的面板只有标题栏,双击标题栏也可展开。
|
||||
|
||||
### A. 数据层(`Utilities`)
|
||||
|
||||
- `LanePanelState` 新增 `bool collapsed = false`(`open` 仍然表示“功能是否显示”,二者语义不同)。
|
||||
- `Lane` 新增:`float freeMarkerOpacity = 1.0f`(网格内固定点显示不透明度)、
|
||||
`float freeMarkerScroll = 0.0f`(面板内容滚动偏移)、
|
||||
`std::vector<SignalRef> freeMarkerCollapsedGroups`(面板里被收起的信号分组;**不在列表里 = 展开**)
|
||||
+ `FreeMarkerGroupCollapsed()` / `ToggleFreeMarkerGroupCollapsed()`。
|
||||
- `LaneCarry`(`RebuildLanes`)与 `TabConfig::SplitLane` 这两处“网格重建/拆分时的状态继承”都带上新状态,
|
||||
并对五个面板都补了 `*.collapsed` 的拷贝。
|
||||
|
||||
### B. 网格内固定点
|
||||
|
||||
- **标签避让**:`PaintFreeMarker` 逐条记录已放置的胶囊外接矩形;新胶囊与它们相交时按
|
||||
`+1、-1、+2、-2 …` 步长(步长 = 胶囊高 + 2px)**纵向错开**,并夹在网格可视范围(`clipTop..clipBottom`)内。
|
||||
- **✕ 正方形**:`FreeMarkerLabelRects` 里 `closeSize = textHeight`(胶囊高度),宽高相等。
|
||||
- **删除纵向竖线**:固定点不再画那条 `WithAlpha(signalColor, 0x70)` 的竖线(跟随光标模式的光标线仍在)。
|
||||
- **标记透明度**:圆点、胶囊底色、描边、文字、✕ 都乘 `lane.freeMarkerOpacity`;
|
||||
⚠️ **GDI `DrawTextW` 忽略 alpha**(`SetTextColor` 只吃 RGB)⇒ 半透明时文字改由
|
||||
`DrawFreeMarkerAlphaText()`(GDI+ `DrawString` + alpha brush)绘制,100% 时仍走 `UiText`
|
||||
(像素零变化)。不透明度 ≤ 2% 时**整个胶囊什么都不画**,且**不登记 ✕ 命中矩形**
|
||||
(看不见的按钮不应可点)。
|
||||
|
||||
### C. 面板布局(`EdgePanelLayout` / `EdgePanelLayoutFor`)
|
||||
|
||||
- 新增字段:`disclosure`(标题栏左侧三角指示器,宽 `kEdgePanelDisclosureWidth = 20`)、
|
||||
`collapsed`、`content`/`scrollTrack`/`scrollThumb`/`markerContentHeight`、
|
||||
`opacityTrack`/`opacityValue`、`markerGroups`(`MarkerGroup{ref, header, triangle, close, collapsed}`)、
|
||||
`markerHasEnumColumn`;`markerColumns` 由 4 列扩到 **5 列**
|
||||
(`MARKER_COL_VALUE/ENUM/DELTA/TIME/DT`)。
|
||||
- `GX` 徽标右移一个 `disclosure` 宽度;**折起**时 `height = titleHeight` 并在算完
|
||||
`title/close/disclosure/badge` 后直接 return(内容区/按钮/滚动条都是空矩形)。
|
||||
- MARK:内容总高 = Σ(分组栏 + 未收起组的条目),`viewHeight = min(总高, 内容上限)`;
|
||||
内容上限 = `min(kFreeMarkerContentMaxHeight=260, 绘图区高 − 标题 − 3×pad − 按钮 − 滑块行)`。
|
||||
超高 ⇒ `scrollTrack` 宽 `kFreeMarkerScrollWidth=7`、滑块高度按内容比例、位置按滚动比例;
|
||||
同时把内容宽度收窄 `scrollW + 4px`,保证五列 + 行 ✕ 不会与滚动条重叠
|
||||
(列宽因此调整为 `{74, 80, 60, 72, 78}`,面板宽 `424`)。
|
||||
- 只登记**与内容区相交**的分组栏与条目矩形 ⇒ 滚出视界的条目不会抢走底部按钮/滑块的点击
|
||||
(交互侧再用 `UiPointInRect(layout.content, …)` 兜一层)。
|
||||
- 枚举列:只查“这些信号是否带枚举表”(`SignalEnumText::Empty()`,O(1)),
|
||||
**不逐条采样**(布局函数被 `TopPanelAtPoint`/`SyncPanelOrder` 高频调用)。
|
||||
|
||||
### D. 绘制
|
||||
|
||||
- 标题栏:先画「三角(朝下 = 展开 / 朝右 = 折起)+ 三角右侧一条短横线」,再画 GX 徽标与标题。
|
||||
- MARK 内容区:`g.SetClip(content, Intersect)` 后绘制;分组栏用 `WithAlpha(signalColor, 0xE8)` 托底,
|
||||
三角 / 名称 / `N 标记点` / ✕ 全部用 `UiContrastInk(signalColor)` 的自适应对比色;
|
||||
条目五列左对齐在**布局给定的列起点**上(超长 `UiEllipsize`),
|
||||
`值 | (枚举) | ±增量 or N/A | <时刻>s | Δt:+… or N/A`。
|
||||
- 底部:按钮改为**切换类按钮**外观(激活 = `accentSoft` 底 + `accent` 描边 + `textStrong`),文案固定
|
||||
「光标选取模式」;激活时其上方是「标记透明度」行(左侧标签 + 轨道 + 右侧百分比,
|
||||
与信号样式区的「透明度」行同款 `UiDrawSlider`)。
|
||||
|
||||
### E. 交互
|
||||
|
||||
- 新增拖拽模式 `MARKER_OPACITY`(拖滑块 → `SetLaneFreeMarkerOpacity`)与
|
||||
`MARKER_SCROLL`(拖滚动条滑块 → `SetLaneFreeMarkerScroll`,含抓取偏移与轨道点击跳转)。
|
||||
- `OnMouseWheel`:鼠标在 MARK **内容区**上时滚轮翻页面板(±40px/格),否则照旧滚网格;
|
||||
底部按钮/滑块区域**不**翻页。
|
||||
- `OnLButtonDown` 顺序:✕ → GX 徽标 → **disclosure** → 逐条目参数 → MARK 底部按钮 → 透明度滑块 →
|
||||
滚动条 → 分组栏(✕ 清空该信号 / 其它位置切换收起)→ 行尾 ✕ → 标题栏拖动 → 面板主体消费。
|
||||
- `OnDoubleClick`:标题栏(排除徽标/✕/三角)**双击切换折起**;MARK 条目仍按列边界编辑时刻/间隔。
|
||||
- 悬浮:分组栏三角悬停高亮(`m_freeMarkerTriangleHoverLane/Signal`),✕ 悬停沿用
|
||||
`m_freeMarkerPanelHover*`;光标形状:三角/分组栏/✕ = 手型,透明度滑块 = 左右箭头,滚动条 = 上下箭头。
|
||||
|
||||
### F. 验证
|
||||
|
||||
- 新增离屏 `.preflight/perf/mark2check.exe` **69/69**:
|
||||
[A] 固定点:单点无竖线(与“无标记”帧逐像素对比,竖线列差异必须为 0)、✕ 正方形、
|
||||
三点胶囊纵向避让(✕ 矩形互不相交且 Y 不同);
|
||||
[B] 面板:一个分组栏(三角/✕ 在托底内)、三行条目、五列不重叠、枚举列缺省(宽 0);
|
||||
[C] 分组收起后只留分组栏、行数归零、面板变矮,再次点击恢复;
|
||||
[F] 五类面板折起后高度 == 标题栏高度且内容全空(含 COUNT 面板);
|
||||
[D] 40 个固定点 ⇒ 内容超可视区、滚动条出现、滑块在轨道内;滚到最大时滑块贴底、
|
||||
分组栏与条目一起移出、滚轮在内容区可翻页而在按钮区不翻页;
|
||||
[E] 光标模式开关 ⇒ 滑块出现/消失、面板高度随之变化;点击轨道 25% ⇒ 不透明度 ≈25%;
|
||||
不透明度 0% 与“无标记”帧逐像素相同(1433 → **0** 像素差异)。
|
||||
[G] 额外导出 `mark2check_shot*.bmp`(人工目视检查用,不入库)。
|
||||
- **A/B**:临时恢复固定点竖线 ⇒ 「no translucent vertical line」如实失败;
|
||||
临时禁用避让(`attempt <= 0`)⇒ 「capsules do not overlap」如实失败。恢复后 69/69。
|
||||
- 回归:`datacheck` 69/69、`verify` 49/49、`panelanim` 158/158、`errcheck` 19/19;
|
||||
`make release` / `make debug` **零警告**;`TargetCheck.exe` **866,816 字节**。
|
||||
⚠️ `verify.exe` 在打印完结果后**退出时**仍会 0xC0000005(`git stash` 回到本轮改动前的基线
|
||||
同样复现 ⇒ 探针自身的既有问题,与本轮无关)。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user