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

78 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 功能变更 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:[可选]
- 前序问题:[`BUG-20260109-0001-TextBox-setText进入事件循环前调用崩溃.md`](../BUG/BUG-20260109-0001-TextBox-setText进入事件循环前调用崩溃.md)
- v3.0.0 修复:[`Fix-BUG-20260109-0001-TextBox-setText进入事件循环前调用崩溃.md`](../Fix/Fix-BUG-20260109-0001-TextBox-setText进入事件循环前调用崩溃.md)
- Commit:
- 实现提交:`c66cad3423a46ec4ef902965baa4c1816d10148a`
- 发布记录提交:`b765e54eff28ebcd0bd99a81dec80b3ac0769337`
- PR:[可选]
- 发布版本:[可选] v3.0.1
- 备注:[可选]
- 资料来源:`StellarX功能_模块变更.pdf` 第 10-12 页,并以对应提交和历史 `CHANGELOG.md` 交叉核对。