界面增强:网格图例 GX 编号、工具栏状态修复、增量括号、实验性边沿计数
- 每个网格图例左侧新增当前网格的 “GX” 编号徽标,与左侧信号列表行末的 G1/G2 徽标
使用完全一致的样式(同宽高、同圆角、同配色、同字体),并纳入图例底板范围。
- 修复工具栏 toggle 状态被重置的缺陷:Toolbar::Layout() 会重建全部按钮,
原先会把 checked 全部清零。因此当「光标」按钮因为模式变化(光标x2 → 光标)
触发文本变更与 Relayout 时,同帧刚设置好的「Y 轴自适应」「选区放大」勾选态被清掉,
表现为切换光标模式时前面两个开关被一并取消。现在 Layout() 会按 action 继承既有
checked 状态,重建后状态保持不变。
- 双光标右侧光标的增量显示去掉逗号,改为包裹在圆括号中:`4.9425 (+0.0008)`。
- 网格右键菜单在分隔横线上方新增「实验性功能」(带二级子菜单指示箭头):
鼠标悬停即向右展开二级菜单,其中包含「边沿计数」切换项(带 √)。
为此为 PopupMenu 增加了完整的二级子菜单支持:子菜单排版(贴主菜单右缘、
右侧空间不足时翻到左侧、限制在宿主窗口内)、悬停展开/移开收起、
点击父项不下发命令、子菜单内按下/抬起配对提交、键盘(← 收起 / → 展开 /
↑↓ 在子菜单内移动 / Enter 提交 / Esc 先收起子菜单再关菜单)、
独立的投影与绘制、ContainsPoint 覆盖子菜单区域、Relayout 后子菜单位置重建。
- 「边沿计数」开启后(按网格独立,状态随 RebuildLanes 按信号继承):
* 在该网格绘制一条横向光标,风格与纵向时间光标一致(同色同线宽),
左右两端各带一个尖端朝内的三角把手。
* 左端显示当前光标的 Y 轴值,读数胶囊纵向居中于横线、靠网格左侧。
* 横向光标不绘制任何数据点取值标注(与纵向光标的行为不同)。
* 横向光标可上下拖动改变幅值,拖动时显示上下箭头光标。
* 生成带 ✕ 关闭按钮的浮动面板:标题栏显示 “GX” 徽标 + “边沿计数”,
下方按信号列出名称(信号色)与「上升沿 N / 下降沿 M」。
面板可在整个绘图区内拖动(限制在绘图区内),✕ 仅收起面板、保留横向光标,
重新勾选菜单项可再次展开。
* 边沿判定阈值为信号幅值的 (min+max)/2 中点穿越,NaN 视为断点;
统计结果按 (文件, 信号) 缓存,数据层变化时随折线缓存一并失效。
验证(TestData/VERY_BIG_DATA.CSV,编码器A/B相密集方波,125%、1725x996):
- 图例编号:G1 / G2 徽标与左侧列表徽标样式一致。
- 工具栏:开启「Y 轴自适应」+「选区放大」后,光标由 光标x2 切回 光标,
两个开关仍保持勾选(截图核对)。
- 增量:右光标显示 `4.9425 (+0.0008)`。
- 二级菜单:悬停「实验性功能」展开「边沿计数」,箭头与子菜单位置正确。
- 边沿计数:横向光标 + 左端读数 `2.54415` + 面板
`G1 边沿计数 / 编码器A相 / 上升沿 1333422 下降沿 1333421`;
上下拖动后横线上移到 4.13602(与 Y 轴刻度一致);面板拖到绘图区左下并保持在内;
点击 ✕ 后面板收起而横向光标保留;
光标形态探测:横线悬停 SIZENS、面板悬停 SIZEALL。
- 合并网格后面板同时列出网格内两条信号(编码器A相 / 编码器B相)。
- 回归:[1].CSV 双光标正常(光标x2),Δt:151ms 200us;
make clean && make all 无警告无错误。
- 修复过程中发现:静态场景缓存命中路径(贴图快路径)与整幅重绘路径是两处独立的
叠加层绘制入口,新增的随鼠标变化内容必须同时加在两边。
This commit is contained in:
1 parent
a566d98bab
commit
cd6e0ed058
8 files changed
+1138
-26
No files matched your search
@@ -27,7 +27,9 @@ namespace jdi
|
||||
SCROLL_LANES, /**< 拖动网格滚动条。 */
|
||||
CURSOR_MOVE, /**< 拖拽时间光标。 */
|
||||
CURSOR_SPAN_MOVE, /**< 拖拽双光标差值标签:两条光标整体平移,间隔不变。 */
|
||||
MOVE_SIGNAL /**< 拖拽信号曲线到其它网格。 */
|
||||
MOVE_SIGNAL, /**< 拖拽信号曲线到其它网格。 */
|
||||
EDGE_MOVE, /**< 拖动「边沿计数」的横向光标(上下移动幅值)。 */
|
||||
EDGE_PANEL_MOVE /**< 拖动边沿计数浮动面板。 */
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -63,7 +65,8 @@ namespace jdi
|
||||
PLOT_CMD_LANE_Y_MIN = 3, /**< 输入该网格 Y 轴最小值。 */
|
||||
PLOT_CMD_FIT_ALL = 4, /**< 全部网格与时间轴自适应。 */
|
||||
PLOT_CMD_LANE_FIT_TIME = 5, /**< 时间轴自适应到本网格信号范围(按网格时间轴展开)。 */
|
||||
PLOT_CMD_LANE_AUTO_VIEW = 6 /**< 切换本网格的「选区 Y 轴自适应」开关。 */
|
||||
PLOT_CMD_LANE_AUTO_VIEW = 6, /**< 切换本网格的「选区 Y 轴自适应」开关。 */
|
||||
PLOT_CMD_LANE_EDGE_COUNT = 7 /**< 切换本网格的「实验性功能 → 边沿计数」开关。 */
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -382,6 +385,28 @@ namespace jdi
|
||||
*/
|
||||
bool SetAllLanesAutoFitToSelection(bool enabled, bool applyNow = true);
|
||||
|
||||
/**
|
||||
* @brief 判断某网格是否开启了「实验性功能 → 边沿计数」(菜单勾选标记)。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 开启返回 true。
|
||||
*/
|
||||
bool LaneEdgeCount(int laneIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 设置某网格的「边沿计数」开关。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @param [IN] enabled 目标状态。
|
||||
* @return 状态发生变化返回 true。
|
||||
*/
|
||||
bool SetLaneEdgeCount(int laneIndex, bool enabled);
|
||||
|
||||
/**
|
||||
* @brief 切换某网格的「边沿计数」开关(开启时自动初始化横向光标位置与面板)。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 切换后的状态。
|
||||
*/
|
||||
bool ToggleLaneEdgeCount(int laneIndex);
|
||||
|
||||
/**
|
||||
* @brief 进入某网格 Y 轴上限/下限的内联输入状态。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
@@ -814,6 +839,46 @@ namespace jdi
|
||||
*/
|
||||
void PaintCursor(gd::Graphics& g, const std::vector<LaneVisual>& lanes);
|
||||
|
||||
/**
|
||||
* @brief 绘制「边沿计数」的横向光标(含两端把手、左侧幅值读数)与统计浮动面板。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] lanes 网格绘制信息集合。
|
||||
*/
|
||||
void PaintEdgeCursor(gd::Graphics& g, const std::vector<LaneVisual>& lanes);
|
||||
|
||||
/**
|
||||
* @brief 判断坐标是否命中某网格的「边沿计数」横向光标线。
|
||||
* @param [IN] x 客户区横坐标。
|
||||
* @param [IN] y 客户区纵坐标。
|
||||
* @param [OUT] laneIndex 命中的网格下标。
|
||||
* @return 命中返回 true。
|
||||
*/
|
||||
bool IsOnEdgeCursorLine(int x, int y, int& laneIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 获取边沿统计面板的矩形(未展开时返回空矩形)。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 面板矩形。
|
||||
*/
|
||||
gd::RectF EdgePanelRect(int laneIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 获取边沿统计面板上关闭按钮的矩形。
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
* @return 关闭按钮矩形。
|
||||
*/
|
||||
gd::RectF EdgePanelCloseRect(int laneIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 统计某信号的上/下边沿数量(以信号幅值中点为判定阈值),结果带缓存。
|
||||
* @param [IN] file 信号所属文件。
|
||||
* @param [IN] signal 目标信号。
|
||||
* @param [OUT] rising 上升沿数量。
|
||||
* @param [OUT] falling 下降沿数量。
|
||||
*/
|
||||
void EdgeCountsFor(const DataFile& file, const SignalData& signal, std::size_t& rising,
|
||||
std::size_t& falling);
|
||||
|
||||
/**
|
||||
* @brief 绘制拖动中的缩放选区。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
@@ -934,6 +999,21 @@ namespace jdi
|
||||
std::vector<gd::RectF> m_cursorLabelRects; /**< 本次绘制已占用的取值标注矩形(用于避让重叠)。 */
|
||||
std::vector<LaneVisual> m_lanes; /**< 当前网格绘制信息集合。 */
|
||||
|
||||
/** 边沿统计结果缓存项(按「文件指针 + 信号指针」标识,数据变化时整体失效)。 */
|
||||
struct EdgeCountEntry
|
||||
{
|
||||
const DataFile* file = nullptr;
|
||||
const SignalData* signal = nullptr;
|
||||
std::size_t rising = 0;
|
||||
std::size_t falling = 0;
|
||||
};
|
||||
std::vector<EdgeCountEntry> m_edgeCountCache; /**< 边沿统计缓存。 */
|
||||
|
||||
// 「边沿计数」横向光标 / 面板的拖拽状态。
|
||||
int m_edgeDragLane = -1; /**< 正在拖动的横向光标所属网格。 */
|
||||
int m_edgePanelDragLane = -1; /**< 正在拖动的统计面板所属网格。 */
|
||||
gd::PointF m_edgePanelDragOffset; /**< 抓取面板时的相对偏移(保持不跳变)。 */
|
||||
|
||||
/**
|
||||
* @brief 图例条目的命中信息(用于点选与双击改名)。
|
||||
*/
|
||||
|
||||
Reference in new issue
Block a user