refactor(panels): 面板静态特征收敛为唯一登记表 + 标记面板绘制分段(§17.6 第 1/2 项)
- 新增 pvdetail::PanelKindTraits + PanelTraitsOf(唯一 switch):标题 / 排版类别 / 滚动字段 / 面板状态 / 功能开关同表登记;新增面板只改「枚举 + 一行」, -Wswitch 仍在唯一登记点生效。PanelTitle 改为「前缀 + rangeSuffix 标志」, 不再依赖 switch(标题降级为数据,不再需要函数指针)。 - PaintPanelMarkerGroups(约 340 行)拆成 6 个具名函数,主函数只保留绘制顺序 (普通分组栏 -> 条目 -> 表头 -> 吸顶栏 -> 滚动条 -> 透明度行);纯搬移、0 字节变化。 - 顺手修正该函数体遗留的多余缩进。 验证:release/debug/tools 零 warning;UnitTests 260/19;OffscreenChecks -all 7/133; panels -mode compare 7 面板像素哈希逐项不变;rowgeom compare 965+7 / 1268+7 键 0 差异。 产物 781,824 -> 782,336 B(+512,全部来自登记表)。
This commit is contained in:
1 parent
a9f1563896
commit
0c26da07d2
8 files changed
+761
-453
No files matched your search
@@ -1201,7 +1201,8 @@ namespace jdi
|
||||
* @brief 设置某种面板的**内容滚动偏移**(客户区像素,0 = 顶部)—— 唯一实现。
|
||||
*
|
||||
* ⚠️ 下面七个 `SetLane*Scroll` 都只是本函数的一行转发(保留是为了不改调用点与原语义)。
|
||||
* 新增面板时**只需**在 `LanePanelScrollOf` / `PanelStyleOf` / `PanelTitle` 三处登记,
|
||||
* 新增面板时**只需**在 `pvdetail::PanelTraitsOf`(`PlotViewInternal.hpp`)加一行:
|
||||
* 标题 / 排版类别 / 滚动字段 / 面板状态 / 功能开关都在那一行里,
|
||||
* 不要再复制一份"取字段 → 夹取 → 比较 → 写回"的实现。
|
||||
*
|
||||
* @param [IN] laneIndex 网格下标。
|
||||
@@ -2574,6 +2575,39 @@ namespace jdi
|
||||
*/
|
||||
const std::vector<FreeMarkerContentEntry>& FreeMarkerContents(int laneIndex) const;
|
||||
|
||||
// ---- 「自由标记」面板内容绘制的**分段入口**(第 41 轮)-----------------------
|
||||
// `PaintPanelMarkerGroups` 只负责**顺序**(普通分组栏 → 条目 → 表头 → 吸顶分组栏 →
|
||||
// 滚动条 → 透明度滑块),各段的细节在这里。提取是纯搬移,
|
||||
// 判据 = `panels -mode compare`(像素哈希)+ `rowgeom -mode compare`(逐行几何)。
|
||||
// ⚠️ 顺序本身是硬约束:表头与吸顶分组栏必须画在条目**之后**,否则向上滚动的条目
|
||||
// 会盖住它们(这是原实现里唯一真正需要"读整段代码才看得见"的约束)。
|
||||
|
||||
/** @brief 把「自由标记」六列的实测文本宽度写回 `stored`(= `Lane::freeMarkerColumnWidths`)。 */
|
||||
void MeasureMarkerColumnWidths(const Lane& tabLane,
|
||||
const std::vector<FreeMarkerContentEntry>& contents,
|
||||
std::array<float, 6>& stored);
|
||||
|
||||
/** @brief 「自由标记」列分隔竖线(数据行与表头共用同一套列边界)。 */
|
||||
void PaintMarkerColumnSeparators(gd::Graphics& g, const EdgePanelLayout& layout, float y,
|
||||
float height);
|
||||
|
||||
/** @brief 「自由标记」一个信号分组栏(三角 + 名称 + `N 标记点` + ✕)。 */
|
||||
void PaintMarkerGroupBar(gd::Graphics& g, const EdgePanelLayout& layout, const Lane& tabLane,
|
||||
const EdgePanelLayout::MarkerGroup& group, std::size_t laneIndex);
|
||||
|
||||
/** @brief 「自由标记」一个固定点条目(六列 + 分隔线 + 行尾 ✕)。 */
|
||||
void PaintMarkerRow(gd::Graphics& g, const EdgePanelLayout& layout, const Lane& tabLane,
|
||||
const EdgePanelLayout::MarkerRow& markerRow,
|
||||
const FreeMarkerContentEntry& entry, std::size_t laneIndex);
|
||||
|
||||
/** @brief 「自由标记」一个展开分组的表头行(不透明底衬 + 六列标题)。 */
|
||||
void PaintMarkerTableHeader(gd::Graphics& g, const EdgePanelLayout& layout,
|
||||
const EdgePanelLayout::MarkerGroup& group);
|
||||
|
||||
/** @brief 「自由标记」底部「标记透明度」滑块行。 */
|
||||
void PaintMarkerOpacityRow(gd::Graphics& g, const EdgePanelLayout& layout, const Lane& tabLane,
|
||||
std::size_t laneIndex);
|
||||
|
||||
/** 按网格下标的「自由标记」内容缓存(`mutable`:只在绘制时按需重建)。 */
|
||||
mutable std::vector<FreeMarkerContentCache> m_freeMarkerContent;
|
||||
|
||||
|
||||
Reference in new issue
Block a user