交互细节修复:悬停提示锚定、选区放大提示生命周期、光标样式统一与差值标签
- 信号悬停提示改为"锚定在首次出现位置":新增 m_hoverAnchorX/Y, PaintSignalInteraction 用锚点而非当前鼠标位置;同时补回 OnMouseMove 里 漏写的 m_hoverSignal 赋值(该行缺失会导致悬停提示完全不显示)。 - 选区放大(RUBBER_SELECT)的提示文字按阶段切换: 开启开关 -> 「横向或纵向拖动以放大选择区域,ESC退出选区模式」; 左键按下不显示提示;开始拖动后维持「右键取消选区,ESC退出选区模式」; 松开左键后淡出。新增 SetHintSticky/ReleaseHint(m_hintSticky 期间阻塞淡出), HintNeedsAnimation() 驱动宿主的淡出定时器。 - 两个时间光标统一为同一颜色与样式(去掉 theme.cursorAlt,仅保留 theme.cursor); 光标把手统一为同一形状。工具栏按钮文案动态化: 未选中「光标」/ 单光标「光标x1」/ 双光标「光标x2」 (Toolbar::SetActionLabel 返回是否变化,变化时 Application::Relayout() 以重算按钮宽度)。 - 取值胶囊避让重叠:PaintCursor 先把两条时间读数标签与 Δt 标签的矩形预填进 m_cursorLabelRects,取值标签逐条检测重叠并向下/向上让位, 多信号数据点重合或过近时读数不再互相覆盖。 两光标靠近时,光标 2 的时间读数标签自动上移一层叠放,避免互相覆盖。 - 双光标时间读数与 Δt 差值标签支持拖拽,并区分悬停与拖拽: 悬停显示手形(IDC_HAND),拖拽统一使用抓握图标(IDC_SIZEALL, 用 m_dragOnLabel 与"直接在光标线上抓取"的左右箭头区分); Δt 标签拖拽时两条光标整体平移,差值保持不变。 - Δt 差值显示样式与光标时间读数一致,文案为「Δt <时间差值>」,单位复合化: >= 60s 一路整合到 h/min/s(3662s -> 「1h 1min 2s」);1~60s 显示整秒, 非整数时补 ms(5.06s -> 「5s 60ms」,5s -> 「5s」);< 1s 逐级降到 ms/us/ns/ps 且只降一级,顶级单位为 ps 时不再降级并保留小数(「5.123 ps」)。 - 双击 Δt 进入编辑时数值量级始终为秒(例如显示 1min 时编辑框为 60.0), 修正进入高级单位后(如 1.5min)编辑框只显示 1.5 的问题。 验证(使用 TestData/VERY_BIG_DATA.CSV,1.77GB / 5 信号): - 悬停提示停留在首次出现位置,网格内继续移动鼠标不再跟随。 - 选区放大提示:开启/按下/拖动/松开四个阶段的文案与淡出均符合预期。 - 工具栏文案 光标 / 光标x1 / 光标x2 正常;两光标样式与颜色完全一致。 - 5 条信号合并网格时取值标签全部完整可见,无覆盖。 - 光标形态探测:时间读数标签与 Δt 标签悬停 HAND、拖拽 SIZEALL; 直接在光标线上拖拽仍为 SIZEWE。 - Δt 分别输入 3662 / 5.06 / 5.123e-12 秒得到「Δt 1h 1min 2s」/ 「Δt 5s 60ms」/「Δt 5.11591 ps」;整数秒显示「Δt 5s」。 - 双击 Δt(显示 15s 457.214ms)编辑框内容为 15.4572(秒)。 - Δt 标签拖拽 (-320px):光标 64.4051/79.8623 -> 30.743/46.2002,差值保持 15.4572。 - 两光标靠近时时间读数标签上下叠放、Δt 标签落位正确,取值标签不重叠。 - [1].CSV 回归正常;make clean && make all 无警告无错误。
This commit is contained in:
1 parent
eaf5b9cadf
commit
ed13aa7d49
7 files changed
+583
-84
No files matched your search
@@ -709,6 +709,37 @@ namespace jdi
|
||||
*/
|
||||
void SetHint(const std::wstring& text);
|
||||
|
||||
/**
|
||||
* @brief 设置一条"粘滞"提示:直到 `ReleaseHint()` 为止不会淡出。
|
||||
*
|
||||
* 用于"拖动过程中维持显示"的场景(例如选区拖拽时的右键/ESC 说明)。
|
||||
*
|
||||
* @param [IN] text 提示文本。
|
||||
*/
|
||||
void SetHintSticky(const std::wstring& text);
|
||||
|
||||
/**
|
||||
* @brief 结束粘滞状态,并从这里开始重新计时(停留后淡出)。
|
||||
*/
|
||||
void ReleaseHint();
|
||||
|
||||
/**
|
||||
* @brief 判断坐标是否落在某条光标的**时间读数标签**上。
|
||||
* @param [IN] x 客户区横坐标。
|
||||
* @param [IN] y 客户区纵坐标。
|
||||
* @param [OUT] which 命中的光标序号(1 或 2),未命中时为 0。
|
||||
* @return 命中返回 true。
|
||||
*/
|
||||
bool IsOnCursorTimeLabel(int x, int y, int& which) const;
|
||||
|
||||
/**
|
||||
* @brief 判断坐标是否落在双光标差值标签上。
|
||||
* @param [IN] x 客户区横坐标。
|
||||
* @param [IN] y 客户区纵坐标。
|
||||
* @return 命中返回 true。
|
||||
*/
|
||||
bool IsOnCursorSpanLabel(int x, int y) const;
|
||||
|
||||
/**
|
||||
* @brief 画文字时给底色胶囊加一层与文字反色的细描边,提升与背景/曲线的对比度。
|
||||
* @param [IN] rect 胶囊矩形。
|
||||
@@ -879,10 +910,11 @@ namespace jdi
|
||||
int m_hoverCursor = 0; /**< 悬停/拖拽中的光标序号(1 或 2,0 表示无)。 */
|
||||
int m_activeCursor = 1; /**< 最近操作过的光标:内容重叠时它绘制在上层。 */
|
||||
int m_editCursor = 1; /**< 内联输入所作用的 Time 光标序号。 */
|
||||
double m_editDurationUnit = 1.0; /**< 差值编辑时采用的显示单位(秒)。 */
|
||||
int m_spanDragStartX = 0; /**< 差值标签拖拽起点横坐标。 */
|
||||
double m_spanDragTime1 = 0.0; /**< 差值标签拖拽起始时两条光标的时间。 */
|
||||
double m_spanDragTime2 = 0.0;
|
||||
bool m_dragOnLabel = false; /**< 本次光标拖拽是从时间/差值标签上抓起的(用抓握光标)。 */
|
||||
int m_cursorGrabOffset = 0; /**< 从光标时间标签上抓起时的横向偏移(像素)。 */
|
||||
PlotEditTarget m_editTarget = PlotEditTarget::NONE; /**< 当前内联输入目标。 */
|
||||
TextEdit m_edit; /**< 输入框编辑模型(光标/选区/剪贴板)。 */
|
||||
int m_editLane = -1; /**< 内联输入所作用的网格下标。 */
|
||||
@@ -895,9 +927,14 @@ namespace jdi
|
||||
int m_hoverLane = -1; /**< 当前悬停网格下标。 */
|
||||
int m_mouseX = 0; /**< 最近一次鼠标横坐标(用于悬停提示定位)。 */
|
||||
int m_mouseY = 0; /**< 最近一次鼠标纵坐标(用于悬停提示定位)。 */
|
||||
int m_hoverAnchorX = 0; /**< 信号悬停提示的锚点横坐标(首次进入可拖拽区域时确定,不随鼠标移动)。 */
|
||||
int m_hoverAnchorY = 0; /**< 信号悬停提示的锚点纵坐标。 */
|
||||
bool m_spanHover = false; /**< 鼠标是否悬停在双光标差值标签上。 */
|
||||
std::wstring m_hintText; /**< 临时提示文本(空表示不显示)。 */
|
||||
std::uint64_t m_hintShownAt = 0; /**< 提示出现的时刻(毫秒,GetTickCount64)。 */
|
||||
bool m_hintSticky = false; /**< 提示是否处于粘滞状态(拖动期间维持显示,不淡出)。 */
|
||||
gd::RectF m_cursorSpanRect; /**< 最近一次绘制时差值标签的矩形(用于命中拖拽/双击)。 */
|
||||
std::vector<gd::RectF> m_cursorLabelRects; /**< 本次绘制已占用的取值标注矩形(用于避让重叠)。 */
|
||||
std::vector<LaneVisual> m_lanes; /**< 当前网格绘制信息集合。 */
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user