网格滚动: - 修复纵向滚动时波形与文字溢出到工具栏/时间轴的问题:网格内容裁剪改为与绘图区求交, 并对网格内的图例、幅值标签与读数框增加显式可见性判定 (GDI 文本不遵循 GDI+ 裁剪区,仅裁剪矢量绘制不足以阻止溢出)。 - 网格之间改为完整矩形描边并加大间距,边界清晰;时间轴固定预留高度,不再被网格挤压。 - 时间轴刻度标签夹在绘图区横向范围内,避免与左侧时间列名重叠。 缩放交互: - 取消滚轮缩放:滚轮改为纵向滚动网格,Shift+滚轮水平平移。 - 新增「时间轴缩放」「Y 轴缩放」工具栏切换按钮:选中后在绘图区拖拽选区放大对应轴向, 拖动过程显示选区与跨度提示(时间用强调色、Y 轴用警示色);再次点击退出该模式。 - 「适应视图」回到初始状态:恢复自适应范围并退出缩放模式。 - 移除右键框选缩放,避免与模式化缩放重复。 时间光标: - 改为工具栏「光标」按钮切换;启用时置于当前视图中心,再次点击关闭(Esc 亦可关闭)。 - 光标由鼠标靠近后拖拽移动,不再跟随鼠标;纵向贯穿全部网格并延伸到时间轴底部, 顶部带三角把手提示可拖拽。 - 具体时间读数移至绘图区顶部,仅在鼠标覆盖光标时显示,不再遮挡时间轴刻度尺。 - 双击光标进入精确时间输入,交互与线宽输入一致:整段高亮、首次键入即整体覆盖、 回车提交、Esc 取消、点击框外提交。 - 光标形态按模式区分:默认与悬停线外为箭头(不再出现十字指针), 时间轴缩放/光标为水平双向箭头,Y 轴缩放为垂直双向箭头。
169 lines
5.0 KiB
C++
169 lines
5.0 KiB
C++
#ifndef __TOOLBAR_HPP__
|
|
#define __TOOLBAR_HPP__
|
|
|
|
#include <windows.h>
|
|
#include <objidl.h>
|
|
#include <gdiplus.h>
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "PaintUtil.hpp"
|
|
#include "Theme.hpp"
|
|
|
|
namespace jdi
|
|
{
|
|
|
|
/**
|
|
* @brief 工具栏按钮触发的动作。
|
|
*/
|
|
enum class ToolbarAction : int
|
|
{
|
|
NONE = 0, /**< 未触发任何动作。 */
|
|
OPEN_FILE, /**< 打开 CSV 文件。 */
|
|
FIT_ALL, /**< 视图自适应到可见信号范围(同时退出缩放模式)。 */
|
|
ZOOM_TIME, /**< 切换「在时间轴缩放」模式。 */
|
|
ZOOM_VALUE, /**< 切换「在 Y 轴缩放」模式。 */
|
|
CURSOR, /**< 切换时间光标。 */
|
|
MERGE_LANES, /**< 合并为单一网格。 */
|
|
SPLIT_LANES, /**< 按信号拆分为多网格。 */
|
|
SELECT_ALL, /**< 勾选当前标签页全部信号。 */
|
|
CLEAR_ALL /**< 取消当前标签页全部信号勾选。 */
|
|
};
|
|
|
|
/**
|
|
* @brief 顶部工具栏:文件操作与视图控制的入口。
|
|
*/
|
|
class Toolbar
|
|
{
|
|
public:
|
|
Toolbar();
|
|
|
|
/**
|
|
* @brief 绑定字体与主题资源。
|
|
* @param [IN] fonts 字体集合,需在工具栏生命周期内保持有效。
|
|
* @param [IN] theme 主题配色,需在工具栏生命周期内保持有效。
|
|
*/
|
|
void Setup(const UiFonts* fonts, const Theme* theme);
|
|
|
|
/**
|
|
* @brief 设置 DPI 缩放比例。
|
|
* @param [IN] scale 缩放比例(1.0 对应 96 DPI)。
|
|
*/
|
|
void SetScale(float scale);
|
|
|
|
/**
|
|
* @brief 设置是否已加载数据(未加载时大部分按钮被禁用)。
|
|
* @param [IN] hasDocument 是否已加载数据。
|
|
*/
|
|
void SetDocumentLoaded(bool hasDocument);
|
|
|
|
/**
|
|
* @brief 设置工具栏右侧的状态文本。
|
|
* @param [IN] text 状态文本。
|
|
*/
|
|
void SetStatusText(const std::wstring& text);
|
|
|
|
/**
|
|
* @brief 设置可切换按钮的选中状态。
|
|
* @param [IN] action 目标按钮动作。
|
|
* @param [IN] checked 是否处于选中(生效)状态。
|
|
*/
|
|
void SetToggleState(ToolbarAction action, bool checked);
|
|
|
|
/**
|
|
* @brief 计算工具栏在指定缩放下的期望高度。
|
|
* @return 期望高度(像素)。
|
|
*/
|
|
float DesiredHeight() const;
|
|
|
|
/**
|
|
* @brief 按给定区域重新排布按钮。
|
|
* @param [IN] area 工具栏可用区域。
|
|
*/
|
|
void Layout(const gd::RectF& area);
|
|
|
|
/**
|
|
* @brief 绘制工具栏。
|
|
* @param [IN,OUT] g 绘图上下文。
|
|
*/
|
|
void Paint(gd::Graphics& g);
|
|
|
|
/**
|
|
* @brief 处理鼠标移动,更新悬停状态。
|
|
* @param [IN] x 客户区横坐标。
|
|
* @param [IN] y 客户区纵坐标。
|
|
* @return 悬停状态发生变化返回 true。
|
|
*/
|
|
bool OnMouseMove(int x, int y);
|
|
|
|
/**
|
|
* @brief 处理鼠标左键按下。
|
|
* @param [IN] x 客户区横坐标。
|
|
* @param [IN] y 客户区纵坐标。
|
|
* @param [OUT] action 命中的按钮动作。
|
|
* @return 命中按钮返回 true。
|
|
*/
|
|
bool OnLButtonDown(int x, int y, ToolbarAction& action);
|
|
|
|
/**
|
|
* @brief 处理鼠标左键抬起。
|
|
* @param [IN] x 客户区横坐标。
|
|
* @param [IN] y 客户区纵坐标。
|
|
* @param [OUT] action 抬起时命中的按钮动作(仅在按钮上抬起时有效)。
|
|
* @return 视觉状态发生变化返回 true。
|
|
*/
|
|
bool OnLButtonUp(int x, int y, ToolbarAction& action);
|
|
|
|
/**
|
|
* @brief 处理鼠标离开工具栏。
|
|
* @return 视觉状态发生变化返回 true。
|
|
*/
|
|
bool OnMouseLeave();
|
|
|
|
/**
|
|
* @brief 判断坐标是否落在工具栏区域内。
|
|
* @param [IN] x 客户区横坐标。
|
|
* @param [IN] y 客户区纵坐标。
|
|
* @return 落在区域内返回 true。
|
|
*/
|
|
bool HitTest(int x, int y) const;
|
|
|
|
private:
|
|
/**
|
|
* @brief 单个工具栏按钮的运行时状态。
|
|
*/
|
|
struct Button
|
|
{
|
|
ToolbarAction action = ToolbarAction::NONE; /**< 按钮动作。 */
|
|
std::wstring label; /**< 按钮文本。 */
|
|
gd::RectF rect; /**< 按钮矩形。 */
|
|
float width = 0.0f; /**< 按钮宽度。 */
|
|
bool primary = false; /**< 是否为主按钮(强调色填充)。 */
|
|
bool needsDocument = true; /**< 是否依赖已加载数据。 */ bool toggle = false; /**< 是否为可切换按钮。 */
|
|
bool checked = false; /**< 可切换按钮的选中状态。 */ bool hover = false; /**< 悬停状态。 */
|
|
bool pressed = false; /**< 按下状态。 */
|
|
};
|
|
|
|
/**
|
|
* @brief 判断按钮当前是否可用。
|
|
* @param [IN] button 目标按钮。
|
|
* @return 可用返回 true。
|
|
*/
|
|
bool IsEnabled(const Button& button) const;
|
|
|
|
const UiFonts* m_fonts = nullptr; /**< 字体资源。 */
|
|
const Theme* m_theme = nullptr; /**< 主题资源。 */
|
|
float m_scale = 1.0f; /**< DPI 缩放比例。 */
|
|
bool m_documentLoaded = false; /**< 是否已加载数据。 */
|
|
std::wstring m_statusText; /**< 右侧状态文本。 */
|
|
std::vector<Button> m_buttons; /**< 按钮集合。 */
|
|
gd::RectF m_area; /**< 工具栏整体区域。 */
|
|
int m_hoverIndex = -1; /**< 当前悬停按钮下标。 */
|
|
int m_pressedIndex = -1; /**< 当前按下按钮下标。 */
|
|
};
|
|
|
|
} // namespace jdi
|
|
|
|
#endif // __TOOLBAR_HPP__
|