feat(ui): 修复预设色块误跳自定义色、选区 Y 轴自适应改为切换开关、菜单项改名移位
1) 修复样式区"点预设色块直接跳到自定义色块" - 根因:加载时 customColor 被赋成信号自身的预设色,而样式区按 "color == customColor 即视为在用自定义色" 判定高亮,于是点自身的预设色时 高亮立刻跳到自定义色块上(第 N 个信号点第 N 个预设色必然复现) - customColor 初值改为调色板中"本信号预设色向后递进一格"的颜色 (palette[(slot + 1) % count]),自定义色块因此显示与预设色块排布连续的下一色 - 同时收紧高亮判定:仅当当前颜色"不属于任何可见预设色"时才认为在用自定义色。 这样即使自定义色恰好等于某个预设色,点击该预设色也始终高亮预设色块, 彻底消除"高亮乱跳";用拾色器选出的非预设色仍正常高亮自定义色块 2)「选区 Y 轴自适应」改为切换开关(原为一次性操作) - Lane 用单一布尔量 fitYToSelection 表示(删除 viewAutoRange/viewAutoMin/viewAutoMax) - 开启后每次时间轴选区放大(ApplyTimeSelection → ApplySelectionAutoFit) 都会把该网格 Y 轴匹配到新的可见时间区间 - 任何手动幅值调整(Y 轴选区放大、纵向平移、缩放、直接输入上下限)都会关闭对应网格的开关 - RebuildLanes 按信号继承该开关:勾选/取消勾选信号不再把用户刚打开的开关悄悄清掉 3) 菜单「恢复 Y 轴自适应」移除,原位置新增「选区 Y 轴自适应(全局)」 - 全局项为切换状态:选中即把全部网格的开关置为开,取消即全部置为关; 任意网格单独关掉后,全局项立即变为未勾选(= AllLanesAutoFitToSelection) - 工具栏在「适应视图」之后新增「Y 轴自适应」切换按钮,与全局项是同一个开关, 每帧同步选中态 - 删除了 PLOT_CMD_LANE_AUTO / PlotView::LaneRangeIsAuto / ResetLaneRange 等已无用的接口 4)「时间轴自适应(匹配本网格)」改名为「按网格时间轴展开」并移到分隔线上方 - 新顺序:网格 N / Y 轴最大值 / Y 轴最小值 / 选区 Y 轴自适应 / 按网格时间轴展开 / --- / 选区 Y 轴自适应(全局)/ 全部自适应 验证(TestData/[1].CSV 11 信号,窗口 1725x996,125% DPI): - 颜色:初始高亮在预设色块 1;点预设 1 与预设 2(等于自定义色初值)均保持点中的色块高亮; 用拾色器改成非预设色后高亮正确落在自定义色块 - 逐网格:菜单项勾选/取消即时反映;开启的网格做时间轴选区放大后 Y 轴自动匹配 (仅该网格变化,其它网格保持整段范围) - 全局:工具栏按钮与菜单全局项互相联动;单独取消一个网格后两者都变为未勾选; 隐藏/显示信号后开关保持 - 「按网格时间轴展开」能把缩放后的时间轴展开回该网格信号范围;「全部自适应」仍正常 - 超大文件回归(VERY_BIG_DATA 1.77GB)菜单/悬停正常;空闲 CPU 0.00% 构建: make clean; make all 无警告无错误
This commit is contained in:
1 parent
dd48cdd2e1
commit
0fffb3ed09
8 files changed
+218
-91
No files matched your search
@@ -677,6 +677,7 @@ namespace jdi
|
||||
m_toolbar.SetDocumentLoaded(!m_dataSet.Empty());
|
||||
|
||||
// 工具栏可切换按钮的选中状态始终与当前标签页配置保持一致。
|
||||
m_toolbar.SetToggleState(ToolbarAction::AUTO_FIT_Y, m_plot.AllLanesAutoFitToSelection());
|
||||
m_toolbar.SetToggleState(ToolbarAction::ZOOM_TIME,
|
||||
m_plot.CurrentZoomMode() == PlotZoomMode::TIME);
|
||||
m_toolbar.SetToggleState(ToolbarAction::ZOOM_VALUE,
|
||||
@@ -1024,6 +1025,17 @@ namespace jdi
|
||||
m_plot.FitAll();
|
||||
SetStatusMessage(L"已恢复自适应视图。", false);
|
||||
break;
|
||||
case ToolbarAction::AUTO_FIT_Y:
|
||||
{
|
||||
// 与网格右键菜单中的「选区 Y 轴自适应(全局)」同一开关:
|
||||
// 打开后每次时间轴选区放大都会自动把各网格 Y 轴匹配到新的可见区间。
|
||||
const bool enable = !m_plot.AllLanesAutoFitToSelection();
|
||||
m_plot.SetAllLanesAutoFitToSelection(enable);
|
||||
SetStatusMessage(enable ? L"已开启选区 Y 轴自适应:时间轴选区放大后自动匹配各网格 Y 轴。"
|
||||
: L"已关闭选区 Y 轴自适应。",
|
||||
false);
|
||||
break;
|
||||
}
|
||||
case ToolbarAction::ZOOM_TIME:
|
||||
if (m_plot.ToggleZoomMode(PlotZoomMode::TIME))
|
||||
{
|
||||
@@ -1377,8 +1389,6 @@ namespace jdi
|
||||
header.label = L"网格 " + std::to_wstring(laneIndex + 1);
|
||||
items.push_back(header);
|
||||
|
||||
const bool isAuto = m_plot.LaneRangeIsAuto(laneIndex);
|
||||
|
||||
// 当前网格的 Y 轴上下限值直接在菜单内的输入框里显示,单击即可就地编辑(菜单不关闭)。
|
||||
double laneYMin = 0.0;
|
||||
double laneYMax = 1.0;
|
||||
@@ -1400,29 +1410,29 @@ namespace jdi
|
||||
minItem.filter = EditFilter::NUMBER;
|
||||
items.push_back(minItem);
|
||||
|
||||
// 选区自适应:只按当前显示时间段内的数据做幅值自适应(放大局部后铺满网格)。
|
||||
// 选区自适应(切换项):勾选后每次本网格的时间轴选区放大都会自动匹配 Y 轴幅值。
|
||||
MenuItem autoViewItem;
|
||||
autoViewItem.label = L"选区 Y 轴自适应";
|
||||
autoViewItem.id = PLOT_CMD_LANE_AUTO_VIEW;
|
||||
autoViewItem.checked = m_plot.LaneRangeIsAutoToView(laneIndex);
|
||||
autoViewItem.checked = m_plot.LaneAutoFitToSelection(laneIndex);
|
||||
items.push_back(autoViewItem);
|
||||
|
||||
// 时间轴自适应到本网格信号范围(原先位于分隔线下方,现移到分隔线上方)。
|
||||
MenuItem fitLaneTime;
|
||||
fitLaneTime.label = L"按网格时间轴展开";
|
||||
fitLaneTime.id = PLOT_CMD_LANE_FIT_TIME;
|
||||
items.push_back(fitLaneTime);
|
||||
|
||||
MenuItem separator;
|
||||
separator.kind = MenuItemKind::SEPARATOR;
|
||||
items.push_back(separator);
|
||||
|
||||
// 恢复自适应放在分隔线下方、时间轴自适应上方。
|
||||
MenuItem autoItem;
|
||||
autoItem.label = isAuto ? L"Y 轴自适应(当前)" : L"恢复 Y 轴自适应";
|
||||
autoItem.id = PLOT_CMD_LANE_AUTO;
|
||||
autoItem.checked = isAuto;
|
||||
autoItem.enabled = !isAuto;
|
||||
items.push_back(autoItem);
|
||||
|
||||
MenuItem fitLaneTime;
|
||||
fitLaneTime.label = L"时间轴自适应(匹配本网格)";
|
||||
fitLaneTime.id = PLOT_CMD_LANE_FIT_TIME;
|
||||
items.push_back(fitLaneTime);
|
||||
// 全局开关:一次性打开/关闭全部网格各自的「选区 Y 轴自适应」。
|
||||
MenuItem autoFitAllItem;
|
||||
autoFitAllItem.label = L"选区 Y 轴自适应(全局)";
|
||||
autoFitAllItem.id = PLOT_CMD_AUTO_FIT_ALL;
|
||||
autoFitAllItem.checked = m_plot.AllLanesAutoFitToSelection();
|
||||
items.push_back(autoFitAllItem);
|
||||
|
||||
MenuItem fitItem;
|
||||
fitItem.label = L"全部自适应";
|
||||
@@ -1450,14 +1460,11 @@ namespace jdi
|
||||
m_menu.UpdateItemValue(PLOT_CMD_LANE_Y_MAX, FormatValue(laneYMax));
|
||||
m_menu.UpdateItemValue(PLOT_CMD_LANE_Y_MIN, FormatValue(laneYMin));
|
||||
|
||||
// 手工输入上下限后已不再是自动自适应,同步刷新该项的文字/选中标记/可用状态。
|
||||
const bool isAuto = m_plot.LaneRangeIsAuto(laneIndex);
|
||||
m_menu.UpdateItemLabel(PLOT_CMD_LANE_AUTO, isAuto ? L"Y 轴自适应(当前)" : L"恢复 Y 轴自适应",
|
||||
isAuto, !isAuto);
|
||||
|
||||
// “选区 Y 轴自适应”是带状态的操作,同样需要实时反映其“当前生效”标记。
|
||||
// 「选区 Y 轴自适应」(本网格)与「(全局)」都是切换项,实时反映各自的勾选状态。
|
||||
m_menu.UpdateItemLabel(PLOT_CMD_LANE_AUTO_VIEW, L"选区 Y 轴自适应",
|
||||
m_plot.LaneRangeIsAutoToView(laneIndex), true);
|
||||
m_plot.LaneAutoFitToSelection(laneIndex), true);
|
||||
m_menu.UpdateItemLabel(PLOT_CMD_AUTO_FIT_ALL, L"选区 Y 轴自适应(全局)",
|
||||
m_plot.AllLanesAutoFitToSelection(), true);
|
||||
}
|
||||
|
||||
void Application::DispatchMenuResult(const MenuResult& result)
|
||||
@@ -1500,12 +1507,17 @@ namespace jdi
|
||||
m_plotMenuLane = -1;
|
||||
switch (result.id)
|
||||
{
|
||||
case PLOT_CMD_LANE_AUTO:
|
||||
m_plot.ResetLaneRange(laneIndex);
|
||||
break;
|
||||
case PLOT_CMD_LANE_AUTO_VIEW:
|
||||
m_plot.AutoRangeLaneToView(laneIndex);
|
||||
// 切换本网格的「选区 Y 轴自适应」。
|
||||
m_plot.ToggleLaneAutoFitToSelection(laneIndex);
|
||||
break;
|
||||
case PLOT_CMD_AUTO_FIT_ALL:
|
||||
{
|
||||
// 全局切换:一次打开/关闭全部网格各自的开关。
|
||||
const bool enable = !m_plot.AllLanesAutoFitToSelection();
|
||||
m_plot.SetAllLanesAutoFitToSelection(enable);
|
||||
break;
|
||||
}
|
||||
case PLOT_CMD_LANE_FIT_TIME:
|
||||
m_plot.FitTimeToLane(laneIndex);
|
||||
break;
|
||||
|
||||
Reference in new issue
Block a user