自由标记改进:默认不启用光标模式 + 面板四列对齐 + 光标模式切换按钮
用户需求(逐条落地): 1) 默认不启用网格私有光标,只有鼠标处于信号上方时才显示数据点数值;命中 「自动点线」稀疏判据的信号,只有靠近数据点时才有数值显示; 2) 有数值预览时左键单击固定该数据点(固定点样式不变:半透明纵向细线);鼠标 下方没有信号曲线时,按下/拖动就是普通的平移视界(选区放大模式下照旧框选); 3) 浮动面板最下方新增切换按钮「启用光标模式」↔「关闭光标模式」;启用后与最初 实现一致(跟随鼠标的纵向自由光标),并修掉「光标模式下拖不动浮动面板」; 鼠标处于浮动面板上时网格不画自由光标,面板上的操作不穿透到网格; 4) 面板只列出确实有固定点的信号(否则该信号名条目不出现); 5) 每个信息元素纵向对齐:取值 / 增量 / 时刻 / 间隔各自一列。 数据层 - Lane 新增 bool freeMarkerCursor(默认 false,功能总开关仍是 freeMarker); LaneCarry 同步携带。 - PlotView 新增 SetLaneFreeMarkerCursor / LaneFreeMarkerCursor / ToggleLaneFreeMarkerCursor,切换时立即作废属于该网格的探针。 探针与绘制 - FreeMarkerProbe 新增 cursorMode。 - 非光标模式:稀疏判据成立但吸附失败 ⇒ 跳过该信号;其余要求鼠标与曲线纵向距离 在 kFreeMarkerHoverTolerance(8 逻辑像素)以内;都不满足 ⇒ 探针无效 ⇒ 按下即 普通平移/框选,不会误固定数据点。 - 光标模式:与之前实现一致(网格内始终有效)。 - PaintFreeMarker:纵向线 + 上下把手只在光标模式绘制;取值胶囊/数据点/吸附圆环 两种模式都画。 浮动面板 - 底部新增「启用光标模式 / 关闭光标模式」切换按钮(layout.button),手型光标 + 悬停高亮,PanelSlotKey 混入 freeMarkerCursor。 - 只给有固定点的信号发名称行(高度分支与矩形分支同步跳过空信号)。 - 四列固定横坐标(EdgePanelLayout::markerColumns:取值 / 增量 / 时刻 / 间隔), 面板宽度 340 → 415(= 4 列 + 间隙 + 行 ✕ + 两侧内边距);绘制一律左对齐 + 省略号截断,双击分行改按列边界判断(不再用 xxxRight - 40*scale 反推)。 修复的缺陷(用户报告) - 「光标模式下拖不动浮动面板」的真因不是命中判定,而是 OnMouseMove 的 EDGE_PANEL_MOVE 分支里 switch (m_edgePanelDragKind) 漏了 MARK:拖动坐标被写进 lane.edgePanel,而布局从 lane.freeMarkerPanel 读 ⇒ 面板纹丝不动。已补 case。 - 鼠标压在浮动面板上时:OnMouseMove 先 TopPanelAtPoint,命中即清空探针并跳过固定 点 ✕ 的悬停判定;OnLButtonDown 的自由标记分支增加 freeOverPanel 守卫, 确保面板操作不穿透到网格(也不再绘制穿过面板的自由光标)。 验证(全程离屏,不占用鼠标/键盘/屏幕) - .preflight/markcheck 重写并扩到 61/61:默认无光标、贴近曲线才有效、远离曲线单击 不固定且拖动仍是平移、四列几何对齐、按钮切换光标模式、光标模式下拖动面板确实 移动、面板上不画光标、选区放大共存、Δt 编辑重排、两处 ✕、空信号不出行、深度 放大吸附、视界外固定点不绘制。 - 回归:editcheck 20/20、round3check 31/31、round4check 34/34、round5check 5/5、 convcheck 18/18、check 136/137(唯一失败项是此前就存在的不稳定断言)、真实 MF4-Record.MF4 仍 283 条信号。 - make release / make debug 零警告;Build/Release/Target.exe 834,560 字节。 - 同步更新 Documents/agent_mem.md(§11.2 第 189–193 条 + 文末本轮章节)。
This commit is contained in:
1 parent
dd8f63aa0e
commit
067128f46c
8 files changed
+412
-86
No files matched your search
@@ -5,6 +5,7 @@
|
||||
#include <objidl.h>
|
||||
#include <gdiplus.h>
|
||||
|
||||
#include <array>
|
||||
#include <atomic>
|
||||
#include <condition_variable>
|
||||
#include <deque>
|
||||
@@ -941,6 +942,33 @@ namespace jdi
|
||||
*/
|
||||
bool ToggleLaneFreeMarker(int laneIndex);
|
||||
|
||||
/**
|
||||
* @brief 设置某网格「自由标记」的**光标模式**(浮动面板最下方的切换按钮)。
|
||||
*
|
||||
* 关闭(默认)时鼠标必须贴近信号曲线(稀疏判定下需靠近数据点)才显示取值预览,
|
||||
* 鼠标下方没有曲线时按下即普通的平移/框选;开启时与最初实现一致 ——
|
||||
* 网格内始终跟随鼠标画一条纵向光标。
|
||||
*
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @param [IN] enabled 是否启用光标模式。
|
||||
* @return 状态发生变化返回 true。
|
||||
*/
|
||||
bool SetLaneFreeMarkerCursor(int laneIndex, bool enabled);
|
||||
|
||||
/**
|
||||
* @brief 查询某网格是否处于「自由标记」的光标模式。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 启用返回 true(该网格未开启自由标记时恒为 false)。
|
||||
*/
|
||||
bool LaneFreeMarkerCursor(int laneIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 切换某网格「自由标记」的光标模式。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 切换后的状态。
|
||||
*/
|
||||
bool ToggleLaneFreeMarkerCursor(int laneIndex);
|
||||
|
||||
/**
|
||||
* @brief 直接把文本解析为网格 Y 轴上限/下限并应用(供菜单内联输入框提交使用)。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
@@ -1639,12 +1667,26 @@ namespace jdi
|
||||
*/
|
||||
std::vector<gd::RectF> rowNameRects;
|
||||
/**
|
||||
* @brief 「自由标记」时间列的两条右边界(`t:` 列与 `Δt:` 列)。
|
||||
* @brief 「自由标记」面板的四列文本区(① 取值 ② 增量 ③ 时刻 ④ 间隔)。
|
||||
*
|
||||
* 两列各自右对齐 ⇒ 所有条目上下对齐;首项没有 `Δt` 时该列留白。
|
||||
* 每行都在这四列的**同一横坐标**上左对齐输出,因此同一信息在纵向上严格对齐
|
||||
*(用户 2026-10-20 明确要求:"将每个信息元素纵向对齐")。
|
||||
* 列宽固定(不按文本测量),绘制时用 `UiEllipsize` 截断,避免布局期查询采样。
|
||||
*/
|
||||
float markerTimeRight = 0.0f;
|
||||
float markerDeltaRight = 0.0f;
|
||||
struct MarkerColumn
|
||||
{
|
||||
float left = 0.0f;
|
||||
float width = 0.0f;
|
||||
};
|
||||
std::array<MarkerColumn, 4> markerColumns{};
|
||||
/** 四列的语义下标(`markerColumns` 的索引)。 */
|
||||
enum MarkerColumnIndex
|
||||
{
|
||||
MARKER_COL_VALUE = 0,
|
||||
MARKER_COL_DELTA = 1,
|
||||
MARKER_COL_TIME = 2,
|
||||
MARKER_COL_DT = 3
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1660,10 +1702,16 @@ namespace jdi
|
||||
*
|
||||
* 它描述「鼠标此刻所在的、开启了自由标记的网格」里应当标注的那个数据点:
|
||||
* 该网格内所有可见信号中**离鼠标最近**的那一个。
|
||||
*
|
||||
* 两种模式由 `Lane::freeMarkerCursor` 决定:
|
||||
* * **默认(非光标模式)**:只有鼠标**贴近某条信号曲线**(或该信号命中「自动点线」
|
||||
* 稀疏判定、且鼠标靠近某个数据点)时才有结果(`valid == true`),也**不画**纵向光标;
|
||||
* * **光标模式**:网格内始终 `valid == true`(画纵向光标),能取到数据点时再标注取值。
|
||||
*/
|
||||
struct FreeMarkerProbe
|
||||
{
|
||||
bool valid = false; /**< 鼠标是否落在某个开启了自由标记的网格内。 */
|
||||
bool valid = false; /**< 是否有结果(`ref` 有效,或光标模式下恒真)。 */
|
||||
bool cursorMode = false; /**< 该网格是否处于「光标模式」(决定是否画纵向光标)。 */
|
||||
int laneIndex = -1; /**< 该网格下标。 */
|
||||
double time = 0.0; /**< 标注时刻(显示时刻;吸附时 = 采样时刻)。 */
|
||||
float x = 0.0f; /**< 该时刻的屏幕横坐标。 */
|
||||
|
||||
Reference in new issue
Block a user