feat: 支持多视图标签页、按文件分组的多文件信号管理与网格随勾选自动收敛
数据层与视图配置解耦:新增 DataSet(多文件只读数据层)与 TabConfig(每标签页独立配置),
以 SignalRef{fileIndex,signalIndex} 标识全局信号,替换原有单文件 SignalSet。
- 标签页:新增 TabBar 组件,支持新建/切换/关闭标签页;每页独立保存信号勾选、
颜色/线宽/显示方式、网格划分、视图范围与时间光标,互不影响。
- 网格收敛:可见性变更统一经 TabConfig 的 Set*Visible 接口并同步重算网格,
取消勾选后对应的空网格立即回收(修复此前留下空轨道的问题)。
- 多文件分组:左侧面板改为「文件分组 + 信号」树形列表,分组可折叠、可整组勾选,
分组复选框支持全选/部分/未选三态;新加载文件的信号默认未勾选,由用户自行选择。
- 来源标识:信号行、样式编辑区标题、波形图例与光标读数在跨文件时标注来源文件名。
- 交互补充:面板滚动条支持点击跳转与拖拽,切换标签页自动滚动到已选信号。
- 工具栏精简为「打开 CSV/适应视图/放大/缩小/合并网格/每信号一格/全选信号/清空勾选」,
按钮宽度改为按实际文本像素测量;打开对话框支持多选文件,拖放支持批量载入。
- 新增 TestData/[2].CSV 作为跨文件对比测试数据。
This commit is contained in:
1 parent
132b305544
commit
9c6c374cce
21 files changed
+4086
-1461
No files matched your search
@@ -21,13 +21,13 @@ namespace jdi
|
||||
{
|
||||
NONE = 0, /**< 未触发任何动作。 */
|
||||
OPEN_FILE, /**< 打开 CSV 文件。 */
|
||||
FIT_ALL, /**< 时间与幅值同时自适应。 */
|
||||
FIT_TIME, /**< 仅时间轴自适应。 */
|
||||
FIT_ALL, /**< 视图自适应到可见信号范围。 */
|
||||
ZOOM_IN, /**< 放大时间轴。 */
|
||||
ZOOM_OUT, /**< 缩小时间轴。 */
|
||||
MERGE_LANES, /**< 合并为单一网格。 */
|
||||
SPLIT_LANES, /**< 按信号拆分为多网格。 */
|
||||
RESET_VIEW /**< 恢复默认视图范围。 */
|
||||
SPLIT_LANES, /**< 按信号拆分为多网格。 */
|
||||
SELECT_ALL, /**< 勾选当前标签页全部信号。 */
|
||||
CLEAR_ALL /**< 取消当前标签页全部信号勾选。 */
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -71,18 +71,20 @@ namespace jdi
|
||||
|
||||
const Spec specs[] = {
|
||||
{ToolbarAction::OPEN_FILE, L"打开 CSV", true, false},
|
||||
{ToolbarAction::FIT_ALL, L"适应窗口", false, true},
|
||||
{ToolbarAction::FIT_TIME, L"适应时间", false, true},
|
||||
{ToolbarAction::FIT_ALL, L"适应视图", false, true},
|
||||
{ToolbarAction::ZOOM_IN, L"放大", false, true},
|
||||
{ToolbarAction::ZOOM_OUT, L"缩小", false, true},
|
||||
{ToolbarAction::MERGE_LANES, L"合并网格", false, true},
|
||||
{ToolbarAction::SPLIT_LANES, L"每信号一格", false, true},
|
||||
{ToolbarAction::SELECT_ALL, L"全选信号", false, true},
|
||||
{ToolbarAction::CLEAR_ALL, L"清空勾选", false, true},
|
||||
};
|
||||
|
||||
// 按钮宽度先按固定预算计算,避免依赖绘图上下文。
|
||||
// 按钮宽度按实际文本像素宽 + 固定内边距计算,避免中文标签被裁切。
|
||||
float cursorX = area.X + kSidePadding * m_scale;
|
||||
const float top = area.Y + kTopPadding * m_scale;
|
||||
const float height = kButtonHeight * m_scale;
|
||||
const float horizontalPadding = kButtonPadding * 2.0f * m_scale;
|
||||
|
||||
for (const Spec& spec : specs)
|
||||
{
|
||||
@@ -91,8 +93,7 @@ namespace jdi
|
||||
button.label = spec.label;
|
||||
button.primary = spec.primary;
|
||||
button.needsDocument = spec.needsDocument;
|
||||
button.width = (kButtonPadding * 2.0f +
|
||||
static_cast<float>(button.label.size()) * 13.0f) * m_scale;
|
||||
button.width = horizontalPadding + UiMeasureTextWidth(m_fonts->ui, button.label);
|
||||
button.rect = gd::RectF(cursorX, top, button.width, height);
|
||||
cursorX += button.width + kButtonGap * m_scale;
|
||||
|
||||
|
||||
Reference in new issue
Block a user