主题自适应配色 + 预览曲线连续配色 + 样式区复位按钮 + 均值滤波面板重做 + 面板缓存环带残留 + 调试层序 + 自由标记选取与性能

① 主题自适应(`Theme.cpp`):新增 `SrgbLuminance` / `ContrastRatio` / `EnsureContrast` /
   `MixToLuminance` / `ThemeLaneBackground`;四套主题的结构色(gridWeak 1.30 / gridStrong 1.65 /
   axisLine 2.10 / borderStrong 1.70)按底色自动校正,Solarised Light 逐位不变;网格叠底改用
   `ThemeLaneBackground()`(4 处),深色主题下网格层与绘图区底色可辨。
② 派生预览曲线(`HighContrastDerived`)重写为**连续**方案:方向沿信号所在侧远离底色,
   目标亮度 = max(与底色对比度 3.2, 信号亮度 ± 0.18),再按亮度平滑混色;调用点传入真实网格底色
   (旧实现默认写死 Solarised Light 底色 ⇒ 深色主题永远选到更暗的那一侧、几乎看不见)。
③ 信号样式区「线宽 / 透明度」两行右侧新增**复位按钮**(`UiPaintResetIcon` 成为唯一实现,
   菜单/弱峰面板/样式区共用同一套笔画);默认线宽统一到 `DefaultSignalLineWidth(finiteCount)`
   (单点信号取 10.0)。按钮右边界与内容列对齐,内容列过窄时整列不显示。
④ 「均值滤波」面板重做:信号色叠底标题栏 + 复选框 + 展开三角 + 「均值点数 / 迭代次数」两行滑块
   (点击数值可改滑块上限、右侧复位)+ 内容区滚动;新增 `MeanFilterItem::{maxPoints,maxIterations,
   collapsed}` 与 `Lane::meanFilterScroll`,缓存键同步补全。
⑤ 浮动面板命中像素缓存时只贴**面板圆角形状之内**的像素(`CreateRoundRectRgn` 裁剪)并按本帧重画投影
   ⇒ 中键移视界后面板周围不再出现一圈旧波形。
⑥ 显示布局边界:每个浮动面板**独占一个绘制层**(按 `m_panelOrder` 递增),绘制侧
   `UiSetTextLayer` 在同一循环内同步推进 ⇒ 下层面板的边框/文字不再画到上层面板上。
⑦ 自由标记:采样候选距离改为**二维欧氏距离**(单点信号不再在整幅宽度内吸住光标),
   纵向光标画在鼠标位置、圆点落在真实采样点(新增 `FreeMarkerProbe::pointX`);
   `MinorCellSparse` 只对胜出信号算一次;折线缓存容量改为 `max(64, 信号数×2)` 且查找改为
   单键哈希 ⇒ MF4 的 285 信号合并网格中 `ProbeFreeMarker` 平均 0.11ms。

验证:`.preflight` 探针重建(`panelcheck` 71/71、`markercheck` 13/13、`ringcheck` 6/6,合计 90 条,
LTO 目标文件上复跑同样全绿);`make release` / `make debug` 零警告;产物 815,104 B。
文档:`agent_mem.md` 第十六轮(含补丁脚本与编码/行尾踩坑)。
This commit is contained in:
DeepSeek-V4.1-Flash committed 2026-10-30 03:10:51 +08:00
1 parent 71195c4c48
commit bdd703b88b
24 files changed
+1815 -256

No files matched your search

+42
View File
@@ -48,6 +48,24 @@ namespace jdi
*/
constexpr float kSinglePointSignalLineWidth = kSignalLineWidthMax;
/**
* @brief 普通信号的**默认线宽**(逻辑像素):新建信号时写入,也是样式区「复位」按钮要恢复的值。
*
* ⚠️ 只有这一个来源:`BuildSignalGroup` 的初始化与信号面板线宽复位都用它,
* 否则改了一处就会与"新建信号"的观感不一致。
*/
constexpr float kDefaultSignalLineWidth = 1.0f;
/**
* @brief 按有效采样点数取该信号**默认的线宽**(复位按钮与新建信号共用同一判定)。
* @param [IN] finiteCount 有效采样点数。
* @return 默认线宽(单数据点信号 = 最大线宽,其余 = `kDefaultSignalLineWidth`)。
*/
inline float DefaultSignalLineWidth(std::size_t finiteCount)
{
return (finiteCount == 1) ? kSinglePointSignalLineWidth : kDefaultSignalLineWidth;
}
/**
* @brief 「稀疏信号」缓存有效采样点时刻/取值的上限(有效点不超过该值才缓存)。
*
@@ -752,6 +770,21 @@ namespace jdi
SignalRef ref; /**< 目标信号。 */
int points = 5; /**< 均值点数 X(滑平半径,窗口 = 2X+1)。 */
int iterations = 1; /**< 迭代次数 N(重复滤波次数,至少 1)。 */
/**
* @brief 「均值点数」滑块的**上限**(用户可点击滑块右侧数值改成其它正整数)。
*
* 滑块量程 = `1 … maxPoints`,`points` 恒被夹在该区间内。
*/
int maxPoints = 50;
/** @brief 「迭代次数」滑块的**上限**(同上,量程 = `1 … maxIterations`)。 */
int maxIterations = 10;
/**
* @brief 参数行是否被**收起**(只保留信号色叠底的标题栏)。
*
* 仅「均值滤波」面板使用:勾选后标题栏左侧出现展开三角,单击它切换收起/展开。
* 未勾选时没有参数行,本字段无意义。
*/
bool collapsed = false;
};
/** 中心轴边沿计数的平滑参数:与均值滤波共用同一结构与同一套语义。 */
@@ -1025,6 +1058,15 @@ namespace jdi
*/
float freeMarkerScroll = 0.0f;
/**
* @brief 「均值滤波」面板内容的滚动偏移(客户区像素,0 = 顶部)。
*
* 面板内容(每个信号的"信号色叠底标题栏 + 参数滑块行")超出可视高度时右侧出现滚动条;
* 底部的「构建为新信号」按钮**不参与**滚动(固定在面板底部)。
* 上百个信号合并到同一网格时它是必备的(否则面板会被顶出绘图区)。
*/
float meanFilterScroll = 0.0f;
/**
* @brief 「自由标记」面板里被**收起**的信号分组(点击分组栏切换)。
*
+4
View File
@@ -140,6 +140,8 @@ namespace jdi
bool freeMarkerShowDelta = false;
bool freeMarkerShowEnum = false;
std::vector<SignalRef> freeMarkerCollapsedGroups;
/** @brief 「均值滤波」面板内容的滚动偏移(详见 `Lane::meanFilterScroll`)。 */
float meanFilterScroll = 0.0f;
};
// 先记下每个信号原来所在网格的网格自身状态:
@@ -174,6 +176,7 @@ namespace jdi
carry.meanFilter = lane.meanFilter;
carry.meanFilterItems = lane.meanFilterItems;
carry.meanFilterPanel = lane.meanFilterPanel;
carry.meanFilterScroll = lane.meanFilterScroll;
carry.weakPeak = lane.weakPeak;
carry.weakPeakItems = lane.weakPeakItems;
carry.weakPeakPanel = lane.weakPeakPanel;
@@ -255,6 +258,7 @@ namespace jdi
lane.freeMarkerShowDelta = carry.freeMarkerShowDelta;
lane.freeMarkerShowEnum = carry.freeMarkerShowEnum;
lane.freeMarkerCollapsedGroups = carry.freeMarkerCollapsedGroups;
lane.meanFilterScroll = carry.meanFilterScroll;
};
// 收集全部可见信号引用。