fix: 修复网格滚动溢出并重构绘图区缩放与时间光标交互

网格滚动:
- 修复纵向滚动时波形与文字溢出到工具栏/时间轴的问题:网格内容裁剪改为与绘图区求交,
  并对网格内的图例、幅值标签与读数框增加显式可见性判定
  (GDI 文本不遵循 GDI+ 裁剪区,仅裁剪矢量绘制不足以阻止溢出)。
- 网格之间改为完整矩形描边并加大间距,边界清晰;时间轴固定预留高度,不再被网格挤压。
- 时间轴刻度标签夹在绘图区横向范围内,避免与左侧时间列名重叠。

缩放交互:
- 取消滚轮缩放:滚轮改为纵向滚动网格,Shift+滚轮水平平移。
- 新增「时间轴缩放」「Y 轴缩放」工具栏切换按钮:选中后在绘图区拖拽选区放大对应轴向,
  拖动过程显示选区与跨度提示(时间用强调色、Y 轴用警示色);再次点击退出该模式。
- 「适应视图」回到初始状态:恢复自适应范围并退出缩放模式。
- 移除右键框选缩放,避免与模式化缩放重复。

时间光标:
- 改为工具栏「光标」按钮切换;启用时置于当前视图中心,再次点击关闭(Esc 亦可关闭)。
- 光标由鼠标靠近后拖拽移动,不再跟随鼠标;纵向贯穿全部网格并延伸到时间轴底部,
  顶部带三角把手提示可拖拽。
- 具体时间读数移至绘图区顶部,仅在鼠标覆盖光标时显示,不再遮挡时间轴刻度尺。
- 双击光标进入精确时间输入,交互与线宽输入一致:整段高亮、首次键入即整体覆盖、
  回车提交、Esc 取消、点击框外提交。
- 光标形态按模式区分:默认与悬停线外为箭头(不再出现十字指针),
  时间轴缩放/光标为水平双向箭头,Y 轴缩放为垂直双向箭头。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-09-29 19:32:37 +08:00
1 parent cba62c8218
commit 17eb03a1b3
6 files changed
+852 -359

No files matched your search

+20 -10
View File
@@ -21,6 +21,16 @@ namespace jdi
LINE_SCATTER = 2 /**< 同时绘制插值直线与采样点散点。 */
};
/**
* @brief 绘图区拖拽缩放模式(由工具栏按钮切换)。
*/
enum class PlotZoomMode : int
{
NONE = 0, /**< 常规模式:拖拽平移时间轴,光标为箭头。 */
TIME = 1, /**< 时间轴缩放:在绘图区拖拽竖向选区,放大时间范围。 */
VALUE = 2 /**< Y 轴缩放:在某个网格内拖拽横向选区,放大该网格幅值范围。 */
};
/**
* @brief 将绘制方式转换为中文显示名称。
* @param [IN] mode 绘制方式。
@@ -446,18 +456,18 @@ namespace jdi
bool& ViewInitialized() { return m_viewInitialized; }
/// @brief 网格纵向滚动偏移量(可读写)。
float& LaneScroll() { return m_laneScroll; }
/// @brief 时间光标是否可见(可读写)。
bool& CursorVisible() { return m_cursorVisible; }
/// @brief 时间光标是否可见(只读)。
bool CursorVisible() const { return m_cursorVisible; }
/// @brief 时间光标是否已固定(可读写)。
bool& CursorPinned() { return m_cursorPinned; }
/// @brief 时间光标是否已固定(只读)。
bool CursorPinned() const { return m_cursorPinned; }
/// @brief 时间光标是否启用(可读写)。
bool& CursorEnabled() { return m_cursorEnabled; }
/// @brief 时间光标是否启用(只读)。
bool CursorEnabled() const { return m_cursorEnabled; }
/// @brief 时间光标位置(可读写)。
double& CursorTime() { return m_cursorTime; }
/// @brief 时间光标位置(只读)。
double CursorTime() const { return m_cursorTime; }
/// @brief 绘图区拖拽缩放模式(可读写)。
PlotZoomMode& ZoomMode() { return m_zoomMode; }
/// @brief 绘图区拖拽缩放模式(只读)。
PlotZoomMode ZoomMode() const { return m_zoomMode; }
private:
/**
@@ -478,9 +488,9 @@ namespace jdi
double m_viewMax = 1.0; /**< 视图右边界时间。 */
bool m_viewInitialized = false; /**< 视图范围是否已初始化。 */
float m_laneScroll = 0.0f; /**< 网格纵向滚动偏移量。 */
bool m_cursorVisible = false; /**< 时间光标是否可见。 */
bool m_cursorPinned = false; /**< 时间光标是否已固定。 */
bool m_cursorEnabled = false; /**< 时间光标是否启用(由工具栏按钮切换)。 */
double m_cursorTime = 0.0; /**< 时间光标位置。 */
PlotZoomMode m_zoomMode = PlotZoomMode::NONE; /**< 绘图区拖拽缩放模式。 */
};
} // namespace jdi