feat(ui): 工具栏"选区"改名、菜单对勾右置与边距修正、选区自适应勾选、悬停/选区拖拽性能
1) 工具栏文案:"时间轴缩放"/"Y 轴缩放" -> "时间轴选区"/"Y 轴选区" - Toolbar.cpp 按钮标签、Toolbar.hpp 枚举注释、Application 状态提示语同步更新 2) 网格右键菜单:对勾从左侧移到右侧,并修正菜单内各元素边距 - 文本列统一为 kPadH + kItemPad(5 + 8),三类条目(HEADER/NORMAL/EDIT)共用; 原先左侧预留 22px 标记列,导致"网格 N"、"Y 轴最大值"、"选区 Y 轴自适应"等 所有文本的左边距被整体推右(用户报告的"文本左边距过大") - 对勾改画在条目右侧的 kMarkerColumn(18) 列内,文本宽度相应预留,不会与文字重叠 - EDIT 行输入框改为右对齐到条目内容区右边界,宽度由 NaturalEditFieldWidth() 统一计算, 空间不足时为左侧说明文字保留自然宽度(避免被菜单宽度上限挤成省略号) - 分隔线、色块行同样改用 kItemPad 内缩;kRightPad 已删除 3) "选区 Y 轴自适应"增加与"Y 轴自适应"一致的勾选标记 - Lane 新增 viewAutoRange / viewAutoMin / viewAutoMax,记录应用该操作时的视图时间区间 - 新增 PlotView::LaneRangeIsAutoToView():只有未被任何手动幅值改动且时间选区未变化时才为 true - 所有手动改动路径(ApplyValueSelection/ScaleLaneRange/ShiftLaneRange/ApplyLaneValueText/ EndEdit/ResetLaneRange/MoveSignalToLane)都会清除该状态; 时间选区变化后 viewAutoMin/Max 与当前视图不符,勾选自动消失 - RefreshPlotMenuValues() 同步刷新该项状态 4) 修复大文件(VERY_BIG_DATA 1.77GB / 5 信号)下悬停与选区缩放的严重卡顿 - 根因:任何悬停态变化(左侧信号列表、网格内命中曲线提示)或选区拖拽都会触发整幅重绘, 其中波形绘制约 80ms/帧,因此交互帧率只有 ~10fps - 静态场景缓存从"仅拖拽信号/光标"推广为"只要场景键一致就复用",缓存区域由整个客户区 收敛为仅绘图区:工具栏/标签栏/面板各自带悬停态必须每帧绘制(约 10.5ms), 而真正昂贵的波形改为直接贴图(约 1ms) - 场景键新增 contentHash(FNV-1a 折叠网格几何/幅值、每条信号的引用/可见性/ 颜色/透明度/线宽/样式/显示名与所属文件名):改样式、重命名、增删信号都会自动失效 - 随鼠标变化的内容全部移出缓存:新增 PaintHoverHighlight() 在贴图之后绘制 悬停网格底色(半透明叠加)与悬停信号光晕(PaintSignalHalo()); PaintLane 内只绘制拖拽中的信号光晕(key 中记录 haloFile/haloSignal) - EnsureSceneCache 改为要求位图尺寸与当前区域严格相等(原 >= 复用会在窗口缩小后 把旧像素画到绘图区之外) - Application::Render 移除 reuseScene 分支,统一每帧绘制界面框架 实测(VERY_BIG_DATA 5 信号,Release): - 整幅重绘 ~80ms -> 命中缓存贴图 ~1ms - 悬停左侧信号列表:~95ms -> ~14ms/帧 - 悬停网格内信号(含光晕高亮):~95ms -> ~28~32ms/帧 - 时间轴 / Y 轴选区拖拽:~95~105ms -> ~19~22ms/帧 - 非拖拽静止帧 ~118ms 维持不变;空闲 CPU 0.00% 构建: make clean; make all 无警告无错误
This commit is contained in:
1 parent
a3e638fa58
commit
dd48cdd2e1
9 files changed
+414
-194
No files matched your search
@@ -689,20 +689,15 @@ namespace jdi
|
||||
g.SetPixelOffsetMode(gd::PixelOffsetModeHalf);
|
||||
g.SetTextRenderingHint(gd::TextRenderingHintClearTypeGridFit);
|
||||
|
||||
// 拖拽(拖动信号曲线 / 时间光标)期间视图与数据都不变:
|
||||
// 静态场景缓存已包含工具栏/标签栏/面板/全部网格,直接跳过这些区域的重复绘制,
|
||||
// 实测可省下约 13ms/帧(面板绘制就占 8ms)。
|
||||
const bool reuseScene = m_plot.CanReuseSceneCache();
|
||||
// 工具栏/标签栏/面板各自带悬停态,必须每帧绘制;
|
||||
// 真正昂贵的是绘图区的波形(大文件约 80ms/帧),
|
||||
// 由 PlotView 内部的静态场景缓存消除,与数据量无关。
|
||||
UiFillRect(g, gd::RectF(0.0f, 0.0f, static_cast<float>(width), static_cast<float>(height)),
|
||||
m_theme.windowBg);
|
||||
|
||||
if (!reuseScene)
|
||||
{
|
||||
UiFillRect(g, gd::RectF(0.0f, 0.0f, static_cast<float>(width), static_cast<float>(height)),
|
||||
m_theme.windowBg);
|
||||
|
||||
m_tabBar.Paint(g);
|
||||
m_toolbar.Paint(g);
|
||||
m_panel.Paint(g);
|
||||
}
|
||||
m_tabBar.Paint(g);
|
||||
m_toolbar.Paint(g);
|
||||
m_panel.Paint(g);
|
||||
|
||||
m_plot.Paint(g);
|
||||
|
||||
@@ -1033,8 +1028,8 @@ namespace jdi
|
||||
if (m_plot.ToggleZoomMode(PlotZoomMode::TIME))
|
||||
{
|
||||
SetStatusMessage((m_plot.CurrentZoomMode() == PlotZoomMode::TIME)
|
||||
? L"时间轴缩放:在绘图区横向拖拽选择区间即可放大。"
|
||||
: L"已退出时间轴缩放模式。",
|
||||
? L"时间轴选区:在绘图区横向拖拽选择区间即可放大。"
|
||||
: L"已退出时间轴选区模式。",
|
||||
false);
|
||||
}
|
||||
break;
|
||||
@@ -1042,8 +1037,8 @@ namespace jdi
|
||||
if (m_plot.ToggleZoomMode(PlotZoomMode::VALUE))
|
||||
{
|
||||
SetStatusMessage((m_plot.CurrentZoomMode() == PlotZoomMode::VALUE)
|
||||
? L"Y 轴缩放:在某个网格内纵向拖拽选择区间即可放大。"
|
||||
: L"已退出 Y 轴缩放模式。",
|
||||
? L"Y 轴选区:在某个网格内纵向拖拽选择区间即可放大。"
|
||||
: L"已退出 Y 轴选区模式。",
|
||||
false);
|
||||
}
|
||||
break;
|
||||
@@ -1126,7 +1121,7 @@ namespace jdi
|
||||
// Esc 的语义:
|
||||
// 1) 放弃当前正在进行的拖拽(典型场景:缩放的框选选区还没松开左键);
|
||||
// 取消后不应用选区、视图范围保持不变;
|
||||
// 2) 同时退出全部缩放模式,使工具栏「时间轴缩放」「Y 轴缩放」回到未选中态。
|
||||
// 2) 同时退出全部缩放模式,使工具栏「时间轴选区」「Y 轴选区」回到未选中态。
|
||||
// Esc 不与时间光标关联:关闭光标请用工具栏「光标」按钮,避免误关指针。
|
||||
bool changed = m_plot.CancelDrag();
|
||||
changed = m_plot.ExitZoomModes() || changed;
|
||||
@@ -1409,6 +1404,7 @@ namespace jdi
|
||||
MenuItem autoViewItem;
|
||||
autoViewItem.label = L"选区 Y 轴自适应";
|
||||
autoViewItem.id = PLOT_CMD_LANE_AUTO_VIEW;
|
||||
autoViewItem.checked = m_plot.LaneRangeIsAutoToView(laneIndex);
|
||||
items.push_back(autoViewItem);
|
||||
|
||||
MenuItem separator;
|
||||
@@ -1458,6 +1454,10 @@ namespace jdi
|
||||
const bool isAuto = m_plot.LaneRangeIsAuto(laneIndex);
|
||||
m_menu.UpdateItemLabel(PLOT_CMD_LANE_AUTO, isAuto ? L"Y 轴自适应(当前)" : L"恢复 Y 轴自适应",
|
||||
isAuto, !isAuto);
|
||||
|
||||
// “选区 Y 轴自适应”是带状态的操作,同样需要实时反映其“当前生效”标记。
|
||||
m_menu.UpdateItemLabel(PLOT_CMD_LANE_AUTO_VIEW, L"选区 Y 轴自适应",
|
||||
m_plot.LaneRangeIsAutoToView(laneIndex), true);
|
||||
}
|
||||
|
||||
void Application::DispatchMenuResult(const MenuResult& result)
|
||||
|
||||
Reference in new issue
Block a user