目录规范化(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:
1 parent
79eebc281e
commit
affb9cc340
12 files changed
+561
-187
No files matched your search
@@ -945,32 +945,60 @@ namespace jdi
|
||||
bool ToggleLaneFreeMarker(int laneIndex);
|
||||
|
||||
/**
|
||||
* @brief 设置某网格「自由标记」的**光标模式**(浮动面板最下方的切换按钮)。
|
||||
* @brief 设置某网格是否处于「自由标记点选取」(浮动面板底部的切换按钮)。
|
||||
*
|
||||
* 关闭(默认)时鼠标必须贴近信号曲线(稀疏判定下需靠近数据点)才显示取值预览,
|
||||
* 鼠标下方没有曲线时按下即普通的平移/框选;开启时与最初实现一致 ——
|
||||
* 网格内始终跟随鼠标画一条纵向光标。
|
||||
* 关闭(默认)= **普通鼠标**:不预览数据点、不画纵向光标、单击不固定任何点,
|
||||
* 按下/拖动/单击完全是常规语义(平移 / 框选 / 拖信号)。
|
||||
* 开启时网格内始终跟随鼠标画一条纵向光标,并在贴近曲线时预览/固定数据点。
|
||||
*
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @param [IN] enabled 是否启用光标模式。
|
||||
* @param [IN] enabled 是否启用「自由标记点选取」。
|
||||
* @return 状态发生变化返回 true。
|
||||
*/
|
||||
bool SetLaneFreeMarkerCursor(int laneIndex, bool enabled);
|
||||
|
||||
/**
|
||||
* @brief 查询某网格是否处于「自由标记」的光标模式。
|
||||
* @brief 查询某网格是否开启了「自由标记点选取」。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 启用返回 true(该网格未开启自由标记时恒为 false)。
|
||||
*/
|
||||
bool LaneFreeMarkerCursor(int laneIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 切换某网格「自由标记」的光标模式。
|
||||
* @brief 切换某网格的「自由标记点选取」。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 切换后的状态。
|
||||
*/
|
||||
bool ToggleLaneFreeMarkerCursor(int laneIndex);
|
||||
|
||||
/**
|
||||
* @brief 设置某个网格「自由标记」固定点显示是否附带**括号内增量**。
|
||||
*
|
||||
* 只影响已固定点的取值胶囊(面板的「显示增量」开关),
|
||||
* 不影响跟随鼠标的预览胶囊与统计列。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @param [IN] enabled 是否显示增量。
|
||||
* @return 状态发生变化返回 true。
|
||||
*/
|
||||
bool SetLaneFreeMarkerShowDelta(int laneIndex, bool enabled);
|
||||
|
||||
/**
|
||||
* @brief 设置某个网格「自由标记」固定点显示是否附带**枚举文本**。
|
||||
*
|
||||
* 只影响已固定点的取值胶囊(面板的「显示枚举文本」开关),
|
||||
* 不影响跟随鼠标的预览胶囊与统计列。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @param [IN] enabled 是否显示枚举文本。
|
||||
* @return 状态发生变化返回 true。
|
||||
*/
|
||||
bool SetLaneFreeMarkerShowEnum(int laneIndex, bool enabled);
|
||||
|
||||
/** 查询某网格固定点是否显示增量。 */
|
||||
bool LaneFreeMarkerShowDelta(int laneIndex) const;
|
||||
|
||||
/** 查询某网格固定点是否显示枚举文本。 */
|
||||
bool LaneFreeMarkerShowEnum(int laneIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 设置某网格「自由标记」固定点的**显示不透明度**(0–1)。
|
||||
*
|
||||
@@ -1710,6 +1738,12 @@ namespace jdi
|
||||
struct MarkerRow
|
||||
{
|
||||
std::size_t itemIndex = 0;
|
||||
/**
|
||||
* @brief 该固定点在**本分组内**的序号(从 1 开始,组内按时间升序)。
|
||||
*
|
||||
* 面板最左侧「序号」列直接显示它;按分组重置(每组 = 一个信号)。
|
||||
*/
|
||||
std::size_t serial = 0;
|
||||
gd::RectF rect;
|
||||
gd::RectF close;
|
||||
};
|
||||
@@ -1758,8 +1792,17 @@ namespace jdi
|
||||
float markerContentHeight = 0.0f;
|
||||
gd::RectF scrollTrack; /**< 内容区右侧的滚动条轨道(不需要滚动时为空矩形)。 */
|
||||
gd::RectF scrollThumb; /**< 滚动条滑块。 */
|
||||
gd::RectF opacityTrack; /**< 「标记透明度」滑动条轨道(仅光标模式激活时非空)。 */
|
||||
gd::RectF opacityTrack; /**< 「标记透明度」滑动条轨道(总是显示,与选取模式无关)。 */
|
||||
gd::RectF opacityValue; /**< 「标记透明度」数值文本矩形。 */
|
||||
/**
|
||||
* @brief 「显示增量」开关按钮(位于「自由标记点选取」下方那一行的左半)。
|
||||
*
|
||||
* 它只控制**已固定点**的取值胶囊是否附带括号内增量,
|
||||
* 不影响跟随鼠标的预览胶囊,也不影响下面的统计列。
|
||||
*/
|
||||
gd::RectF showDelta;
|
||||
/** @brief 「显示枚举文本」开关按钮(同一行的右半)。 */
|
||||
gd::RectF showEnum;
|
||||
/**
|
||||
* @brief 「自由标记」:每个信号名右侧的「清除该信号全部固定点」✕。
|
||||
*
|
||||
@@ -1773,29 +1816,31 @@ namespace jdi
|
||||
*/
|
||||
std::vector<gd::RectF> rowNameRects;
|
||||
/**
|
||||
* @brief 「自由标记」面板的五列文本区
|
||||
* (① 取值 ② 枚举文本 ③ 增量 ④ 时刻 ⑤ 间隔)。
|
||||
* @brief 「自由标记」面板的**六列**文本区
|
||||
* (① 序号 ② 标记值 ③ 枚举文本 ④ 增量 ⑤ 时间点 ⑥ 时间间隔)。
|
||||
*
|
||||
* 每行都在这五列的**同一横坐标**上左对齐输出,因此同一信息在纵向上严格对齐。
|
||||
* 列宽固定(不按文本测量),绘制时用 `UiEllipsize` 截断,避免布局期查询采样。
|
||||
* 当整个面板里没有任何枚举文本时,② 枚举列的宽度为 0(整列缺省)。
|
||||
* 每行都在这六列的**同一横坐标**上左对齐输出,因此同一信息在纵向上严格对齐;
|
||||
* 相邻列之间画一条竖线作为分隔。
|
||||
* 列宽取「缺省下限」「实测内容宽度」「列标题宽度」三者的较大者;
|
||||
* 当整个面板里没有任何枚举文本时,③ 枚举列的宽度为 0(整列缺省)。
|
||||
*/
|
||||
struct MarkerColumn
|
||||
{
|
||||
float left = 0.0f;
|
||||
float width = 0.0f;
|
||||
};
|
||||
std::array<MarkerColumn, 5> markerColumns{};
|
||||
/** 面板里是否存在枚举文本(为 false 时 ② 列整列缺省)。 */
|
||||
std::array<MarkerColumn, 6> markerColumns{};
|
||||
/** 面板里是否存在枚举文本(为 false 时 ③ 列整列缺省)。 */
|
||||
bool markerHasEnumColumn = false;
|
||||
/** 五列的语义下标(`markerColumns` 的索引)。 */
|
||||
/** 六列的语义下标(`markerColumns` 的索引)。 */
|
||||
enum MarkerColumnIndex
|
||||
{
|
||||
MARKER_COL_VALUE = 0,
|
||||
MARKER_COL_ENUM = 1,
|
||||
MARKER_COL_DELTA = 2,
|
||||
MARKER_COL_TIME = 3,
|
||||
MARKER_COL_DT = 4
|
||||
MARKER_COL_SERIAL = 0,
|
||||
MARKER_COL_VALUE = 1,
|
||||
MARKER_COL_ENUM = 2,
|
||||
MARKER_COL_DELTA = 3,
|
||||
MARKER_COL_TIME = 4,
|
||||
MARKER_COL_DT = 5
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1813,19 +1858,19 @@ namespace jdi
|
||||
* 它描述「鼠标此刻所在的、开启了自由标记的网格」里应当标注的那个数据点:
|
||||
* 该网格内所有可见信号中**离鼠标最近**的那一个。
|
||||
*
|
||||
* 两种模式由 `Lane::freeMarkerCursor` 决定:
|
||||
* * **默认(非光标模式)**:只有鼠标**贴近某条信号曲线**时才有结果(`valid == true`),
|
||||
* 也**不画**纵向光标。⚠️ 判据 = 鼠标到**画出来的折线**的垂直距离 ≤
|
||||
* `kSignalHitTolerance`(与「常规状态下触发信号曲线高亮」**完全同一范围**;
|
||||
* 因此阶跃的竖直跳变段也能探测到)。判定通过后,标注时刻会被吸附到最近的**采样时刻**
|
||||
* (固定点必须落在真实数据点上);
|
||||
* * **光标模式**:网格内始终 `valid == true`(画纵向光标),能取到数据点时再标注取值
|
||||
* (此时只有命中「自动点线」稀疏判据的信号才吸附)。
|
||||
* 两种情形由 `Lane::freeMarkerCursor` 决定:
|
||||
* * **未开启「自由标记点选取」**:**没有结果**(`valid == false`)—— 鼠标就是普通鼠标,
|
||||
* 不预览数据点、不画纵向光标、单击也不固定任何点(用户 2026-10-23 要求);
|
||||
* * **已开启「自由标记点选取」**:网格内始终 `valid == true`(画纵向光标),但只有鼠标
|
||||
* **贴近某条信号曲线**时才有可固定的数据点(`ref` 有效)。⚠️ 判据 = 鼠标到**画出来的折线**
|
||||
* 的垂直距离 ≤ `kSignalHitTolerance`(与「常规状态下触发信号曲线高亮」**完全同一范围**;
|
||||
* 因此阶跃的竖直跳变段也能探测到)。命中后标注时刻会被吸附到最近的**采样时刻**
|
||||
* (固定点必须落在真实数据点上),但“已吸附”圆环只在命中「自动点线」稀疏判据时画。
|
||||
*/
|
||||
struct FreeMarkerProbe
|
||||
{
|
||||
bool valid = false; /**< 是否有结果(`ref` 有效,或光标模式下恒真)。 */
|
||||
bool cursorMode = false; /**< 该网格是否处于「光标模式」(决定是否画纵向光标)。 */
|
||||
bool valid = false; /**< 是否有结果(开启选取模式后恒真;`ref` 才是可固定的数据点)。 */
|
||||
bool cursorMode = false; /**< 该网格是否处于「自由标记点选取」(决定是否画纵向光标)。 */
|
||||
int laneIndex = -1; /**< 该网格下标。 */
|
||||
double time = 0.0; /**< 标注时刻(显示时刻;吸附时 = 采样时刻)。 */
|
||||
float x = 0.0f; /**< 该时刻的屏幕横坐标。 */
|
||||
@@ -1851,13 +1896,6 @@ namespace jdi
|
||||
*/
|
||||
void PaintFreeMarker(gd::Graphics& g, const std::vector<LaneVisual>& lanes);
|
||||
|
||||
/**
|
||||
* @brief 在鼠标附近画一个小提示气泡(与面板 GX 徽标的提示同一套样式)。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] text 提示文本(空串则不绘制)。
|
||||
*/
|
||||
void PaintFreeMarkerTooltip(gd::Graphics& g, const std::wstring& text);
|
||||
|
||||
/** @brief 一个固定点 ✕ 的命中矩形(绘制时重建,命中测试时读取)。 */
|
||||
struct FreeMarkerHit
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user