目录规范化(Inc/Src)+「自由标记」第六轮交互调整

1) 目录规范化:所有 .hpp 只放 Inc,Src 只放 .cpp
   - 4 个 *Internal.hpp 从 Src 迁到 Inc(DataModel/Application/PlotView/SignalPanel)
   - Makefile 固化该约定(注释必须单独成行:写在同一行会把 CXX_INCLUDES_PATHS 整条注释掉)
   - include 全是扁平形式,搬家无需改任何 include

2) 常规模式 = 普通鼠标(未开启「自由标记点选取」)
   - ProbeFreeMarker 早退:不预览、不画纵向光标、单击不固定
   - 补 if (!hitCurve) continue:否则整列光标下 probe.ref 恒有效,任意位置都能固定
   - 固定点仍恒吸附到真实采样时刻;「已吸附」圆环只在稀疏判据成立时画

3) 两个显示开关:按钮改名「自由标记点选取」,其下新增「显示增量 | 显示枚举文本」
   - 默认关闭,只影响已固定点的胶囊文本;预览胶囊恒为「值 = 枚举」
   - 开关行计入面板高度与内容区高度

4) 面板六列:新增恒存在的「序号」列(组内 1 起)
   - 枚举列存在时,无枚举/对不上任何枚举项显示 N/A
   - 列与列之间画竖线;悬停某行时其它固定点封顶 50% 不透明度,移出恢复
   - 删除固定点 ✕ 的悬停浮动提示(PaintFreeMarkerTooltip 实现与声明全部移除)
   - 开启选取模式的网格上,信号悬停提示只显示信号名

5) 缓存键补齐
   - FreeMarkerContents 混入枚举表指纹(旧键会让加上枚举表后仍显示 N/A)
   - PanelSlotKey 混入两个新按钮矩形与开关状态

6) 注释/文档
   - 修正 FreeMarkerProbe、SetLaneFreeMarkerCursor、标记透明度等处的过期说明
   - 空态提示按是否开启选取模式区分文案

验证(全离屏,未占用鼠标/键盘/屏幕)
   - 新增 .preflight/mark5check 52/52
   - 回归:markcheck 67/67、mark4check 40/40、fixcheck 37/37、round3check 31/31、
     round4check 34/34、round5check 5/5、editcheck 20/20、convcheck 18/18、diag 19/19
   - check 136/137(唯一失败项为既有不稳定项,drift=15818 与改动前逐位相同)
   - make release / make debug 零警告;Release 产物 TargetCheck.exe 857,600 字节
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-23 15:50:55 +08:00
1 parent 79eebc281e
commit affb9cc340
12 files changed
+561 -187

No files matched your search

