Files
Just-DataInspector/Components/Shared/Inc/PopupMenuInternal.hpp
T
DeepSeek-V4.1-Flash bdd703b88b 主题自适应配色 + 预览曲线连续配色 + 样式区复位按钮 + 均值滤波面板重做 + 面板缓存环带残留 + 调试层序 + 自由标记选取与性能
① 主题自适应(`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` 第十六轮(含补丁脚本与编码/行尾踩坑)。
2026-10-30 03:10:51 +08:00

77 lines
3.7 KiB
C++

#ifndef __POPUP_MENU_INTERNAL_HPP__
#define __POPUP_MENU_INTERNAL_HPP__
// PopupMenu 的内部共享定义(尺寸常量与绘制辅助函数)。
//
// 实现按职责分片后(PopupMenu.cpp = 交互与生命周期 / PopupMenuLayout.cpp = 几何与排版 /
// PopupMenuPaint.cpp = 绘制),三片都要用到同一批尺寸常量与「还原」图标绘制,
// 因此统一放在这里:命名空间 `pmdetail`、全部 `inline` / `constexpr`,跨 TU 安全。
//
// ⚠️ 这里的常量同时决定**排版与绘制**:改数值会同时影响两边(这是刻意的,避免两套真相)。
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
#include <algorithm>
#include <cmath>
#include <cstdint>
#include "Theme.hpp"
#include "PaintUtil.hpp"
namespace jdi
{
namespace pmdetail
{
constexpr float kRowHeight = 27.0f; /**< 普通项高度。 */
constexpr float kHeaderHeight = 22.0f; /**< 分组标题高度。 */
constexpr float kSeparatorHeight = 9.0f; /**< 分隔线高度。 */
constexpr float kSwatchRowHeight = 32.0f; /**< 色块行高度。 */
constexpr float kPadV = 5.0f; /**< 菜单上下内边距。 */
constexpr float kPadH = 5.0f; /**< 菜单左右内边距。 */
constexpr float kItemPad = 8.0f; /**< 条目内文本的左右内缩(所有条目统一)。 */
constexpr float kMarkerColumn = 18.0f; /**< 条目**右侧**的选中标记列宽度(对勾画在这里)。 */
constexpr float kMarkerGap = 4.0f; /**< 文本与右侧标记列之间的间隔。 */
constexpr float kMinWidth = 148.0f; /**< 菜单最小宽度。 */
constexpr float kMaxWidth = 340.0f; /**< 菜单最大宽度。 */
constexpr float kCorner = 6.0f; /**< 菜单圆角半径。 */
constexpr float kSwatchSize = 22.0f; /**< 色块尺寸。 */
constexpr float kSwatchGap = 5.0f; /**< 色块间距。 */
constexpr float kEditFieldWidth = 88.0f; /**< EDIT 项输入框宽度。 */
constexpr float kEditFieldGap = 6.0f; /**< 说明文字与输入框之间的最小间隔。 */
constexpr float kEditFieldPadV = 5.0f; /**< 输入框上下内缩。 */
constexpr float kSubArrowSize = 4.5f; /**< 子菜单指示箭头尺寸。 */
constexpr float kSubOverlap = 2.0f; /**< 子菜单与主菜单重叠的宽度(避免中间露出缝隙)。 */
constexpr float kHeaderIconSize = 16.0f; /**< `HEADER_ACTION` 右侧图标按钮的边长。 */
constexpr float kHeaderIconGap = 6.0f; /**< 标题文字与图标按钮之间的最小间隔。 */
constexpr float kRowFieldWidth = 132.0f; /**< 整行输入框(无说明文字)的默认宽度。 */
constexpr float kScrollBarWidth = 6.0f; /**< 可滚动菜单的滚动条宽度。 */
constexpr float kScrollBarGap = 4.0f; /**< 滚动条与条目内容之间的间距。 */
constexpr float kScrollBarMinThumb = 22.0f; /**< 滚动条滑块的最小高度。 */
/**
* @brief 绘制「还原/重置」图标(逆时针回环箭头)。
*
* 用一段圆弧 + 一个三角箭头拼成,与界面里其它自绘图标(加号、叉号)保持同一笔画风格。
* 不依赖任何字体或资源,因此在任何 DPI 下都清晰。
*
* @param [IN,OUT] g 绘图上下文。
* @param [IN] rect 图标外接矩形(正方形)。
* @param [IN] color 笔画颜色。
* @param [IN] scale DPI 缩放比例。
*/
inline void PaintResetIcon(gd::Graphics& g, const gd::RectF& rect, std::uint32_t color, float scale)
{
// 唯一实现见 `PaintUtil.hpp`(信号样式区的复位按钮、弱峰调整面板的复位控件共用)。
UiPaintResetIcon(g, rect, color, scale);
}
} // namespace pmdetail
using namespace pmdetail;
} // namespace jdi
#endif // __POPUP_MENU_INTERNAL_HPP__