1111## 3 如何测试
1212
1313### 3.1 确定性测试(单元测试)
14- 本项目无对应单元测试。
14+ 1 . 构建并运行现有单元测试:
15+ ``` bash
16+ xmake b qt_chat_tab_widget_test
17+ xmake r qt_chat_tab_widget_test
18+ ```
19+ 2 . 测试应覆盖 ` count_input_lines ` 的保底逻辑以及基于排版高度的行数估算辅助函数。
1520
1621### 3.2 非确定性测试(文档验证)
17221 . 启动 Mogan STEM,点击顶部工具栏的 AI 图标打开 Chat 标签页
18232 . 观察输入框默认高度是否为三行(约三行文本的高度)
19243 . 在输入框中连续按回车键,观察输入框高度是否随内容增加而向上延伸
20254 . 输入多行文本后,确认输入框没有出现不必要的滚动条,而是直接扩展高度
21265 . 删除多行内容后,确认输入框高度能相应收缩
27+ 6 . ** 粘贴长文本(不带换行符)** :从外部复制一段超过输入框宽度的长文本并粘贴,观察输入框高度是否随排版后的实际行数自动增高
28+ 7 . ** 粘贴多行文本** :复制包含多个换行符的多行文本并粘贴,确认输入框高度同时反映段落数和长行的自动折行
2229
2330## 4 如何提交
2431
@@ -33,6 +40,7 @@ xmake b stem
33401 . 将 AI 对话输入框的默认高度调整为三行文本的高度
34412 . 输入框支持根据内容行数自适应向上延伸高度
35423 . 当用户删除内容时,输入框高度相应收缩
43+ 4 . 修复粘贴长文本(无换行符)或多行文本时,输入框高度无法按实际排版行数自动适配的问题
3644
3745## 6 Why
3846
@@ -41,6 +49,8 @@ xmake b stem
4149- 减少用户在输入长消息时的滚动操作
4250- 更符合现代聊天产品的交互习惯
4351
52+ 此外,之前的自适应实现仅基于文档树段落数(` DOCUMENT ` 子节点数)进行估算,未考虑 TeXmacs 排版引擎的实际折行。当用户粘贴不带换行符的长文本时,段落数不变,输入框不会增高,导致文本被截断或需要滚动,严重影响体验。因此需要引入排版后实际高度的查询机制。
53+
4454## 7 How
4555
4656### 7.1 默认高度设为三行
@@ -59,10 +69,19 @@ xmake b stem
5969
6070当用户删除内容导致段落数减少时,` adjust_input_height() ` 同样会降低 ` minimumHeight ` 。最小值始终不低于三行默认值。
6171
62- ## 8 已知限制
72+ ### 7.4 基于排版实际高度的视觉行数估算
73+
74+ 为了解决粘贴长文本(无换行符)时高度不自适应的问题,在 ` adjust_input_height() ` 中新增对 TeXmacs 排版引擎实际输出高度的查询:
6375
64- 当前实现通过 ` count_input_lines() ` 统计文档的** 段落数** (` DOCUMENT ` 节点的子节点数)来调整高度,而非实际的视觉行数。因此:
65- - 按回车键创建新段落时,输入框能正确变大。
66- - 粘贴不带换行符的长文本时,由于段落数不变,输入框** 不会** 随内容自动增高。
76+ 1 . 通过 ` panel->inputEditorWidget->findChild<QTMWidget*>() ` 获取嵌入编辑器的 ` QTMWidget ` 。
77+ 2 . 调用 ` editor->tm_widget() ` 得到 ` qt_simple_widget_rep* ` ,再 ` dynamic_cast<edit_interface_rep*> ` 获取编辑器接口。
78+ 3 . 调用 ` ed->get_total_height(true) ` 获取排版后内容的总高度(` SI ` 单位)。
79+ 4 . 使用 ` to_qsize(0, h).height() ` 将 ` SI ` 转换为像素高度。
80+ 5 . 将像素高度除以 ` kInputLineHeight ` 得到等效视觉行数。
81+ 6 . 将该视觉行数与基于文档树段落数的保底值取较大者,作为最终目标行数。
82+
83+ TeXmacs 的默认 ` page-medium ` 为 ` papyrus ` ,此时 ` eb->h() ` 直接反映所有排版内容的总高度,无需处理分页带来的额外结构。
84+
85+ ## 8 已知限制
6786
68- 后续如需支持粘贴长文本时的自适应,需要改用能够计算实际排版行数的方式(如查询编辑器内部排版后的行高) 。
87+ ` get_total_height(true) ` 包含少量页边距( ` top + dtop + bot + dbot ` ),因此空文档时返回的高度略大于零,计算出的等效行数可能为 1 而非 0。由于最终会与 ` kInputDefaultLines ` (3)取最大值,该偏差不影响实际表现。若后续需要更精确的内容高度,可调用 ` get_total_height(false) ` 获取去除装饰后的高度 。
0 commit comments