+28 -12
View File
@@ -939,16 +939,32 @@ namespace jdi
bool freeMarker = false;
/**
* @brief 「自由标记」的光标模式(浮动面板最下方的切换按钮)。
* @brief 「自由标记」的**光标模式**(浮动面板底部「自由标记点选取」切换按钮)。
*
* `false`(默认):鼠标在信号曲线上(判据同 `PlotView::ProbeFreeMarker`:
* 到画出来的折线的垂直距离 ≤ `kSignalHitTolerance`)时才显示取值预览;
* 鼠标下方没有曲线时按下就是普通的平移/框选,不会误固定数据点。
* `true`:与最初实现的语义相同 —— 网格内始终跟随鼠标画一条**仅限本网格**的纵向光标
*(上下各一个三角把手、不显示时间读数),光标穿过信号时标注离鼠标最近的数据点。
* `false`(默认):鼠标就是**普通鼠标** —— 不显示任何取值预览、不画纵向光标,
* 按下/拖动完全走常规语义(平移 / 框选 / 拖信号),**不会**固定数据点。
* `true`:进入「自由标记点选取」—— 网格内始终跟随鼠标画一条**仅限本网格**的纵向光标
*(上下各一个三角把手、不显示时间读数),鼠标接触到信号曲线时标注离鼠标最近的数据点,
* 左键单击把该数据点固定下来(此时左键**不再**用于平移/框选/拖信号)。
*/
bool freeMarkerCursor = false;
/**
* @brief 固定点的数值显示是否附带**括号内增量**(浮动面板的「显示增量」开关)。
*
* 默认 `false`:胶囊只显示当前值。⚠️ 只影响**已固定点**的显示,
* 不影响「自由标记点选取」模式下跟随鼠标的预览胶囊,也不影响面板统计列。
*/
bool freeMarkerShowDelta = false;
/**
* @brief 固定点的数值显示是否附带**枚举文本**(浮动面板的「显示枚举文本」开关)。
*
* 默认 `false`:胶囊只显示当前值。⚠️ 只影响**已固定点**的显示,
* 不影响跟随鼠标的预览胶囊,也不影响面板统计列(那一列只看有没有枚举表)。
*/
bool freeMarkerShowEnum = false;
/**
* @brief 已固定的自由标记点(**未排序**,按加入顺序)。
*
@@ -994,9 +1010,9 @@ namespace jdi
/**
* @brief 网格内固定数据点(纵向细线 / 数据点 / 取值胶囊 / 行尾 ✕)的显示不透明度。
*
* 0 = 完全透明(看不见),1 = 完全不透明(默认)。由浮动面板底部「光标选取模式」
* 激活时出现的「标记透明度」滑动条驱动;只影响**本网格**的固定点显示内容,
* 不影响面板自身的像素与鼠标交互。
* 0 = 完全透明(看不见),1 = 完全不透明(默认)。由浮动面板底部**总是显示**的
* 「标记透明度」滑动条驱动(与「自由标记点选取」是否开启无关);只影响**本网格**的
* 固定点显示内容,不影响面板自身的像素与鼠标交互。
*/
float freeMarkerOpacity = 1.0f;
@@ -1026,15 +1042,15 @@ namespace jdi
int freeMarkerSelected = -1;
/**
* @brief 「自由标记」面板五列的**实测内容宽度**(设备像素,0 = 还没量过)。
* @brief 「自由标记」面板六列的**实测内容宽度**(设备像素,0 = 还没量过)。
*
* 用户 2026-10-21 明确要求:面板里的取值 / 枚举文本 / 增量 / 时刻 / 间隔
* 用户 2026-10-21 明确要求:面板里的序号 / 取值 / 枚举文本 / 增量 / 时刻 / 间隔
* **不得出现省略号(…)**。因此列宽不能再用固定值:绘制该面板时顺便把每格
* 真实文本量一遍,取最大值存到这里;布局(`EdgePanelWidth` / `EdgePanelLayoutFor`)
* 用它与缺省列宽 `kFreeMarkerColumnWidths` 的较大者,于是列宽自然贴合内容。
* ⚠️ 存的是**设备像素**(已经乘过 DPI 缩放),与字体直接对应。
*/
std::array<float, 5> freeMarkerColumnWidths{};
std::array<float, 6> freeMarkerColumnWidths{};
/** 某信号分组在「自由标记」面板里是否被收起。 */
bool FreeMarkerGroupCollapsed(const SignalRef& ref) const
@@ -137,6 +137,8 @@ namespace jdi
float freeMarkerOpacity = 1.0f;
float freeMarkerScroll = 0.0f;
int freeMarkerSelected = -1;
bool freeMarkerShowDelta = false;
bool freeMarkerShowEnum = false;
std::vector<SignalRef> freeMarkerCollapsedGroups;
};
@@ -182,6 +184,8 @@ namespace jdi
carry.freeMarkerOpacity = lane.freeMarkerOpacity;
carry.freeMarkerScroll = lane.freeMarkerScroll;
carry.freeMarkerSelected = lane.freeMarkerSelected;
carry.freeMarkerShowDelta = lane.freeMarkerShowDelta;
carry.freeMarkerShowEnum = lane.freeMarkerShowEnum;
carry.freeMarkerCollapsedGroups = lane.freeMarkerCollapsedGroups;
for (std::size_t signalIndex = 0; signalIndex < lane.signals.size(); ++signalIndex)
{
@@ -248,6 +252,8 @@ namespace jdi
lane.freeMarkerOpacity = carry.freeMarkerOpacity;
lane.freeMarkerScroll = carry.freeMarkerScroll;
lane.freeMarkerSelected = carry.freeMarkerSelected;
lane.freeMarkerShowDelta = carry.freeMarkerShowDelta;
lane.freeMarkerShowEnum = carry.freeMarkerShowEnum;
lane.freeMarkerCollapsedGroups = carry.freeMarkerCollapsedGroups;
};
+2
View File
@@ -445,6 +445,8 @@ namespace jdi
lane.meanFilterPanel = source.meanFilterPanel;
lane.freeMarker = source.freeMarker;
lane.freeMarkerCursor = source.freeMarkerCursor;
lane.freeMarkerShowDelta = source.freeMarkerShowDelta;
lane.freeMarkerShowEnum = source.freeMarkerShowEnum;
lane.freeMarkerPanel = source.freeMarkerPanel;
lane.freeMarkerOpacity = source.freeMarkerOpacity;
// 拆分后每个子网格只保留自己那个信号的均值滤波 / 中心轴 / 弱峰调整 / 自由标记条目。