Files
StellarX-kaifa/开发记录/功能变更/Feature-20260317-0002-TextBox-setText运行期刷新语义调整.md

4.2 KiB
Raw Permalink Blame History

功能变更 ID: Feature-20260317-0002

适用场景:记录小到中等规模的功能、接口、行为、默认值或配置变化。 不适用场景:新增核心模块、重大模块重构、架构级设计,请使用“新增功能模块”模板。

基本信息

  • ID: Feature-20260317-0002
  • 标题: TextBox::setText 运行期刷新语义调整
  • 状态:已完成(历史记录;本次仅归档,未重新验证)
  • 类型:修改
  • 级别:L2 中等
  • 模块: TextBox / Repaint
  • 版本 / 分支: v3.0.1 / master
  • 环境: Windows 11 / Visual Studio 2022 / Debug、Release / EasyX
  • 负责人: Ysm-04(历史实现)

变更背景

  • 背景:
    • 早期 setText() 直接调用 draw(),在图形上下文尚未初始化时可能崩溃。
    • v3.0.0 将 Setter 收敛为更新状态并标脏,解决初始化阶段的生命周期问题,但运行期程序化设置文本可能要等后续事件或重绘周期才能显示。
  • 目标: 在不破坏初始化阶段安全性的前提下,让已经绘制过的 TextBox 在运行期更新文本后请求或执行刷新。
  • 不做什么:[可选]
    • 不改变 setText(std::string) 的函数签名。
    • 不在没有有效背景快照时强制进入绘制链路。

变更内容

  • 变更摘要: setText() 根据文本是否变化、最大长度、父控件和有效快照状态决定仅标脏、向父控件请求重绘或直接绘制。
  • 新增项:[可选]
    • 文本未变化时立即返回,避免无效更新。
  • 修改项:[可选]
    • 文本变化后始终更新内部值并标记为脏。
    • 有父控件且 hasSnap 为真时,调用 requestRepaint(parent)。
    • 无父控件且 hasSnap 为真时,直接调用 draw()。
    • hasSnap 为假时只保留脏标记,等待首次绘制或统一重绘流程。
  • 删除 / 废弃项:[可选]
    • 无。
  • 受影响的文件 / 类 / 函数:
    • 历史路径:src/textBox.cpp
    • TextBox::setText(std::string)
  • 对外 API / 属性变化:[可选]
    • 函数签名不变;运行期可见刷新时机发生变化。

行为对照

  • 变更前(v3.0.0): setText() 更新内部文本并标脏,不保证调用后立即触发可见重绘。
  • 变更后(v3.0.1):
    • 初始化/首次绘制前没有有效快照,仅更新文本并标脏,不触发依赖图形上下文的绘制。
    • 已绘制且存在有效快照时,通过父容器请求重绘;没有父控件时直接绘制。
    • 文本未变化时不执行重复重绘。
  • 兼容性说明:部分兼容
  • 迁移说明:[可选]
    • 若旧代码在 setText() 后手动调用 draw(),升级到 v3.0.1 后应移除重复绘制,避免闪烁或重复刷新。
    • 初始化阶段仍可先设置默认文本,由首次统一绘制完成显示。

验证与落地

  • 验证方式:
    • 创建 TextBox,在窗口和图形上下文建立前调用 setText(),确认不会进入绘制链路或中断。
    • 窗口运行后,在按钮回调中调用 setText(),确认无需额外鼠标事件即可刷新。
    • 重复设置相同文本,确认不会产生无效刷新。
  • 验证结果:
    • PDF 历史记录将“初始化前设置默认文本”和“按钮回调中运行期更新”记为正常。
    • 本次归档通过历史提交确认了 hasSnap 分支逻辑,但未构建 v3.0.1,也未重新运行 GUI 用例。
    • hasSnap 是历史实现用于判断是否已具备绘制条件的代理状态;本记录不把它扩展解释为所有图形上下文状态的通用保证。
  • 关联 BUG / Fix:[可选]
  • Commit:
    • 实现提交:c66cad3423a46ec4ef902965baa4c1816d10148a
    • 发布记录提交:b765e54eff28ebcd0bd99a81dec80b3ac0769337
  • PR:[可选]
  • 发布版本:[可选] v3.0.1
  • 备注:[可选]
    • 资料来源:StellarX功能_模块变更.pdf 第 10-12 页,并以对应提交和历史 CHANGELOG.md 交叉核对。