diff --git a/src/editor/inserttextundocommand.cpp b/src/editor/inserttextundocommand.cpp index b02864ff..a3cf53a9 100644 --- a/src/editor/inserttextundocommand.cpp +++ b/src/editor/inserttextundocommand.cpp @@ -1,9 +1,13 @@ -// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later #include "inserttextundocommand.h" +namespace { +constexpr int ColumnEditTextMergeId = 1001; +} + InsertTextUndoCommand::InsertTextUndoCommand(const QTextCursor &textcursor, const QString &text, QPlainTextEdit *edit, QUndoCommand *parent) : QUndoCommand(parent) , m_pEdit(edit) @@ -43,8 +47,13 @@ void InsertTextUndoCommand::undo() } } else { int cnt = m_ColumnEditSelections.size(); + int deleteLen = m_sInsertText.length(); for (int i = 0; i < cnt; i++) { - m_ColumnEditSelections[i].cursor.deleteChar(); + auto &cursor = m_ColumnEditSelections[i].cursor; + int startPos = cursor.selectionStart(); + cursor.setPosition(startPos); + cursor.setPosition(startPos + deleteLen, QTextCursor::KeepAnchor); + cursor.deleteChar(); } if (m_pEdit && !m_ColumnEditSelections.isEmpty()) { @@ -76,7 +85,7 @@ void InsertTextUndoCommand::redo() int cnt = m_ColumnEditSelections.size(); for (int i = 0; i < cnt; i++) { m_ColumnEditSelections[i].cursor.insertText(m_sInsertText); - m_ColumnEditSelections[i].cursor.setPosition(m_ColumnEditSelections[i].cursor.position() - m_sInsertText.length() + 1, + m_ColumnEditSelections[i].cursor.setPosition(m_ColumnEditSelections[i].cursor.position() - m_sInsertText.length(), QTextCursor::KeepAnchor); } @@ -88,6 +97,24 @@ void InsertTextUndoCommand::redo() } } +int InsertTextUndoCommand::id() const +{ + return ColumnEditTextMergeId; +} + +bool InsertTextUndoCommand::mergeWith(const QUndoCommand *other) +{ + if (m_ColumnEditSelections.isEmpty()) + return false; + + const InsertTextUndoCommand *cmd = dynamic_cast(other); + if (!cmd || cmd->m_ColumnEditSelections.isEmpty()) + return false; + + m_sInsertText += cmd->m_sInsertText; + return true; +} + /** * @class MidButtonInsertTextUndoCommand * @brief 用于鼠标中键黏贴的插入撤销项,使用 QClipboard::Selection 类型插入选中的数据, diff --git a/src/editor/inserttextundocommand.h b/src/editor/inserttextundocommand.h index 393dc95c..7fa5413b 100644 --- a/src/editor/inserttextundocommand.h +++ b/src/editor/inserttextundocommand.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -21,6 +21,8 @@ class InsertTextUndoCommand : public QUndoCommand QUndoCommand *parent = nullptr); virtual void undo(); virtual void redo(); + virtual int id() const override; + virtual bool mergeWith(const QUndoCommand *other) override; private: QPlainTextEdit *m_pEdit = nullptr;