From aba93d6d0b81b935aeef495024bac4db9a0978b7 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 21 Aug 2026 10:51:06 +0800 Subject: [PATCH] fix(node): prevent recursive tab resize crash --- PROGRESS.md | 2 +- tests/test_windows_node_source.py | 4 ++-- windows-node/Zcbot.WindowsNode/ConfigurationForm.cs | 13 +------------ 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index fdfb9d1..9954783 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -24,7 +24,7 @@ - **08-21 / Unreleased / Blender 多视图与剖切 v2**:以 `blender.scene.author@v2` 直接替换 v1,目标节点为 Blender 5.2 LTS;`rotary_kiln` 一次建模后可连续渲染等轴测、侧视、窑头、窑尾、纵向剖切和横截面,完整工程保持未剖切状态;固定等轴测预览外,其他选定 PNG 可动态自动回传,GLB 排除仅供剖切渲染的辅助几何。专业软件提交工具改为区分缺失参数与合法空数组,允许 Blender 这类无输入、无额外导出请求的纯生成任务进入合同校验;90 项 Blender/合同/Job/Node/预览专项 unittest、.NET build、独立 adapter 打包和 Blender 3.6.12 兼容烟测通过,全量 698 项仍仅 3 个既有数据库集成模块因显式测试库缺少 `users` 表未通过(另跳过 4 项),目标节点 5.2 真机验收待部署后执行,未连接或迁移生产数据库。 -- **08-21 / Unreleased / Windows Node 软件地址选择、Origin 检测与自适应界面**:专业软件保留一层带边界的独立配置行和通栏只读地址框,Origin、ANSYS、Blender 均可手选位置。Origin 自动检测由单一 COM 路径扩展为 COM、卸载注册表和标准目录回退,手选的 `Origin*.exe` 同时用于 Worker 版本识别,COM 执行健康仍由 probe 独立校验。主窗口移除固定宽度居中容器和普通内容卡片边框,改为单层全宽页面;页签宽度跟随窗口调整,软件状态与操作分行并允许按钮自然换行,能力概览按软件与能力名称归并旧、新 adapter 的重复文案。Windows Node 22 项源码 unittest、.NET build 与 diff 检查通过,无 DB、schema、HTTP API、依赖或运行方式变化。 +- **08-21 / Unreleased / Windows Node 软件地址选择、Origin 检测与自适应界面**:专业软件保留一层带边界的独立配置行和通栏只读地址框,Origin、ANSYS、Blender 均可手选位置。Origin 自动检测由单一 COM 路径扩展为 COM、卸载注册表和标准目录回退,手选的 `Origin*.exe` 同时用于 Worker 版本识别,COM 执行健康仍由 probe 独立校验。主窗口移除固定宽度居中容器和普通内容卡片边框,改为单层全宽页面;页签使用 WinForms 内置 `FillToRight` 模式跟随窗口调整,避免手工尺寸回调递归触发布局栈溢出;软件状态与操作分行并允许按钮自然换行,能力概览按软件与能力名称归并旧、新 adapter 的重复文案。Windows Node 23 项源码 unittest、.NET build、启动烟测与 diff 检查通过,无 DB、schema、HTTP API、依赖或运行方式变化。 - **08-20 / Unreleased / Windows Node 专业软件独立配置与 runtime 安装**:主窗口新增 Origin、ANSYS Mechanical 2024 R2、Blender 软件卡,分别显示应用位置来源和受管 runtime 状态;三种软件均可由 UI 选择自定义位置,清除后按各自的环境变量、COM、卸载注册表、PATH 或标准目录自动检测。每个软件可单独创建或更新隔离的 Python 3.12 runtime,安装只使用内置 runtime 定义与固定 requirements,拒绝活动任务期间替换,并先在临时目录完成后再切换;配置后的路径由 Host 作为固定子进程环境传给 Worker,任务请求仍不能提供路径或命令。移除重复承担软件安装和开机启动的统一 BAT,发布包直接运行 EXE,当前账号的开机启动也完全由 UI 管理;全新节点默认使用可写的 `%LocalAppData%` 数据根目录,已有 `%ProgramData%` 节点原位兼容。 diff --git a/tests/test_windows_node_source.py b/tests/test_windows_node_source.py index ef44751..27fc0fb 100644 --- a/tests/test_windows_node_source.py +++ b/tests/test_windows_node_source.py @@ -204,11 +204,11 @@ class WindowsNodeSourceTests(unittest.TestCase): self.assertIn('AddTab(tabs, "专业软件")', form) self.assertIn('AddTab(tabs, "本机任务")', form) self.assertIn('AddTab(tabs, "运行设置")', form) - self.assertIn("SizeMode = TabSizeMode.Fixed", form) + self.assertIn("SizeMode = TabSizeMode.FillToRight", form) self.assertIn("new NavigationTabControl", form) self.assertIn("DrawMode = TabDrawMode.OwnerDrawFixed", form) self.assertIn("Appearance = TabAppearance.FlatButtons", form) - self.assertIn("Math.Clamp(ClientSize.Width / TabCount, 96, 140)", form) + self.assertNotIn("protected override void OnResize", form) self.assertIn("tab.Controls.Add(content)", form) self.assertIn("CreateSubsectionTitle(\"能力概览\")", form) self.assertIn("panel.SetColumnSpan(path, 2)", form) diff --git a/windows-node/Zcbot.WindowsNode/ConfigurationForm.cs b/windows-node/Zcbot.WindowsNode/ConfigurationForm.cs index 17c6be2..6d1876c 100644 --- a/windows-node/Zcbot.WindowsNode/ConfigurationForm.cs +++ b/windows-node/Zcbot.WindowsNode/ConfigurationForm.cs @@ -129,9 +129,8 @@ internal sealed class ConfigurationForm : Form Dock = DockStyle.Fill, Margin = new Padding(0), Font = new Font("Microsoft YaHei UI", 9, FontStyle.Bold), - ItemSize = new Size(128, 38), Padding = new Point(14, 6), - SizeMode = TabSizeMode.Fixed, + SizeMode = TabSizeMode.FillToRight, }; var overviewPage = AddTab(tabs, "节点概览"); var softwarePage = AddTab(tabs, "专业软件"); @@ -1353,16 +1352,6 @@ internal sealed class ConfigurationForm : Form SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } - protected override void OnResize(EventArgs eventArgs) - { - base.OnResize(eventArgs); - if (TabCount == 0) - { - return; - } - ItemSize = new Size(Math.Clamp(ClientSize.Width / TabCount, 96, 140), 38); - } - protected override void OnDrawItem(DrawItemEventArgs eventArgs) { var selected = eventArgs.Index == SelectedIndex;