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:
DeepSeek V4.1 Flash committed 2026-10-07 13:57:46 +08:00
1 parent dd48cdd2e1
commit 0fffb3ed09
8 files changed
+218 -91

No files matched your search

+8 -3
View File
@@ -330,9 +330,14 @@ namespace jdi
bool autoRange = true; /**< 是否依据信号取值范围自动计算 Y 轴。 */
double yMin = -1.0; /**< 手动 Y 轴下限。 */
double yMax = 1.0; /**< 手动 Y 轴上限。 */
bool viewAutoRange = false; /**< 是否由「选区 Y 轴自适应」产生且时间选区未再变化。 */
double viewAutoMin = 0.0; /**< 应用「选区 Y 轴自适应」时的视图时间下限。 */
double viewAutoMax = 0.0; /**< 应用「选区 Y 轴自适应」时的视图时间上限。 */
/**
* @brief 「选区 Y 轴自适应」开关。
*
* 开启后每次对该网格做时间轴选区放大,都会自动把本网格的 Y 轴匹配到新的可见时间区间;
* 用户手动调整幅值(拖拽平移、Y 轴选区放大、直接输入上下限)后会自动关闭。
*/
bool fitYToSelection = false;
};
/**
+40 -7
View File
@@ -111,6 +111,28 @@ namespace jdi
void RebuildLanes(const std::vector<std::vector<bool>>& visible, std::vector<Lane>& lanes,
LaneMode mode)
{
// 先记下每个信号原来所在网格的「选区 Y 轴自适应」开关:
// 勾选可见性会重建网格,若不携带,用户刚打开的开关会被悄悄清掉。
std::vector<std::pair<SignalRef, bool>> previousFit;
for (const Lane& lane : lanes)
{
for (const SignalRef& ref : lane.signals)
{
previousFit.emplace_back(ref, lane.fitYToSelection);
}
}
const auto inheritedFit = [&previousFit](const SignalRef& ref)
{
for (const std::pair<SignalRef, bool>& entry : previousFit)
{
if (entry.first == ref)
{
return entry.second;
}
}
return false;
};
// 收集全部可见信号引用。
std::vector<SignalRef> visibleRefs;
for (std::size_t fileIndex = 0; fileIndex < visible.size(); ++fileIndex)
@@ -151,6 +173,7 @@ namespace jdi
{
Lane lane;
lane.autoRange = true;
lane.fitYToSelection = inheritedFit(ref);
lane.signals.push_back(ref);
lanes.push_back(std::move(lane));
}
@@ -175,6 +198,7 @@ namespace jdi
lane.autoRange = previousAutoRange;
lane.yMin = previousYMin;
lane.yMax = previousYMax;
lane.fitYToSelection = inheritedFit(visibleRefs.front());
lane.signals = visibleRefs;
lanes.push_back(std::move(lane));
}
@@ -216,6 +240,7 @@ namespace jdi
Lane lane;
lane.autoRange = true;
lane.fitYToSelection = inheritedFit(ref);
lane.signals.push_back(ref);
lanes.push_back(std::move(lane));
}
@@ -426,11 +451,21 @@ namespace jdi
// 使同一信号在任意标签页中都保持同一默认颜色。
{
const std::size_t globalIndex = paletteBase + file.signals.size();
signal.style.color =
(palette != nullptr && paletteCount > 0)
? palette[globalIndex % static_cast<std::size_t>(paletteCount)]
: 0xFF268BD2u;
signal.style.customColor = signal.style.color;
if (palette != nullptr && paletteCount > 0)
{
const std::size_t count = static_cast<std::size_t>(paletteCount);
const std::size_t slot = globalIndex % count;
signal.style.color = palette[slot];
// 自定义色初值取调色板中「向后递进」的下一个颜色。
// 若初值等于本信号自身的预设色,样式区里点击该预设色块会被判定成
// “当前用的是自定义色”,高亮会直接跳到自定义色块上(此前的缺陷)。
signal.style.customColor = palette[(slot + 1) % count];
}
else
{
signal.style.color = 0xFF268BD2u;
signal.style.customColor = 0xFF859900u;
}
signal.style.opacity = 1.0f;
signal.style.lineWidth = 1.0f;
signal.style.mode = DrawMode::LINE;
@@ -1048,8 +1083,6 @@ namespace jdi
for (Lane& lane : m_lanes)
{
// 网格的信号组成发生变化,“选区 Y 轴自适应”的结果不再对应当前视野。
lane.viewAutoRange = false;
std::vector<SignalRef>& refs = lane.signals;
refs.erase(std::remove(refs.begin(), refs.end(), ref), refs.end());
}