diff --git a/src/editor/inserttextundocommand.cpp b/src/editor/inserttextundocommand.cpp index b02864ff..3ea8c1b8 100644 --- a/src/editor/inserttextundocommand.cpp +++ b/src/editor/inserttextundocommand.cpp @@ -44,7 +44,12 @@ void InsertTextUndoCommand::undo() } else { int cnt = m_ColumnEditSelections.size(); for (int i = 0; i < cnt; i++) { - m_ColumnEditSelections[i].cursor.deleteChar(); + QTextCursor &cursor = m_ColumnEditSelections[i].cursor; + int endPos = cursor.selectionEnd(); + int startPos = endPos - m_sInsertText.length(); + cursor.setPosition(startPos); + cursor.setPosition(endPos, QTextCursor::KeepAnchor); + cursor.deleteChar(); } if (m_pEdit && !m_ColumnEditSelections.isEmpty()) { @@ -76,7 +81,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 +93,24 @@ void InsertTextUndoCommand::redo() } } +int InsertTextUndoCommand::id() const +{ + return kColumnEditInsertCommandId; +} + +bool InsertTextUndoCommand::mergeWith(const QUndoCommand *other) +{ + if (other->id() != id()) + return false; + + const auto *cmd = static_cast(other); + if (m_ColumnEditSelections.isEmpty() || 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..7243a588 100644 --- a/src/editor/inserttextundocommand.h +++ b/src/editor/inserttextundocommand.h @@ -21,6 +21,8 @@ class InsertTextUndoCommand : public QUndoCommand QUndoCommand *parent = nullptr); virtual void undo(); virtual void redo(); + int id() const override; + bool mergeWith(const QUndoCommand *other) override; private: QPlainTextEdit *m_pEdit = nullptr; @@ -30,6 +32,7 @@ class InsertTextUndoCommand : public QUndoCommand QString m_sInsertText; QList m_ColumnEditSelections; QString m_selectText = QString(); + static constexpr int kColumnEditInsertCommandId = 1001; }; /**