均值面板越界根因 + 网格线进入主题配色 + 条目栏悬停/整行点击 + 均值点数下限 1
1. 「元素超出浮动面板」真根因(用户 2026-10-30 报告的截图)
- 绘制侧 PaintEdgeCursor 的 itemized 仍是 (centerAxis || meanFilter || weakPeak),
而布局侧 EdgePanelLayoutFor 早已是 (centerAxis || weakPeak)。
于是均值滤波面板被旧的「逐条目」分支**再画一遍**(每行名称 + 复选框,且没有任何裁切),
滚动后那些行的坐标是负值/越界 ⇒ 直接画到标题栏上。
- 修法:绘制侧与布局侧统一;旧分支的兜底循环跳过条件补 meanFilter。
底部「构建为新信号」由共享的 if (hasButton) 绘制,不受影响。
- 顺带删除「只画完全落在内容区里的行」的 fullyInside 门控:真因修掉后
g.SetClip(layout.content) 已足够,半截行正常显示,滚动观感连续。
2. 条目栏交互(与「自由标记」分组栏一致)
- 整行可点:复选框区 = 切换是否预览;已启用 = 展开/收起参数行;未启用 = 直接开始预览。
命中只要求点落在 layout.content 内(不再要求整行在内容区内),因此半截行也能操作。
- 悬停行 → 对应预览曲线高亮:新增 m_meanRowHoverLane / m_meanRowHoverRef,
由 OnMouseMove 维护、OnMouseLeave 与 InvalidateDerivedCaches 清除;
PaintDerivedCurve/PaintMeanFilterCurve/PaintWeakPeakCurve 新增 bool highlight,
先画 +5px 半透明同色光晕再把线加粗,行头叠一层 accent;悬停态变化会 InvalidateSceneCache。
3. 均值点数下限 1(用户要求:不可以为 0)
- kMeanFilterPointsMin 0 → 1;输入提交用 centerTarget ? 0 : kMeanFilterPointsMin
(中心轴边沿计数沿用旧语义 0 = 不平滑);预览与构建请求都再夹一次下限,
即使条目被外部写成 0,渲染/构建结果与 1 点逐位一致。
4. 网格线颜色成为主题配色的一部分
- struct Theme 新增 laneBg(网格叠底色);NormalizePlotContrast → FinalizeTheme,
先解 laneBg = EnsureContrast(plotBg, cardBg, 1.03),再让 gridWeak/gridStrong/
axisLine/borderStrong 统一对 laneBg 归一(1.30 / 1.70 / 2.10 / 1.70)。
- 四个主题各自给出显式取值:Dark 的网格线对叠底色原本只有 1.071(几乎不可见)⇒ 现 ≥1.30;
其它三个主题同步微调,网格可见性一致。ThemeLaneBackground 返回 laneBg。
5. 行三角尺寸统一
- 新增 kEdgePanelRowTriangleSize = 12 逻辑像素,均值滤波行与自由标记分组栏共用;
标题栏的 kEdgePanelDisclosureWidth = 20 保持不变。
6. 均值面板滚动条与文本
- 滚动条必须在 g.Restore(meanSave) 之后绘制(它在内容裁剪区之外,裁剪内画会被整条裁掉)。
- 滑块标签/数值改用 UiTextClipped(..., layout.content)(GDI 文本不受 GDI+ 裁剪约束)。
验证(全部离屏)
uicheck 69/69、lbcheck 21/21、lbresid 5/5、lbzorder 4/4、lbcovr 7/7、lbpanel 10/10、
derivecheck 16/16、round15check 28/28、themecheck 17/17、.preflight/meancheck 17/17;
.preflight/meanpix:滚到顶/中/底时标题栏与面板外均为 0 像素差异,内容区正常滚动;
rendercheck:A–H 八个场景哈希与基线完全一致;
make release 零 warning(805,376 B);make debug 零 warning。
同步文档:Documents/agent_mem.md 追加「2026-10-30 第十七轮」,
并把第十六轮里「均值点数(0…上限)」「命中要求行完全落在内容区里」两条改成现行做法。
This commit is contained in:
1 parent
bdd703b88b
commit
2d83b494a3
9 files changed
+396
-100
No files matched your search
@@ -2241,9 +2241,12 @@ namespace jdi
|
||||
* @param [IN] lane 网格绘制信息。
|
||||
* @param [IN] curve 曲线数值数组(缺失处为 NaN)。
|
||||
* @param [IN] curveBegin `curve[0]` 对应的采样下标。
|
||||
* @param [IN] highlight 是否高亮(鼠标悬停在对应的面板条目上时):
|
||||
* 先画一圈半透明的"光晕"再把曲线本身画得更粗更亮,让用户一眼看出这条预览曲线对应哪个条目。
|
||||
*/
|
||||
void PaintDerivedCurve(gd::Graphics& g, const ResolvedSignal& resolved, const LaneVisual& lane,
|
||||
const std::vector<float>& curve, std::size_t curveBegin) const;
|
||||
const std::vector<float>& curve, std::size_t curveBegin,
|
||||
bool highlight = false) const;
|
||||
|
||||
/**
|
||||
* @brief 取得某个采样区间内的派生曲线(带缓存)。
|
||||
@@ -2465,9 +2468,10 @@ namespace jdi
|
||||
* @param [IN] lane 网格绘制信息。
|
||||
* @param [IN] points 均值点数 X(滑平半径)。
|
||||
* @param [IN] iterations 迭代次数 N(至少 1)。
|
||||
* @param [IN] highlight 是否高亮(鼠标悬停在该网格均值滤波面板的对应条目上)。
|
||||
*/
|
||||
void PaintMeanFilterCurve(gd::Graphics& g, const ResolvedSignal& resolved, const LaneVisual& lane,
|
||||
int points, int iterations) const;
|
||||
int points, int iterations, bool highlight = false) const;
|
||||
|
||||
/**
|
||||
* @brief 绘制某条信号的弱峰调整曲线(与均值滤波曲线同一配色派生规则)。
|
||||
@@ -2476,9 +2480,10 @@ namespace jdi
|
||||
* @param [IN] lane 网格绘制信息。
|
||||
* @param [IN] amountPercent 弱峰调整幅度(-400–400)。
|
||||
* @param [IN] iterations 迭代次数 N(1–10)。
|
||||
* @param [IN] highlight 是否高亮(鼠标悬停在该网格弱峰调整面板的对应条目上)。
|
||||
*/
|
||||
void PaintWeakPeakCurve(gd::Graphics& g, const ResolvedSignal& resolved, const LaneVisual& lane,
|
||||
int amountPercent, int iterations) const;
|
||||
int amountPercent, int iterations, bool highlight = false) const;
|
||||
|
||||
/**
|
||||
* @brief 数据点标记的位置与"越界方向"(用于决定画圆点还是贴边三角)。
|
||||
@@ -2862,6 +2867,18 @@ namespace jdi
|
||||
/** 「弱峰调整」每行滑块右侧的复位控件是否处于悬停态(用于“进入/离开”时只提示一次)。 */
|
||||
bool m_peakResetHover = false;
|
||||
|
||||
/**
|
||||
* @brief 上一帧鼠标悬停在「均值滤波 / 弱峰调整」面板的哪个**条目栏**上。
|
||||
*
|
||||
* 用途(用户 2026-10-30 要求):悬停某条信号的条目栏时,把该信号的**预览曲线**
|
||||
* 高亮出来(画一圈光晕 + 加粗),这样"列表里这一行 ↔ 网格里那条曲线"一眼对应。
|
||||
*
|
||||
* 与 `m_freeMarkerRowHover*` 同一套路:只在悬停状态**变化**时返回 `changed`,
|
||||
* 避免每帧都请求重绘。
|
||||
*/
|
||||
int m_meanRowHoverLane = -1;
|
||||
SignalRef m_meanRowHoverRef;
|
||||
|
||||
// ---------------------------------------------------------------- 自由标记
|
||||
|
||||
/** 最近一次解析出的「自由标记」跟随数据点(绘制与命中共用)。 */
|
||||
|
||||
@@ -384,6 +384,15 @@ namespace jdi
|
||||
*/
|
||||
inline const float kEdgePanelDisclosureWidth = 20.0f;
|
||||
|
||||
/**
|
||||
* @brief 面板内**条目行 / 分组栏**左侧展开三角的边长(逻辑像素)。
|
||||
*
|
||||
* ⚠️ 与标题栏的 `kEdgePanelDisclosureWidth`(20)**刻意不同**:行高只有 22 逻辑像素,
|
||||
* 20 的三角会把整行顶满、显得又大又笨(用户 2026-10-30 报告)。
|
||||
* 「均值滤波」的条目栏与「自由标记」的分组栏共用本值(12),观感完全一致。
|
||||
*/
|
||||
inline const float kEdgePanelRowTriangleSize = 12.0f;
|
||||
|
||||
// ⚠️ 这里曾有 `kFreeMarkerHoverTolerance = 8`(旧的非光标模式“纵向贴近”容差)。
|
||||
// 用户 2026-10-22 要求把自由标记的触发范围与「常规状态下触发信号曲线高亮」**统一**,
|
||||
// 因此现在直接复用 `kSignalHitTolerance`(6 逻辑像素)并改判“到折线的垂直距离”
|
||||
@@ -559,8 +568,14 @@ namespace jdi
|
||||
*/
|
||||
inline const wchar_t* const kMeanFilterPointsSliderLabel = L"均值点数";
|
||||
inline const wchar_t* const kMeanFilterIterationsSliderLabel = L"迭代次数";
|
||||
/** 「均值点数」下限(窗口 = 2X+1 ⇒ X=0 就是原信号)。 */
|
||||
inline const int kMeanFilterPointsMin = 0;
|
||||
/**
|
||||
* @brief 「均值点数」下限。
|
||||
*
|
||||
* ⚠️ **必须是 1**(用户 2026-10-30 要求):窗口 = `2X+1`,`X = 0` 等于"不做任何平滑",
|
||||
* 滑块拖到最左端时预览曲线与原始波形完全重合 —— 那不像"滤波",用户会以为功能坏了。
|
||||
* 下限取 1 ⇒ 最左端是 3 点均值,始终有可见的平滑效果。
|
||||
*/
|
||||
inline const int kMeanFilterPointsMin = 1;
|
||||
/** 「均值点数」滑块的默认上限(用户可点击数值改成其它正整数)。 */
|
||||
inline const int kMeanFilterPointsDefaultMax = 50;
|
||||
/** 「均值点数」上限允许的最大值(防止输入一个天文数字把滤波窗口撑爆)。 */
|
||||
|
||||
Reference in new issue
Block a user