Code Review :代码审查 + 产物体积 −12.2%(890,880 → 782,336 B)+ 面板结构收敛 + 离屏验证工具入库 #3

Merged
LuChiChick merged 22 commits from Code_Review into dev 2026-11-04 09:54:20 +00:00
2 changed files with 66 additions and 62 deletions
Showing only changes of commit 85aaed55f6 - Show all commits

No files matched your search

+40
View File
@@ -2070,6 +2070,7 @@ namespace jdi
/** @brief 「均值滤波」面板每个信号标题栏左侧的**展开 / 收起三角**(仅勾选后出现)。 */ /** @brief 「均值滤波」面板每个信号标题栏左侧的**展开 / 收起三角**(仅勾选后出现)。 */
std::vector<gd::RectF> rowTriangles; std::vector<gd::RectF> rowTriangles;
std::vector<SignalRef> rowRefs; std::vector<SignalRef> rowRefs;
/** /**
* @brief 「自由标记」面板的一行(一个固定点)。 * @brief 「自由标记」面板的一行(一个固定点)。
* *
@@ -2210,6 +2211,45 @@ namespace jdi
MARKER_COL_TIME = 4, MARKER_COL_TIME = 4,
MARKER_COL_DT = 5 MARKER_COL_DT = 5
}; };
/**
* @brief 追加一**行**(条目栏 / 名称 / 三角 / 复选框),其余列一律补空矩形。
*
* ⚠️⚠️ 这是**唯一**允许新增行的入口。面板每行对应 18 个平行数组
* (`rowRefs` / `rowHeaders` / `rowChecks` / `rowLevelTracks` / …);
* 如果每个排版分支各写一遍 `push_back`,只要某分支漏推一项,
* 那一列之后的所有行都会**读到别人的矩形**("改一次布局就出错"的典型机制)。
* 现在:新增行的分支只调本函数,**新增一列只需改这里一处**;
* 参数行 / 重采样行则用 `rowXxx.back() = …` 赋值(长度天然对齐)。
*
* @param [IN] ref 该行对应的信号。
* @param [IN] header 信号色叠底条目栏(整行宽度)。
* @param [IN] nameRect 名称(表格里的名称列)。
* @param [IN] triangle 左侧展开 / 收起三角(不适用时传空矩形)。
* @param [IN] check 右端复选框。
*/
void AppendRow(const SignalRef& ref, const gd::RectF& header, const gd::RectF& nameRect,
const gd::RectF& triangle, const gd::RectF& check)
{
rowRefs.push_back(ref);
rowHeaders.push_back(header);
rowNameRects.push_back(nameRect);
rowTriangles.push_back(triangle);
rowChecks.push_back(check);
rowPoints.push_back(gd::RectF());
rowIterations.push_back(gd::RectF());
rowStats.push_back(gd::RectF());
rowLevelTracks.push_back(gd::RectF());
rowLevelValues.push_back(gd::RectF());
rowLevelResets.push_back(gd::RectF());
rowIterTracks.push_back(gd::RectF());
rowIterValues.push_back(gd::RectF());
rowIterResets.push_back(gd::RectF());
rowInfoMaxInterval.push_back(gd::RectF());
rowInfoMinInterval.push_back(gd::RectF());
rowIntervalField.push_back(gd::RectF());
rowFrequencyField.push_back(gd::RectF());
}
}; };
/** /**
+26 -62
View File
@@ -735,22 +735,12 @@ namespace jdi
{ {
continue; continue;
} }
layout.rowRefs.push_back(ref); // ⚠️ 行的追加走 `AppendRow()`(**唯一入口**):18 个平行数组一次补齐,
layout.rowHeaders.push_back(gd::RectF(contentLeft, rowY, innerWidth, rowH)); // 不会出现"某个分支漏推一列 ⇒ 该列之后所有行读到别人的矩形"。
layout.rowNameRects.push_back( layout.AppendRow(ref, gd::RectF(contentLeft, rowY, innerWidth, rowH),
gd::RectF(contentLeft + 4.0f * m_scale, rowY, gd::RectF(contentLeft + 4.0f * m_scale, rowY,
std::max(10.0f, nameColumn - 8.0f * m_scale), rowH)); std::max(10.0f, nameColumn - 8.0f * m_scale), rowH),
layout.rowTriangles.push_back(gd::RectF()); gd::RectF(), gd::RectF());
layout.rowChecks.push_back(gd::RectF());
layout.rowPoints.push_back(gd::RectF());
layout.rowIterations.push_back(gd::RectF());
layout.rowStats.push_back(gd::RectF());
layout.rowLevelTracks.push_back(gd::RectF());
layout.rowLevelValues.push_back(gd::RectF());
layout.rowLevelResets.push_back(gd::RectF());
layout.rowIterTracks.push_back(gd::RectF());
layout.rowIterValues.push_back(gd::RectF());
layout.rowIterResets.push_back(gd::RectF());
rowY += rowH; rowY += rowH;
} }
} }
@@ -886,42 +876,26 @@ namespace jdi
checked = (item != nullptr); checked = (item != nullptr);
itemCollapsed = (item != nullptr && item->collapsed); itemCollapsed = (item != nullptr && item->collapsed);
} }
layout.rowRefs.push_back(ref);
// 组头(信号色叠底):整行宽度,左侧三角(仅勾选时)+ 名称,右端复选框。 // 组头(信号色叠底):整行宽度,左侧三角(仅勾选时)+ 名称,右端复选框。
layout.rowHeaders.push_back( // ⚠️ 行的追加走 `AppendRow()`(**唯一入口**):18 个平行数组一次补齐,
gd::RectF(contentLeft, rowY, innerWidth, groupRow)); // 不会出现"某个分支漏推一列 ⇒ 该列之后所有行读到别人的矩形"。
layout.rowNameRects.push_back(gd::RectF(contentLeft, rowY, innerWidth, groupRow)); // 下面的参数行 / 重采样行一律用 `rowXxx.back() = …` **赋值**(长度天然对齐)。
layout.rowTriangles.push_back( layout.AppendRow(
ref, gd::RectF(contentLeft, rowY, innerWidth, groupRow),
gd::RectF(contentLeft, rowY, innerWidth, groupRow),
(checked && !clipPanel) (checked && !clipPanel)
? gd::RectF(contentLeft + 3.0f * m_scale, ? gd::RectF(contentLeft + 3.0f * m_scale,
rowY + (groupRow - kEdgePanelRowTriangleSize * m_scale) * 0.5f, rowY + (groupRow - kEdgePanelRowTriangleSize * m_scale) * 0.5f,
kEdgePanelRowTriangleSize * m_scale, kEdgePanelRowTriangleSize * m_scale,
kEdgePanelRowTriangleSize * m_scale) kEdgePanelRowTriangleSize * m_scale)
: gd::RectF()); : gd::RectF(),
layout.rowChecks.push_back(
gd::RectF(contentLeft + innerWidth - closeSize - 4.0f * m_scale, gd::RectF(contentLeft + innerWidth - closeSize - 4.0f * m_scale,
rowY + (groupRow - closeSize) * 0.5f, closeSize, closeSize)); rowY + (groupRow - closeSize) * 0.5f, closeSize, closeSize));
layout.rowPoints.push_back(gd::RectF());
layout.rowIterations.push_back(gd::RectF());
layout.rowStats.push_back(gd::RectF());
rowY += groupRow; rowY += groupRow;
// 参数行:只有勾选且未收起时才有几何(未勾选的行两者都是空矩形)。 // 参数行:只有勾选且未收起时才有几何(未勾选的行两者都是空矩形)。
if (!checked || itemCollapsed || clipPanel) if (!checked || itemCollapsed || clipPanel)
{ {
layout.rowLevelTracks.push_back(gd::RectF());
layout.rowLevelValues.push_back(gd::RectF());
layout.rowLevelResets.push_back(gd::RectF());
layout.rowIterTracks.push_back(gd::RectF());
layout.rowIterValues.push_back(gd::RectF());
layout.rowIterResets.push_back(gd::RectF());
if (resamplePanel)
{
layout.rowInfoMaxInterval.push_back(gd::RectF());
layout.rowInfoMinInterval.push_back(gd::RectF());
layout.rowIntervalField.push_back(gd::RectF());
layout.rowFrequencyField.push_back(gd::RectF());
}
continue; continue;
} }
if (resamplePanel) if (resamplePanel)
@@ -929,27 +903,17 @@ namespace jdi
// 「重采样」四行:① 最大间隔(只读)② 最小间隔(只读) // 「重采样」四行:① 最大间隔(只读)② 最小间隔(只读)
// ③ 重采样间隔(输入)④ 重采样频率(输入,与③联动)。 // ③ 重采样间隔(输入)④ 重采样频率(输入,与③联动)。
// 每行 = 左侧标签 + 右侧数值/输入框区域。 // 每行 = 左侧标签 + 右侧数值/输入框区域。
layout.rowLevelTracks.push_back(gd::RectF()); layout.rowInfoMaxInterval.back() = gd::RectF(contentLeft, rowY, innerWidth, sliderRow);
layout.rowLevelValues.push_back(gd::RectF());
layout.rowLevelResets.push_back(gd::RectF());
layout.rowIterTracks.push_back(gd::RectF());
layout.rowIterValues.push_back(gd::RectF());
layout.rowIterResets.push_back(gd::RectF());
layout.rowInfoMaxInterval.push_back(
gd::RectF(contentLeft, rowY, innerWidth, sliderRow));
rowY += sliderRow; rowY += sliderRow;
layout.rowInfoMinInterval.push_back( layout.rowInfoMinInterval.back() = gd::RectF(contentLeft, rowY, innerWidth, sliderRow);
gd::RectF(contentLeft, rowY, innerWidth, sliderRow));
rowY += sliderRow; rowY += sliderRow;
// 输入行的**数值矩形**靠右对齐,宽度取剩余可用宽度(绘制框与编辑框同源)。 // 输入行的**数值矩形**靠右对齐,宽度取剩余可用宽度(绘制框与编辑框同源)。
const float fieldLeft = contentLeft + rowLabelColumn + 8.0f * m_scale; const float fieldLeft = contentLeft + rowLabelColumn + 8.0f * m_scale;
const float fieldWidth = const float fieldWidth =
std::max(24.0f * m_scale, innerWidth - rowLabelColumn - 8.0f * m_scale); std::max(24.0f * m_scale, innerWidth - rowLabelColumn - 8.0f * m_scale);
layout.rowIntervalField.push_back( layout.rowIntervalField.back() = gd::RectF(fieldLeft, rowY, fieldWidth, sliderRow);
gd::RectF(fieldLeft, rowY, fieldWidth, sliderRow));
rowY += sliderRow; rowY += sliderRow;
layout.rowFrequencyField.push_back( layout.rowFrequencyField.back() = gd::RectF(fieldLeft, rowY, fieldWidth, sliderRow);
gd::RectF(fieldLeft, rowY, fieldWidth, sliderRow));
rowY += sliderRow; rowY += sliderRow;
continue; continue;
} }
@@ -961,22 +925,22 @@ namespace jdi
} }
const gd::RectF pointsTrack(trackLeft, rowY + (sliderRow - trackHeight) * 0.5f, const gd::RectF pointsTrack(trackLeft, rowY + (sliderRow - trackHeight) * 0.5f,
trackWidth, trackHeight); trackWidth, trackHeight);
layout.rowLevelTracks.push_back(pointsTrack); layout.rowLevelTracks.back() = pointsTrack;
layout.rowLevelValues.push_back( layout.rowLevelValues.back() =
gd::RectF(pointsTrack.X + pointsTrack.Width + 6.0f * m_scale, rowY, valueColumn, gd::RectF(pointsTrack.X + pointsTrack.Width + 6.0f * m_scale, rowY, valueColumn,
sliderRow)); sliderRow);
layout.rowLevelResets.push_back( layout.rowLevelResets.back() =
gd::RectF(resetLeft, rowY + (sliderRow - resetSize) * 0.5f, resetSize, resetSize)); gd::RectF(resetLeft, rowY + (sliderRow - resetSize) * 0.5f, resetSize, resetSize);
rowY += sliderRow; rowY += sliderRow;
const gd::RectF iterTrack(trackLeft, rowY + (sliderRow - trackHeight) * 0.5f, const gd::RectF iterTrack(trackLeft, rowY + (sliderRow - trackHeight) * 0.5f,
trackWidth, trackHeight); trackWidth, trackHeight);
layout.rowIterTracks.push_back(iterTrack); layout.rowIterTracks.back() = iterTrack;
layout.rowIterValues.push_back( layout.rowIterValues.back() =
gd::RectF(iterTrack.X + iterTrack.Width + 6.0f * m_scale, rowY, valueColumn, gd::RectF(iterTrack.X + iterTrack.Width + 6.0f * m_scale, rowY, valueColumn,
sliderRow)); sliderRow);
layout.rowIterResets.push_back( layout.rowIterResets.back() =
gd::RectF(resetLeft, rowY + (sliderRow - resetSize) * 0.5f, resetSize, resetSize)); gd::RectF(resetLeft, rowY + (sliderRow - resetSize) * 0.5f, resetSize, resetSize);
rowY += sliderRow; rowY += sliderRow;
} }
} }