diff --git a/src/editor/dtextedit.cpp b/src/editor/dtextedit.cpp index 1893f77c..496de6ea 100644 --- a/src/editor/dtextedit.cpp +++ b/src/editor/dtextedit.cpp @@ -273,7 +273,7 @@ void TextEdit::insertColumnEditTextEx(QString text) for (int i = 0; i < m_altModSelections.size(); i++) { if (m_altModSelections[i].cursor.hasSelection()) deleteTextEx(m_altModSelections[i].cursor); } - QUndoCommand *pInsertStack = new InsertTextUndoCommand(m_altModSelections, text, this); + QUndoCommand *pInsertStack = new InsertTextUndoCommand(m_altModSelections, text, this, m_columnEditSessionId); m_pUndoStack->push(pInsertStack); ensureCursorVisible(); } @@ -6691,6 +6691,7 @@ void TextEdit::mousePressEvent(QMouseEvent *e) m_altStartTextCursor.clearSelection(); this->setTextCursor(m_altStartTextCursor); m_altModSelections.clear(); + m_columnEditSessionId++; } else { @@ -6698,6 +6699,7 @@ void TextEdit::mousePressEvent(QMouseEvent *e) { // 右键,调用右键菜单时候不能清空 m_bIsAltMod = false; m_altModSelections.clear(); + m_columnEditSessionId++; } } diff --git a/src/editor/dtextedit.h b/src/editor/dtextedit.h index de2206a5..e1a80783 100644 --- a/src/editor/dtextedit.h +++ b/src/editor/dtextedit.h @@ -839,6 +839,7 @@ private slots: QTextCursor m_altStartTextCursor;//开始按住alt鼠标点击光标位置 QTextCursor m_altEndTextCursor;//结束按住alt鼠标点击光标位置 bool m_bIsAltMod = false; + int m_columnEditSessionId = 0; int m_redoCount = 0; QStringList m_pastText; bool m_hasColumnSelection = false; diff --git a/src/editor/inserttextundocommand.cpp b/src/editor/inserttextundocommand.cpp index b02864ff..c779a01f 100644 --- a/src/editor/inserttextundocommand.cpp +++ b/src/editor/inserttextundocommand.cpp @@ -16,11 +16,13 @@ InsertTextUndoCommand::InsertTextUndoCommand(const QTextCursor &textcursor, cons InsertTextUndoCommand::InsertTextUndoCommand(QList &selections, const QString &text, QPlainTextEdit *edit, + int sessionId, QUndoCommand *parent) : QUndoCommand(parent) , m_pEdit(edit) , m_sInsertText(text) , m_ColumnEditSelections(selections) + , m_sessionId(sessionId) { m_sInsertText.replace("\r\n", "\n"); } @@ -44,7 +46,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 +83,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 +95,28 @@ 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; + + if (m_sessionId != cmd->m_sessionId) + return false; + + m_sInsertText += cmd->m_sInsertText; + m_ColumnEditSelections = cmd->m_ColumnEditSelections; + return true; +} + /** * @class MidButtonInsertTextUndoCommand * @brief 用于鼠标中键黏贴的插入撤销项,使用 QClipboard::Selection 类型插入选中的数据, diff --git a/src/editor/inserttextundocommand.h b/src/editor/inserttextundocommand.h index 393dc95c..4eeab9bc 100644 --- a/src/editor/inserttextundocommand.h +++ b/src/editor/inserttextundocommand.h @@ -18,9 +18,12 @@ class InsertTextUndoCommand : public QUndoCommand explicit InsertTextUndoCommand(QList &selections, const QString &text, QPlainTextEdit *edit, + int sessionId = 0, QUndoCommand *parent = nullptr); virtual void undo(); virtual void redo(); + int id() const override; + bool mergeWith(const QUndoCommand *other) override; private: QPlainTextEdit *m_pEdit = nullptr; @@ -29,7 +32,9 @@ class InsertTextUndoCommand : public QUndoCommand int m_endPostion{0}; QString m_sInsertText; QList m_ColumnEditSelections; + int m_sessionId = 0; QString m_selectText = QString(); + static constexpr int kColumnEditInsertCommandId = 1001; }; /**