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
@@ -499,10 +499,11 @@ namespace jdi
|
||||
|
||||
if (m_tab != nullptr)
|
||||
{
|
||||
// 适应视图 = 回到初始状态:全部网格恢复整段数据的自动自适应。
|
||||
// 「选区 Y 轴自适应」是用户设置项,这里保持不变。
|
||||
for (Lane& lane : m_tab->Lanes())
|
||||
{
|
||||
lane.autoRange = true;
|
||||
lane.viewAutoRange = false;
|
||||
}
|
||||
}
|
||||
BuildLaneVisuals();
|
||||
@@ -788,6 +789,9 @@ namespace jdi
|
||||
Tab().ViewMin() = timeA;
|
||||
Tab().ViewMax() = timeB;
|
||||
ClampTimeView();
|
||||
|
||||
// 「选区 Y 轴自适应」开关开启的网格:时间选区放大后自动把 Y 轴匹配到新的可见区间。
|
||||
ApplySelectionAutoFit();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -822,7 +826,8 @@ namespace jdi
|
||||
|
||||
Lane& lane = m_tab->Lanes()[static_cast<std::size_t>(laneIndex)];
|
||||
lane.autoRange = false;
|
||||
lane.viewAutoRange = false;
|
||||
// 手动 Y 轴选区放大:关闭本网格的「选区 Y 轴自适应」。
|
||||
lane.fitYToSelection = false;
|
||||
lane.yMin = std::min(valueTop, valueBottom);
|
||||
lane.yMax = std::max(valueTop, valueBottom);
|
||||
return true;
|
||||
@@ -837,49 +842,66 @@ namespace jdi
|
||||
return LaneAtY(y);
|
||||
}
|
||||
|
||||
bool PlotView::LaneRangeIsAuto(int laneIndex) const
|
||||
bool PlotView::LaneAutoFitToSelection(int laneIndex) const
|
||||
{
|
||||
if (m_tab == nullptr || laneIndex < 0 || laneIndex >= static_cast<int>(m_tab->Lanes().size()))
|
||||
{
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
return m_tab->Lanes()[static_cast<std::size_t>(laneIndex)].autoRange;
|
||||
return m_tab->Lanes()[static_cast<std::size_t>(laneIndex)].fitYToSelection;
|
||||
}
|
||||
|
||||
bool PlotView::LaneRangeIsAutoToView(int laneIndex) const
|
||||
bool PlotView::AllLanesAutoFitToSelection() const
|
||||
{
|
||||
// “选区 Y 轴自适应”是带状态的操作:只有应用后未被任何手动改动、
|
||||
// 且时间选区没有变化时,当前范围才仍等于该操作的结果。
|
||||
if (m_tab == nullptr || laneIndex < 0 || laneIndex >= static_cast<int>(m_tab->Lanes().size()))
|
||||
if (m_tab == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
const Lane& lane = m_tab->Lanes()[static_cast<std::size_t>(laneIndex)];
|
||||
if (!lane.viewAutoRange || lane.autoRange)
|
||||
const std::vector<Lane>& lanes = m_tab->Lanes();
|
||||
if (lanes.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return (lane.viewAutoMin == Tab().ViewMin()) && (lane.viewAutoMax == Tab().ViewMax());
|
||||
}
|
||||
|
||||
bool PlotView::ResetLaneRange(int laneIndex)
|
||||
{
|
||||
if (m_tab == nullptr || laneIndex < 0 || laneIndex >= static_cast<int>(m_tab->Lanes().size()))
|
||||
for (const Lane& lane : lanes)
|
||||
{
|
||||
return false;
|
||||
if (!lane.fitYToSelection)
|
||||
{
|
||||
// 任一网格未开启 → 全局项就不是勾选状态。
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Lane& lane = m_tab->Lanes()[static_cast<std::size_t>(laneIndex)];
|
||||
if (lane.autoRange)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
lane.autoRange = true;
|
||||
lane.viewAutoRange = false;
|
||||
BuildLaneVisuals();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PlotView::ToggleLaneAutoFitToSelection(int laneIndex)
|
||||
{
|
||||
if (m_tab == nullptr || laneIndex < 0 || laneIndex >= static_cast<int>(m_tab->Lanes().size()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Lane& lane = m_tab->Lanes()[static_cast<std::size_t>(laneIndex)];
|
||||
lane.fitYToSelection = !lane.fitYToSelection;
|
||||
return lane.fitYToSelection;
|
||||
}
|
||||
|
||||
bool PlotView::SetAllLanesAutoFitToSelection(bool enabled)
|
||||
{
|
||||
if (m_tab == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool changed = false;
|
||||
for (Lane& lane : m_tab->Lanes())
|
||||
{
|
||||
if (lane.fitYToSelection != enabled)
|
||||
{
|
||||
lane.fitYToSelection = enabled;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
bool PlotView::AutoRangeLaneToView(int laneIndex)
|
||||
{
|
||||
if (m_tab == nullptr || m_dataSet == nullptr)
|
||||
@@ -979,14 +1001,43 @@ namespace jdi
|
||||
lane.autoRange = false;
|
||||
lane.yMin = low;
|
||||
lane.yMax = high;
|
||||
// 记录应用时的视图时间区间:时间选区一变,本项就不再是“当前生效”状态。
|
||||
lane.viewAutoRange = true;
|
||||
lane.viewAutoMin = viewMin;
|
||||
lane.viewAutoMax = viewMax;
|
||||
BuildLaneVisuals();
|
||||
return true;
|
||||
}
|
||||
|
||||
void PlotView::ApplySelectionAutoFit()
|
||||
{
|
||||
if (m_tab == nullptr || m_dataSet == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const std::vector<Lane>& lanes = m_tab->Lanes();
|
||||
bool any = false;
|
||||
for (const Lane& lane : lanes)
|
||||
{
|
||||
if (lane.fitYToSelection)
|
||||
{
|
||||
any = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!any)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 只对开启了「选区 Y 轴自适应」的网格重新匹配 Y 轴;
|
||||
// 重新匹配依据的是刚刚更新过的时间视图范围。
|
||||
for (std::size_t index = 0; index < lanes.size(); ++index)
|
||||
{
|
||||
if (m_tab->Lanes()[index].fitYToSelection)
|
||||
{
|
||||
AutoRangeLaneToView(static_cast<int>(index));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PlotView::ScaleLaneRange(int laneIndex, double factor, double anchorValue)
|
||||
{
|
||||
if (m_tab == nullptr || laneIndex < 0 || laneIndex >= static_cast<int>(m_lanes.size()))
|
||||
@@ -1012,7 +1063,7 @@ namespace jdi
|
||||
|
||||
Lane& lane = m_tab->Lanes()[static_cast<std::size_t>(laneIndex)];
|
||||
lane.autoRange = false;
|
||||
lane.viewAutoRange = false;
|
||||
lane.fitYToSelection = false;
|
||||
lane.yMin = anchorValue - ratio * newSpan;
|
||||
lane.yMax = lane.yMin + newSpan;
|
||||
BuildLaneVisuals();
|
||||
@@ -1029,7 +1080,8 @@ namespace jdi
|
||||
// 首次纵向拖动时先把当前自适应范围固化下来,再进行偏移。
|
||||
const LaneVisual& visual = m_lanes[static_cast<std::size_t>(laneIndex)];
|
||||
Lane& lane = m_tab->Lanes()[static_cast<std::size_t>(laneIndex)];
|
||||
lane.viewAutoRange = false;
|
||||
// 手动纵向平移属于手动调整幅值:关闭本网格的「选区 Y 轴自适应」。
|
||||
lane.fitYToSelection = false;
|
||||
if (lane.autoRange)
|
||||
{
|
||||
lane.autoRange = false;
|
||||
@@ -1097,7 +1149,7 @@ namespace jdi
|
||||
// 手工输入即视为取消自动自适应,与拖拽框选缩放的语义一致。
|
||||
// 必须先把当前(自适应计算出的)显示范围固化到 lane 里,再只改动被编辑的一端,
|
||||
// 否则另一端会回退到 Lane 的初始占位值,导致量程被莫名其妙地放大。
|
||||
lane.viewAutoRange = false;
|
||||
lane.fitYToSelection = false;
|
||||
if (lane.autoRange)
|
||||
{
|
||||
lane.autoRange = false;
|
||||
@@ -1437,7 +1489,8 @@ namespace jdi
|
||||
}
|
||||
const LaneVisual& visual = m_lanes[static_cast<std::size_t>(laneIndex)];
|
||||
Lane& lane = m_tab->Lanes()[static_cast<std::size_t>(laneIndex)];
|
||||
lane.viewAutoRange = false;
|
||||
// 直接输入上下限属于手动调整幅值:关闭本网格的「选区 Y 轴自适应」。
|
||||
lane.fitYToSelection = false;
|
||||
if (lane.autoRange)
|
||||
{
|
||||
lane.autoRange = false;
|
||||
|
||||
Reference in new issue
Block a user