目录规范化(Inc/Src)+「自由标记」第六轮交互调整

1) 目录规范化:所有 .hpp 只放 Inc,Src 只放 .cpp
   - 4 个 *Internal.hpp 从 Src 迁到 Inc(DataModel/Application/PlotView/SignalPanel)
   - Makefile 固化该约定(注释必须单独成行:写在同一行会把 CXX_INCLUDES_PATHS 整条注释掉)
   - include 全是扁平形式,搬家无需改任何 include

2) 常规模式 = 普通鼠标(未开启「自由标记点选取」)
   - ProbeFreeMarker 早退:不预览、不画纵向光标、单击不固定
   - 补 if (!hitCurve) continue:否则整列光标下 probe.ref 恒有效,任意位置都能固定
   - 固定点仍恒吸附到真实采样时刻;「已吸附」圆环只在稀疏判据成立时画

3) 两个显示开关:按钮改名「自由标记点选取」,其下新增「显示增量 | 显示枚举文本」
   - 默认关闭,只影响已固定点的胶囊文本;预览胶囊恒为「值 = 枚举」
   - 开关行计入面板高度与内容区高度

4) 面板六列:新增恒存在的「序号」列(组内 1 起)
   - 枚举列存在时,无枚举/对不上任何枚举项显示 N/A
   - 列与列之间画竖线;悬停某行时其它固定点封顶 50% 不透明度,移出恢复
   - 删除固定点 ✕ 的悬停浮动提示(PaintFreeMarkerTooltip 实现与声明全部移除)
   - 开启选取模式的网格上,信号悬停提示只显示信号名

5) 缓存键补齐
   - FreeMarkerContents 混入枚举表指纹(旧键会让加上枚举表后仍显示 N/A)
   - PanelSlotKey 混入两个新按钮矩形与开关状态

6) 注释/文档
   - 修正 FreeMarkerProbe、SetLaneFreeMarkerCursor、标记透明度等处的过期说明
   - 空态提示按是否开启选取模式区分文案

验证(全离屏,未占用鼠标/键盘/屏幕)
   - 新增 .preflight/mark5check 52/52
   - 回归:markcheck 67/67、mark4check 40/40、fixcheck 37/37、round3check 31/31、
     round4check 34/34、round5check 5/5、editcheck 20/20、convcheck 18/18、diag 19/19
   - check 136/137(唯一失败项为既有不稳定项,drift=15818 与改动前逐位相同)
   - make release / make debug 零警告;Release 产物 TargetCheck.exe 857,600 字节
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-23 15:50:55 +08:00
1 parent 79eebc281e
commit affb9cc340
12 files changed
+561 -187

No files matched your search

@@ -966,12 +966,22 @@ namespace jdi
// 滚动条与「标记透明度」滑块则是拖动类控件(上下 / 左右箭头)。
if (static_cast<EdgePanelKind>(panelKind) == EdgePanelKind::MARK)
{
// 底部「光标选取模式」切换按钮。
// 底部「自由标记点选取」切换按钮与两个显示开关。
if (layout.button.Width > 0.0f &&
UiPointInRect(layout.button, static_cast<float>(x), static_cast<float>(y)))
{
return LoadCursorW(nullptr, IDC_HAND);
}
if (layout.showDelta.Width > 0.0f &&
UiPointInRect(layout.showDelta, static_cast<float>(x), static_cast<float>(y)))
{
return LoadCursorW(nullptr, IDC_HAND);
}
if (layout.showEnum.Width > 0.0f &&
UiPointInRect(layout.showEnum, static_cast<float>(x), static_cast<float>(y)))
{
return LoadCursorW(nullptr, IDC_HAND);
}
if (layout.opacityTrack.Width > 0.0f &&
WeakPeakSliderHit(layout.opacityTrack, m_scale, static_cast<float>(x),
static_cast<float>(y)))
@@ -2285,13 +2295,27 @@ namespace jdi
if (kind == EdgePanelKind::MARK && m_tab != nullptr)
{
Lane& tabLane = m_tab->Lanes()[static_cast<std::size_t>(index)];
// 底部切换按钮「光标选取模式」(默认关闭)。
// 底部切换按钮「自由标记点选取」(默认关闭)。
if (layout.button.Width > 0.0f && UiPointInRect(layout.button, fx, fy))
{
ToggleLaneFreeMarkerCursor(index);
m_dragMode = PlotDragMode::NONE;
return true;
}
// 「显示增量」开关(只影响已固定点的显示;默认关闭)。
if (layout.showDelta.Width > 0.0f && UiPointInRect(layout.showDelta, fx, fy))
{
SetLaneFreeMarkerShowDelta(index, !tabLane.freeMarkerShowDelta);
m_dragMode = PlotDragMode::NONE;
return true;
}
// 「显示枚举文本」开关(只影响已固定点的显示;默认关闭)。
if (layout.showEnum.Width > 0.0f && UiPointInRect(layout.showEnum, fx, fy))
{
SetLaneFreeMarkerShowEnum(index, !tabLane.freeMarkerShowEnum);
m_dragMode = PlotDragMode::NONE;
return true;
}
// 「标记透明度」滑块:按下即写入该处数值并进入拖动。
if (layout.opacityTrack.Width > 0.0f &&
WeakPeakSliderHit(layout.opacityTrack, m_scale, fx, fy))
@@ -2424,17 +2448,18 @@ namespace jdi
}
}
// (2) 在开启「自由标记」的网格内按下:单击固定数据点、拖动仍是原有语义
// (2) 在开启「自由标记点选取」的网格内按下:单击固定数据点、拖动仍是原有语义
// (常规模式 = 平移;选区放大模式 = 框选)。
// ⚠️ 用户明确要求:「仅单击时」才算固定数据点 —— 因此这里**只登记意图**,
// 真正固定发生在 `OnLButtonUp` 且整段操作没有发生过拖动。
// ⚠️ 默认(非光标模式)下 `ProbeFreeMarker` 只在鼠标贴近曲线时有效 ⇒
// 鼠标下方没有信号时按下就是普通的平移/框选(用户明确要求)。
// ⚠️⚠️ 只有「自由标记点选取」已开启才参与(用户 2026-10-23 要求):
// 未开启时鼠标是普通鼠标,按下/拖动/单击完全是常规语义。
if (!freeOverPanel)
{
const int freeLane = LaneAtY(y);
if (freeLane >= 0 && freeLane < static_cast<int>(m_tab ? m_tab->Lanes().size() : 0) &&
m_tab->Lanes()[static_cast<std::size_t>(freeLane)].freeMarker)
m_tab->Lanes()[static_cast<std::size_t>(freeLane)].freeMarker &&
m_tab->Lanes()[static_cast<std::size_t>(freeLane)].freeMarkerCursor)
{
const FreeMarkerProbe probe = ProbeFreeMarker(x, y);
if (probe.valid && probe.ref.IsValid())