收尾: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
@@ -54,6 +54,22 @@ namespace jdi
|
||||
*/
|
||||
LRESULT HandleMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
/**
|
||||
* @brief 设置错误反馈是否使用模态对话框。
|
||||
*
|
||||
* 模态错误框会抢断用户当前操作;宿主在不需要打断(或无法交互)的场景下
|
||||
* 应关闭它,此时错误信息改为在绘图区浮层中非模态展示。
|
||||
*
|
||||
* @param [IN] enabled true 表示允许弹出模态错误框。
|
||||
*/
|
||||
void SetModalErrorsEnabled(bool enabled) { m_modalErrorsEnabled = enabled; }
|
||||
|
||||
/**
|
||||
* @brief 查询错误反馈是否使用模态对话框。
|
||||
* @return 允许弹出模态错误框返回 true。
|
||||
*/
|
||||
bool ModalErrorsEnabled() const { return m_modalErrorsEnabled; }
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief 鼠标交互的作用目标。
|
||||
@@ -410,6 +426,13 @@ namespace jdi
|
||||
bool m_hintTimerActive = false; /**< 提示浮层淡出定时器是否已启动。 */
|
||||
/** 信号列表「滚动到目标信号」动画的定时器是否已启动(见 `SignalPanel::AdvanceScrollAnimation`)。 */
|
||||
bool m_scrollTimerActive = false;
|
||||
/**
|
||||
* 错误反馈是否使用模态对话框(默认开启;`Initialize` 遇到隐藏窗口时自动关闭)。
|
||||
*
|
||||
* 隐藏窗口(无人可点确定)下弹模态框等于把进程卡死,因此按启动方式自动降级为
|
||||
* 绘图区非模态浮层提示;调用方也可用 `SetModalErrorsEnabled` 显式控制。
|
||||
*/
|
||||
bool m_modalErrorsEnabled = true;
|
||||
std::wstring m_windowTitleText; /**< 上次写入窗口标题的完整文本(用于避免重复设置)。 */
|
||||
int m_tabMenuIndex = -1; /**< 标签栏右键菜单的目标标签页下标。 */
|
||||
int m_plotMenuLane = -1; /**< 绘图区右键菜单的目标网格下标。 */
|
||||
|
||||
@@ -53,6 +53,9 @@ namespace jdi
|
||||
{
|
||||
m_instance = instance;
|
||||
|
||||
// 隐藏窗口启动(自动化/后台)时没人能点掉模态错误框,会自动降级为非模态提示。
|
||||
SetModalErrorsEnabled(showCommand != SW_HIDE);
|
||||
|
||||
EnableDpiAwareness();
|
||||
m_dpi = QuerySystemDpi();
|
||||
m_scale = static_cast<float>(m_dpi) / 96.0f;
|
||||
@@ -487,12 +490,19 @@ namespace jdi
|
||||
|
||||
void Application::SetStatusMessage(const std::wstring& text, bool isError)
|
||||
{
|
||||
// 界面不再占用底部空间显示常驻提示;仅把真实错误以对话框形式反馈给用户。
|
||||
// 界面不再占用底部空间显示常驻提示;仅把真实错误反馈给用户。
|
||||
if (!isError || text.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
MessageBoxW(m_hwnd, text.c_str(), kWindowTitle, MB_ICONWARNING | MB_OK);
|
||||
// 模态错误框会抢断用户当前操作,因此把"是否需要打断"交给宿主决定:
|
||||
// 允许时弹框;不允许时改为绘图区底部的非模态浮层提示。
|
||||
if (m_modalErrorsEnabled)
|
||||
{
|
||||
MessageBoxW(m_hwnd, text.c_str(), kWindowTitle, MB_ICONWARNING | MB_OK);
|
||||
return;
|
||||
}
|
||||
m_plot.ShowPersistentHint(text);
|
||||
}
|
||||
|
||||
LRESULT Application::HandleMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
Reference in new issue
Block a user