Files
StellarX-kaifa/开发记录/模块/Module-20260410-0002-锚点与布局系统第一阶段重构.md
T

7.0 KiB
Raw Blame History

新增功能模块 / 模块重构

适用场景:新增模块、重大模块重构、核心架构能力演进。 不适用场景:小接口或轻量功能变更,请使用“功能变更”模板。

基本信息

  • 模块 IDModule-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 / localHeight
    • x / y / width / height
    • LayoutSpec
    • LayoutCapability
    • ResolvedLayoutRect

设计说明

  • 核心流程:
    • 先在父局部坐标系内按水平轴 / 垂直轴独立解算
    • 再将局部矩形映射为世界坐标矩形
    • 由控件内部受控路径应用运行态矩形
  • 关键对象 / 类关系:
    • Control 作为统一布局规格与基础解算入口
    • Window 负责顶层控件统一收口
    • Canvas 负责容器子控件重映射
    • TabControl 外层接入统一解算,内部页签栏 / 页面区仍自管
    • Table 通过 LayoutCapability 显式禁止 Y 轴 Stretch
  • 生命周期:
    • 设计态矩形 local* 在普通 resize / 重排过程中不自动回写
    • 运行态矩形由统一解算器产出,再通过内部路径应用
    • 若确需同步设计基线,只能显式调用 commitCurrentGeometryAsDesignRect()
  • 事件 / 渲染 / 数据流:
    • 事件阶段只改状态,不直接扩散成多套布局公式
    • WindowCanvas 共用 resolveLayoutRect()
    • onWindowResize() 收口为“快照失效 + 标脏 + 必要传播”,不再承担布局求解
  • 关键不变量:
    • local* 始终表示设计态父局部矩形
    • x / y / width / height 始终表示运行态绘制矩形
    • 旧 API 只作兼容输入层,不再作为内部解算依据
    • Table 当前阶段只允许 X 轴 Stretch
  • 降级 / 回退策略:
    • 对不满足能力边界的拉伸请求,自然降级为固定尺寸位移
    • 旧接口输入通过映射层退回到新模型的有限子集

实现与影响

  • 关键实现点:
    • 引入 AxisSizePolicy / AxisAlignPolicy / AxisLayoutSpec / LayoutSpec / LayoutCapability / ResolvedLayoutRect
    • Control 中增加统一解算与内部受控应用路径
    • Window::adaptiveLayout() 改为统一解算入口
    • Canvas 子控件布局从旧比例缩放逻辑切换为统一解算
    • TabControl 外层接入统一解算,同时保留内部页签系统专用布局
    • TableY 轴固定能力边界收回控件自身
    • z-testDome.cpp 增加 KEY == 5 布局专项回归
  • 涉及文件 / 类 / 函数:
  • 兼容性影响:
    • 向后兼容旧锚点 API
    • 当前阶段未删除旧 getter / setter
  • 性能影响:
    • 无明显新增性能负担
    • 主要是布局求解路径从多处分散逻辑收口为统一函数
  • 风险点:
    • 若某些控件运行态尺寸变化后未明确同步设计基线,后续 resize 仍可能出现“回到旧设计态”的现象
    • TabControl 的外层统一解算与内部专用布局之间存在边界风险
    • Table 纵向仍为固定尺寸,后续若扩展能力需单独立项

测试与验证

  • 测试范围:
    • 顶层窗口 resize
    • Canvas 嵌套布局
    • TabControl 外层布局接入
    • Table 横向拉伸与纵向固定
    • KEY == 5 布局专项回归
  • 验证步骤:
  1. 编译 Control.cpp / Canvas.cpp / Table.cpp / TabControl.cpp / Window.cpp
  2. 编译 z-testDome.cpp /DKEY=2
  3. 编译 z-testDome.cpp /DKEY=5
  • 验证结果:
    • 源码级编译验证通过
    • KEY == 5 已补齐布局专项回归用例
    • GUI 交互仍需用户本机手动确认
  • 已知限制 / 遗留问题:
    • 本轮不包含字体缩放
    • 本轮不包含 Table 纵向拉伸
    • Tooltip 问题已另外拆分为独立 BUG / Fix

落地信息