7.0 KiB
7.0 KiB
新增功能模块 / 模块重构
适用场景:新增模块、重大模块重构、核心架构能力演进。 不适用场景:小接口或轻量功能变更,请使用“功能变更”模板。
基本信息
- 模块 ID:
Module-20260410-0002 - 模块名称: 锚点与布局系统第一阶段重构
- 状态:已验证
- 类型:模块重构
- 所属系统 / 子系统: GUI 框架 / Layout
- 版本 / 分支: 当前工作区 / 下一版本开发中
- 环境: Windows + EasyX
- 负责人: Codex 协作修改
背景与目标
- 背景:
- 原有锚点系统仍依赖
anchor_1 / anchor_2 Window::adaptiveLayout()与Canvas::onWindowResize()长期并存两套布局语义Canvas布局层存在Table外部特判TabControl外层布局与内部布局耦合较深
- 原有锚点系统仍依赖
- 当前痛点:
- 双锚点表达能力不足,难以覆盖更完整的边集合语义
- 顶层窗口与容器子控件的解算规则不统一,维护成本高
- 特殊控件能力边界没有收回自身语义层
- 缺少针对布局系统的专项回归用例
- 目标:
- 建立统一的布局数据模型与统一解算入口
- 正式区分设计态矩形与运行态矩形
- 保留旧 API 的兼容输入能力
- 将
Table的当前能力边界收回控件自身 - 增加布局专项回归用例
KEY == 5
- 非目标:
- 不做字体随控件缩放
- 不做
Table纵向拉伸 - 不重构重绘系统
模块边界
- 职责:
- 提供统一的布局规格描述
- 统一顶层窗口与容器子控件的几何解算
- 在保持旧 API 可用的前提下,将内部布局实现迁移到新模型
- 通过控件能力边界约束非法或暂不支持的拉伸组合
- 不负责什么:
- 字体缩放与内容排版自适应
Dialog内部布局语义重构Table纵向拉伸能力
- 外部依赖:
- EasyX 绘制环境
- 现有
Control / Window / Canvas / TabControl / Table控件体系
- 对外能力 / API:
- 继续保留
setLayoutMode(...) - 继续保留
setAnchor(a1, a2) - 当前阶段新增能力主要用于内部统一实现,不额外新增用户层 API
- 继续保留
- 关键数据 / 状态:
localx / localy / localWidth / localHeightx / y / width / heightLayoutSpecLayoutCapabilityResolvedLayoutRect
设计说明
- 核心流程:
- 先在父局部坐标系内按水平轴 / 垂直轴独立解算
- 再将局部矩形映射为世界坐标矩形
- 由控件内部受控路径应用运行态矩形
- 关键对象 / 类关系:
Control作为统一布局规格与基础解算入口Window负责顶层控件统一收口Canvas负责容器子控件重映射TabControl外层接入统一解算,内部页签栏 / 页面区仍自管Table通过LayoutCapability显式禁止Y轴 Stretch
- 生命周期:
- 设计态矩形
local*在普通 resize / 重排过程中不自动回写 - 运行态矩形由统一解算器产出,再通过内部路径应用
- 若确需同步设计基线,只能显式调用
commitCurrentGeometryAsDesignRect()
- 设计态矩形
- 事件 / 渲染 / 数据流:
- 事件阶段只改状态,不直接扩散成多套布局公式
Window与Canvas共用resolveLayoutRect()onWindowResize()收口为“快照失效 + 标脏 + 必要传播”,不再承担布局求解
- 关键不变量:
local*始终表示设计态父局部矩形x / y / width / height始终表示运行态绘制矩形- 旧 API 只作兼容输入层,不再作为内部解算依据
Table当前阶段只允许X轴 Stretch
- 降级 / 回退策略:
- 对不满足能力边界的拉伸请求,自然降级为固定尺寸位移
- 旧接口输入通过映射层退回到新模型的有限子集
实现与影响
- 关键实现点:
- 引入
AxisSizePolicy / AxisAlignPolicy / AxisLayoutSpec / LayoutSpec / LayoutCapability / ResolvedLayoutRect - 在
Control中增加统一解算与内部受控应用路径 - 将
Window::adaptiveLayout()改为统一解算入口 - 将
Canvas子控件布局从旧比例缩放逻辑切换为统一解算 - 将
TabControl外层接入统一解算,同时保留内部页签系统专用布局 - 将
Table的Y轴固定能力边界收回控件自身 - 在
z-testDome.cpp增加KEY == 5布局专项回归
- 引入
- 涉及文件 / 类 / 函数:
- 兼容性影响:
- 向后兼容旧锚点 API
- 当前阶段未删除旧 getter / setter
- 性能影响:
- 无明显新增性能负担
- 主要是布局求解路径从多处分散逻辑收口为统一函数
- 风险点:
- 若某些控件运行态尺寸变化后未明确同步设计基线,后续 resize 仍可能出现“回到旧设计态”的现象
TabControl的外层统一解算与内部专用布局之间存在边界风险Table纵向仍为固定尺寸,后续若扩展能力需单独立项
测试与验证
- 测试范围:
- 顶层窗口 resize
Canvas嵌套布局TabControl外层布局接入Table横向拉伸与纵向固定KEY == 5布局专项回归
- 验证步骤:
- 编译
Control.cpp / Canvas.cpp / Table.cpp / TabControl.cpp / Window.cpp - 编译
z-testDome.cpp /DKEY=2 - 编译
z-testDome.cpp /DKEY=5
- 验证结果:
- 源码级编译验证通过
KEY == 5已补齐布局专项回归用例- GUI 交互仍需用户本机手动确认
- 已知限制 / 遗留问题:
- 本轮不包含字体缩放
- 本轮不包含
Table纵向拉伸 - Tooltip 问题已另外拆分为独立
BUG / Fix
落地信息
- 关联功能变更 ID:[可选]
- 关联 BUG / Fix:
BUG-20260410-0004Fix-BUG-20260410-0004
- Commit: 当前工作区未提交
- PR:[可选]
- 发布版本:[可选]
- 相关文档: