fix(node): prevent recursive tab resize crash

This commit is contained in:
caoqianming 2026-08-21 10:51:06 +08:00
parent 1e7edcb8b7
commit aba93d6d0b
3 changed files with 4 additions and 15 deletions

View File

@ -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%` 节点原位兼容。

View File

@ -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)

View File

@ -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;