refactor(plotview): 面板状态/滚动量收敛为唯一派发点,消除 20+ 处手写分支
问题:`Lane` 里 7 种实验性功能各自持有一份 `LanePanelState` 与滚动偏移(共 14 个字段)。 旧实现在每个需要“按种类取用”的地方各写一遍多层嵌套三元式或 switch: - EdgePanelLayoutFor 的 enabled / open / collapsed / storedX / storedY 共 5 条 7 层嵌套三元式(历史上多次因多/少一个右括号编译失败); - 标题栏拖拽、✕ 关闭、滚轮翻页、滚动条拖动、错开序数统计各自再写一遍。 新增一种面板要改 20+ 处,漏一处就是「面板拖不动 / 关不掉 / 滚轮滚不到底」 (MARK、RESAMPLE、CLIP 三种面板都真实踩过)。 改法(PlotViewInternal.hpp 新增唯一派发点): - LanePanelEnabled(lane, kind) - LanePanelStateOf(lane, kind) 可写/只读 - LanePanelScrollOf(lane, kind) 可写/只读 这些 switch **穷举全部 7 种且不写 default**,因此 -Wswitch(属 -Wall)会在新增 EdgePanelKind 而漏登记时直接报警 —— 已用最小程序验证 -Wswitch 确实会报。 调用点改造: - EdgePanelLayoutFor:5 条嵌套三元式 -> 3 行访问器调用;局部 kOrder[] -> kEdgePanelKinds。 - 标题栏拖拽:整个 7 分支 switch -> 一次访问器写入。 - 滚轮翻页:current 的三元式链 -> LanePanelScrollOf;switch 补全 MEAN/MARK 并去掉 default。 - 滚动条拖动:switch 补全 MEAN/MARK 并去掉 default。 - ✕ 关闭:去掉 `case COUNT: default:` 的兜底,改为穷举。 - SetLanePanelCollapsed / LanePanelCollapsed:两个 switch -> 一次访问器。 - 滚轮“是否可滚面板”的 kind 列举改为 `hoveredKind != MARK`。 验证:release / debug 全量编译零 warning;产物大小不变(793,088 B,逻辑等价)。
This commit is contained in:
1 parent
94fc1c45da
commit
7a3fefb9c2
5 files changed
+173
-181
No files matched your search
@@ -343,38 +343,18 @@ namespace jdi
|
||||
const bool listStyle = (meanFilter || centerAxis || weakPeak || resamplePanel || clipPanel);
|
||||
const bool countTable = (kind == EdgePanelKind::COUNT);
|
||||
const bool hasButton = (meanFilter || weakPeak || resamplePanel || clipPanel);
|
||||
const bool enabled = meanFilter ? lane.meanFilter
|
||||
: (weakPeak ? lane.weakPeak
|
||||
: (freeMarker ? lane.freeMarker
|
||||
: (resamplePanel ? lane.resample
|
||||
: (clipPanel ? lane.clip
|
||||
: (centerAxis ? lane.edgeCenter
|
||||
: lane.edgeCount)))));
|
||||
const bool open = meanFilter ? lane.meanFilterPanel.open
|
||||
: (weakPeak ? lane.weakPeakPanel.open
|
||||
: (freeMarker ? lane.freeMarkerPanel.open
|
||||
: (resamplePanel
|
||||
? lane.resamplePanel.open
|
||||
: (clipPanel
|
||||
? lane.clipPanel.open
|
||||
: (centerAxis
|
||||
? lane.edgeCenterPanel.open
|
||||
: lane.edgePanel.open)))));
|
||||
// ⚠️ 面板的「启用 / 展开 / 折起」状态一律通过 `LanePanelEnabled` /
|
||||
// `LanePanelStateOf` 取值(见 `PlotViewInternal.hpp` 的说明):
|
||||
// 旧实现是三条 7 层嵌套三元式,新增面板时极容易漏改或写错括号。
|
||||
const bool enabled = LanePanelEnabled(lane, kind);
|
||||
const LanePanelState& panelState = LanePanelStateOf(lane, kind);
|
||||
const bool open = panelState.open;
|
||||
if (!enabled || !open)
|
||||
{
|
||||
return layout;
|
||||
}
|
||||
// 面板的**折起**状态(只显示标题栏)。折起时仍然算宽度与位置,但内容区全部省略。
|
||||
const bool collapsed = meanFilter ? lane.meanFilterPanel.collapsed
|
||||
: (weakPeak ? lane.weakPeakPanel.collapsed
|
||||
: (freeMarker ? lane.freeMarkerPanel.collapsed
|
||||
: (resamplePanel
|
||||
? lane.resamplePanel.collapsed
|
||||
: (clipPanel
|
||||
? lane.clipPanel.collapsed
|
||||
: (centerAxis
|
||||
? lane.edgeCenterPanel.collapsed
|
||||
: lane.edgePanel.collapsed)))));
|
||||
const bool collapsed = panelState.collapsed;
|
||||
layout.collapsed = collapsed;
|
||||
|
||||
int rowCount = 0;
|
||||
@@ -597,26 +577,8 @@ namespace jdi
|
||||
//(用户 2026-10-17 报告:“在当前范围内的网格开启实验性功能,面板首次出现在右下角”)。
|
||||
// 改用**可见序数**:它的量级只有一屏的网格数(约 20),再夹到“面板上沿不超过绘图区
|
||||
// 中间偏下”以内,于是面板始终停**右上区域**,同时保留“依次错开”的观感。
|
||||
const double storedX = meanFilter ? lane.meanFilterPanel.x
|
||||
: (weakPeak ? lane.weakPeakPanel.x
|
||||
: (freeMarker ? lane.freeMarkerPanel.x
|
||||
: (resamplePanel
|
||||
? lane.resamplePanel.x
|
||||
: (clipPanel
|
||||
? lane.clipPanel.x
|
||||
: (centerAxis
|
||||
? lane.edgeCenterPanel.x
|
||||
: lane.edgePanel.x)))));
|
||||
const double storedY = meanFilter ? lane.meanFilterPanel.y
|
||||
: (weakPeak ? lane.weakPeakPanel.y
|
||||
: (freeMarker ? lane.freeMarkerPanel.y
|
||||
: (resamplePanel
|
||||
? lane.resamplePanel.y
|
||||
: (clipPanel
|
||||
? lane.clipPanel.y
|
||||
: (centerAxis
|
||||
? lane.edgeCenterPanel.y
|
||||
: lane.edgePanel.y)))));
|
||||
const double storedX = panelState.x;
|
||||
const double storedY = panelState.y;
|
||||
int openPanelOrdinal = 0;
|
||||
{
|
||||
// ⚠️ 错开量用「**当前真正显示出来的面板**中排在本面板之前的个数」:
|
||||
@@ -626,37 +588,18 @@ namespace jdi
|
||||
// ⚠️ 不能用 `laneIndex`(上百个网格时会把面板推到右下角);
|
||||
// ⚠️ 也不能只看 `*Panel.open`:该标志**默认就是 true**,必须同时看功能是否启用
|
||||
// (与 `EdgePanelLayoutFor` 的 `enabled && open` 判定一致)。
|
||||
const auto shown = [](const Lane& lane, EdgePanelKind panelKind) -> bool
|
||||
const auto shown = [](const Lane& panelLane, EdgePanelKind panelKind) -> bool
|
||||
{
|
||||
switch (panelKind)
|
||||
{
|
||||
case EdgePanelKind::COUNT:
|
||||
return lane.edgeCount && lane.edgePanel.open;
|
||||
case EdgePanelKind::CENTER:
|
||||
return lane.edgeCenter && lane.edgeCenterPanel.open;
|
||||
case EdgePanelKind::MEAN:
|
||||
return lane.meanFilter && lane.meanFilterPanel.open;
|
||||
case EdgePanelKind::PEAK:
|
||||
return lane.weakPeak && lane.weakPeakPanel.open;
|
||||
case EdgePanelKind::MARK:
|
||||
return lane.freeMarker && lane.freeMarkerPanel.open;
|
||||
case EdgePanelKind::RESAMPLE:
|
||||
return lane.resample && lane.resamplePanel.open;
|
||||
case EdgePanelKind::CLIP:
|
||||
return lane.clip && lane.clipPanel.open;
|
||||
}
|
||||
return false;
|
||||
return LanePanelEnabled(panelLane, panelKind) &&
|
||||
LanePanelStateOf(panelLane, panelKind).open;
|
||||
};
|
||||
static const EdgePanelKind kOrder[7] = {EdgePanelKind::COUNT, EdgePanelKind::CENTER,
|
||||
EdgePanelKind::MEAN, EdgePanelKind::PEAK,
|
||||
EdgePanelKind::MARK, EdgePanelKind::RESAMPLE,
|
||||
EdgePanelKind::CLIP};
|
||||
// ⚠️ 面板错开序数按 `kEdgePanelKinds` 的固定顺序统计(与绘制 / 命中同源)。
|
||||
int openSeen = 0;
|
||||
bool found = false;
|
||||
for (std::size_t lane = 0; lane < m_lanes.size() && !found; ++lane)
|
||||
{
|
||||
const Lane& tabLane = Tab().Lanes()[lane];
|
||||
for (const EdgePanelKind panelKind : kOrder)
|
||||
for (const EdgePanelKind panelKind : kEdgePanelKinds)
|
||||
{
|
||||
if (!shown(tabLane, panelKind))
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user