Skip to content

fix(editor): prevent incorrect scroll position when opening files#459

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:release/eaglefrom
LiHua000:release/eagle
May 8, 2026
Merged

fix(editor): prevent incorrect scroll position when opening files#459
deepin-bot[bot] merged 1 commit into
linuxdeepin:release/eaglefrom
LiHua000:release/eagle

Conversation

@LiHua000
Copy link
Copy Markdown

@LiHua000 LiHua000 commented May 8, 2026

log: The resizeEvent "keep at bottom" logic triggers when
maximum()==value()==0 during widget creation with empty
document, causing a deferred setValue(maximum()) to scroll
the viewport to the wrong position after content is loaded.

Bug: https://pms.uniontech.com/bug-view-358723.html

max-lvs
max-lvs previously approved these changes May 8, 2026
log: The resizeEvent "keep at bottom" logic triggers when
  maximum()==value()==0 during widget creation with empty
  document, causing a deferred setValue(maximum()) to scroll
  the viewport to the wrong position after content is loaded.

Bug: https://pms.uniontech.com/bug-view-358723.html
@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这段代码修改主要涉及两个文件的变更,分别处理了文本编辑器在窗口大小调整和内容加载时的行为。下面我将从语法逻辑、代码质量、代码性能和代码安全四个方面进行审查:

1. 文件:src/editor/dtextedit.cpp

变更内容
resizeEvent 函数中,增加了一个额外的条件判断 verticalScrollBar()->maximum() > 0,用于排除文档为空或尚未加载的情况。

审查意见

  • 语法逻辑

    • 正确。逻辑清晰。原代码中,当文档为空或未加载时,maximum()value() 通常都为 0,导致条件 maximum() == value() 恒成立。这会错误地触发后续的滚动到底部逻辑。添加 maximum() > 0 完美修复了这个问题,确保只有在有实际滚动范围(即文档内容超出视口)且当前位于底部时,才执行后续逻辑。
  • 代码质量

    • 良好。添加的注释 // maximum() > 0: 排除文档为空或尚未加载的情况... 非常清晰地解释了增加该判断的原因,有助于后续维护。
    • 良好。使用了 QPointerQTimer::singleShot,这是处理 UI 延迟执行和防止对象过早析构的安全做法。
  • 代码性能

    • 无影响verticalScrollBar()->maximum() 是一个简单的 getter 调用,性能开销极小,且避免了不必要的 lambda 回调执行,实际上提升了性能。
  • 代码安全

    • 安全。修复了潜在的逻辑漏洞(空文档时的误判),避免了无效的 UI 操作。

2. 文件:src/editor/editwrapper.cpp

变更内容

  1. 更新了版权年份。
  2. loadContent 函数中,插入文本后立即重置垂直滚动条位置到 0。

审查意见

  • 语法逻辑

    • 正确。逻辑上是为了解决 Qt 文本组件在分批插入大量文本时可能发生的自动滚动问题。注释明确指出了是“第二次 insertText 会导致 Qt 内部跟随滚动”。
  • 代码质量

    • 良好。注释解释了“为什么”要这样做,这对于处理这种特定框架(Qt)的特定行为(副作用)非常重要。
    • ⚠️ 潜在风险:直接操作 m_pTextEdit->verticalScrollBar()->setValue(0) 是一种“打补丁”式的做法。如果 Qt 的行为在未来版本发生变化,或者如果插入逻辑变得更复杂(例如分多批插入),这里强制设为 0 可能会导致用户体验上的闪烁(看到内容滚动下去又被拉回来)。
    • 建议:如果这是分批加载,通常期望保持视口不动(例如保持在顶部)。如果是为了保持在顶部,更稳健的做法可能是:
      • 在插入前保存滚动位置。
      • 插入后恢复滚动位置。
      • 或者,如果确定是加载新文件,应该在加载开始时禁用滚动条更新,加载结束后再启用并重置。
    • 但考虑到代码上下文是 loadContent(加载内容),且注释提到了“第二次”,这看起来是针对特定加载流程的快速修复。在当前上下文中是可接受的。
  • 代码性能

    • ⚠️ 轻微影响setValue(0) 会触发视口的重绘事件。如果在循环或高频调用的地方这样做会有性能问题。但根据上下文 loadContentcursor.insertText,这通常发生在文件打开时,属于一次性操作,性能影响可以忽略不计。
  • 代码安全

    • 安全。没有引入空指针风险(假设 m_pTextEdit 此时有效)。
    • 版权更新:年份更新是常规维护操作。

总结与改进建议

这两处修改都是针对特定 Bug 的修复,逻辑正确且有效。

改进建议

  1. 关于 editwrapper.cpp 的滚动条重置
    虽然当前的修改解决了问题,但为了代码的健壮性,建议检查是否所有分批插入的场景都需要这个重置。如果只有“第二次”需要,可能需要更精确的条件判断,或者查明为什么只有第二次会导致滚动。
    另外,可以考虑封装一个辅助函数来处理“插入文本并保持滚动位置”的逻辑,例如:

    // 伪代码示例
    void EditWrapper::insertTextKeepingPosition(const QString &text) {
        // 保存当前垂直滚动值
        int vScroll = m_pTextEdit->verticalScrollBar()->value();
        // 插入文本
        cursor.insertText(text);
        // 恢复滚动值(或者根据需求强制设为0)
        m_pTextEdit->verticalScrollBar()->setValue(vScroll); 
    }

    不过,鉴于当前代码是针对 loadContent 的特定修复,保持现状也是合理的。

  2. 关于 dtextedit.cpp 的条件判断
    代码已经非常完善。为了极致的可读性,可以将长条件拆分,但目前的写法在 C++ 中也是完全标准的。

最终评价
代码修改质量高,逻辑清晰,注释完善,有效地修复了潜在的 UI 逻辑缺陷。可以直接合并。

@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: LiHua000, max-lvs

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@LiHua000
Copy link
Copy Markdown
Author

LiHua000 commented May 8, 2026

/merge

@deepin-bot deepin-bot Bot merged commit 86ad04a into linuxdeepin:release/eagle May 8, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants