收尾:LanePanelState 抽取 + 错误提示非模态化(清空上一轮的“未完成”)
一、Lane 的内聚性(上一轮建议 5,本轮完成)
- 新增 struct LanePanelState { bool open = true; double x = -1.0; double y = -1.0; };
- Lane 的 12 个平铺面板字段(edgePanelOpen/X/Y 等 × 4 类实验性功能)
→ 4 个聚合成员 edgePanel / edgeCenterPanel / meanFilterPanel / weakPeakPanel;
- 访问点全部改为 lane.edgePanel.open 形式(DataModelTab.cpp 快照拷贝、
PlotViewInteraction.cpp 面板拖拽、PlotViewPaint.cpp 面板层序绘制);
- RebuildLanes 内部的 LaneCarry 同步收敛为 4 个 LanePanelState,
12 行逐字段赋值简化为 4 行整体赋值。
- 教训:批量改名不能对“声明”和“使用”跑同一组替换对,
否则声明行会变成 `bool edgePanel.open = true;` 这类非法代码。
二、错误提示与模态阻塞解耦(上一轮建议 1,本轮完成)
- Application 新增 SetModalErrorsEnabled(bool) / ModalErrorsEnabled(),
成员 m_modalErrorsEnabled 默认 true(交互场景行为不变);
- Initialize 最先执行 SetModalErrorsEnabled(showCommand != SW_HIDE):
隐藏窗口(自动化/离屏)下没人能点掉模态框,等于把进程钉死;
- SetStatusMessage(text, isError=true):允许模态时原样 MessageBoxW,
否则改走非模态通道 m_plot.ShowPersistentHint(text)(绘图区底部浮层);
普通提示与空文本依旧被忽略;
- PlotView 新增公开接口 ShowPersistentHint(text)(内部转 SetHintSticky),
不向宿主暴露粘滞/淡出等内部细节。
三、顺带修掉一个真实缺陷
- PlotView::Paint 在 m_lanes.empty() 时提前 return,而提示浮层在其后的
叠加层绘制 ⇒ 一个信号都没勾选时任何错误都显示不出来,恰恰是
“文件加载失败”最需要提示的场景;该分支补一次 PaintHint(g)。
四、验证(全部离屏:SW_HIDE + 不注入输入 + BELOW_NORMAL)
- make release / make debug:通过,零警告;Build/Release/Target.exe = 764416 B;
- verify 49/49、datacheck 69/69、edgecheck 46/46、panelanim 156/156;
- 新增探针 .preflight/perf/errcheck 19/19:默认值 / 隐藏窗口自动降级 / 宿主显式开关;
工作线程 + 5s 超时判定“不阻塞”(旧行为会永久阻塞,判失败并 ExitProcess,
探针不会挂住);EnumWindows 统计本进程 #32770 顶层窗口数量前后不变;
错误文本进入 m_hintText / m_hintSticky / HintNeedsAnimation / m_hintShownAt;
像素级:有提示帧与无提示帧在绘图区内的差异像素 3781,且全帧差异同为 3781
(证明差异只来自提示)。
五、文档
- Documents/agent_mem.md:§9.37 新增第八节(本轮补齐)、第九节(仅剩 MF4 项)、
§11.2 新增第 93–95 条硬约束、变更日志新增一行;
- Documents/refactor_report_2026-10-16.md:§7.3 / §7.4 标记完成,新增 §九 收尾补记
(含 9.1–9.5:聚合化、解耦、探针、验证结果、变更清单)。
This commit is contained in:
1 parent
e6b7bf66ec
commit
d2e6fdd085
11 files changed
+296
-132
No files matched your search
@@ -78,24 +78,16 @@ namespace jdi
|
||||
bool edgeCount = false;
|
||||
double edgeValue = 0.0;
|
||||
bool edgeValueValid = false;
|
||||
bool edgePanelOpen = true;
|
||||
double edgePanelX = -1.0;
|
||||
double edgePanelY = -1.0;
|
||||
LanePanelState edgePanel;
|
||||
bool edgeCenter = false;
|
||||
std::vector<Lane::EdgeCenterItem> edgeCenterItems;
|
||||
bool edgeCenterPanelOpen = true;
|
||||
double edgeCenterPanelX = -1.0;
|
||||
double edgeCenterPanelY = -1.0;
|
||||
LanePanelState edgeCenterPanel;
|
||||
bool meanFilter = false;
|
||||
std::vector<Lane::MeanFilterItem> meanFilterItems;
|
||||
bool meanFilterPanelOpen = true;
|
||||
double meanFilterPanelX = -1.0;
|
||||
double meanFilterPanelY = -1.0;
|
||||
LanePanelState meanFilterPanel;
|
||||
bool weakPeak = false;
|
||||
std::vector<Lane::WeakPeakItem> weakPeakItems;
|
||||
bool weakPeakPanelOpen = true;
|
||||
double weakPeakPanelX = -1.0;
|
||||
double weakPeakPanelY = -1.0;
|
||||
LanePanelState weakPeakPanel;
|
||||
};
|
||||
|
||||
// 先记下每个信号原来所在网格的网格自身状态:
|
||||
@@ -123,24 +115,16 @@ namespace jdi
|
||||
carry.edgeCount = lane.edgeCount;
|
||||
carry.edgeValue = lane.edgeValue;
|
||||
carry.edgeValueValid = lane.edgeValueValid;
|
||||
carry.edgePanelOpen = lane.edgePanelOpen;
|
||||
carry.edgePanelX = lane.edgePanelX;
|
||||
carry.edgePanelY = lane.edgePanelY;
|
||||
carry.edgePanel = lane.edgePanel;
|
||||
carry.edgeCenter = lane.edgeCenter;
|
||||
carry.edgeCenterItems = lane.edgeCenterItems;
|
||||
carry.edgeCenterPanelOpen = lane.edgeCenterPanelOpen;
|
||||
carry.edgeCenterPanelX = lane.edgeCenterPanelX;
|
||||
carry.edgeCenterPanelY = lane.edgeCenterPanelY;
|
||||
carry.edgeCenterPanel = lane.edgeCenterPanel;
|
||||
carry.meanFilter = lane.meanFilter;
|
||||
carry.meanFilterItems = lane.meanFilterItems;
|
||||
carry.meanFilterPanelOpen = lane.meanFilterPanelOpen;
|
||||
carry.meanFilterPanelX = lane.meanFilterPanelX;
|
||||
carry.meanFilterPanelY = lane.meanFilterPanelY;
|
||||
carry.meanFilterPanel = lane.meanFilterPanel;
|
||||
carry.weakPeak = lane.weakPeak;
|
||||
carry.weakPeakItems = lane.weakPeakItems;
|
||||
carry.weakPeakPanelOpen = lane.weakPeakPanelOpen;
|
||||
carry.weakPeakPanelX = lane.weakPeakPanelX;
|
||||
carry.weakPeakPanelY = lane.weakPeakPanelY;
|
||||
carry.weakPeakPanel = lane.weakPeakPanel;
|
||||
for (const SignalRef& ref : lane.signals)
|
||||
{
|
||||
previousCarry.emplace_back(ref, carry);
|
||||
@@ -165,24 +149,24 @@ namespace jdi
|
||||
lane.edgeCount = carry.edgeCount;
|
||||
lane.edgeValue = carry.edgeValue;
|
||||
lane.edgeValueValid = carry.edgeValueValid;
|
||||
lane.edgePanelOpen = carry.edgePanelOpen;
|
||||
lane.edgePanelX = carry.edgePanelX;
|
||||
lane.edgePanelY = carry.edgePanelY;
|
||||
lane.edgePanel.open = carry.edgePanel.open;
|
||||
lane.edgePanel.x = carry.edgePanel.x;
|
||||
lane.edgePanel.y = carry.edgePanel.y;
|
||||
lane.edgeCenter = carry.edgeCenter;
|
||||
lane.edgeCenterItems = carry.edgeCenterItems;
|
||||
lane.edgeCenterPanelOpen = carry.edgeCenterPanelOpen;
|
||||
lane.edgeCenterPanelX = carry.edgeCenterPanelX;
|
||||
lane.edgeCenterPanelY = carry.edgeCenterPanelY;
|
||||
lane.edgeCenterPanel.open = carry.edgeCenterPanel.open;
|
||||
lane.edgeCenterPanel.x = carry.edgeCenterPanel.x;
|
||||
lane.edgeCenterPanel.y = carry.edgeCenterPanel.y;
|
||||
lane.meanFilter = carry.meanFilter;
|
||||
lane.meanFilterItems = carry.meanFilterItems;
|
||||
lane.meanFilterPanelOpen = carry.meanFilterPanelOpen;
|
||||
lane.meanFilterPanelX = carry.meanFilterPanelX;
|
||||
lane.meanFilterPanelY = carry.meanFilterPanelY;
|
||||
lane.meanFilterPanel.open = carry.meanFilterPanel.open;
|
||||
lane.meanFilterPanel.x = carry.meanFilterPanel.x;
|
||||
lane.meanFilterPanel.y = carry.meanFilterPanel.y;
|
||||
lane.weakPeak = carry.weakPeak;
|
||||
lane.weakPeakItems = carry.weakPeakItems;
|
||||
lane.weakPeakPanelOpen = carry.weakPeakPanelOpen;
|
||||
lane.weakPeakPanelX = carry.weakPeakPanelX;
|
||||
lane.weakPeakPanelY = carry.weakPeakPanelY;
|
||||
lane.weakPeakPanel.open = carry.weakPeakPanel.open;
|
||||
lane.weakPeakPanel.x = carry.weakPeakPanel.x;
|
||||
lane.weakPeakPanel.y = carry.weakPeakPanel.y;
|
||||
};
|
||||
|
||||
// 收集全部可见信号引用。
|
||||
|
||||
Reference in new issue
Block a user