diff --git a/Undo.h b/Undo.h index e4ad16d..19da920 100644 --- a/Undo.h +++ b/Undo.h @@ -3,6 +3,9 @@ #include #include +#include +#include +#include "mainwindow.h" class LineEditCommand : public QUndoCommand { public: @@ -18,4 +21,40 @@ private: QString m_newText; }; +class PlainTextEditCommand : public QUndoCommand { +public: + PlainTextEditCommand(QPlainTextEdit* edit, const QString& oldText, const QString& newText, MainWindow* mw) + : m_edit(edit), m_oldText(oldText), m_newText(newText), m_mainWindow(mw) + { + // Sauvegarde la position du curseur actuelle + m_cursorPosition = edit->textCursor().position(); + } + + void undo() override { + m_mainWindow->m_handlingUndoRedo = true; + m_edit->setPlainText(m_oldText); + restoreCursor(); + m_mainWindow->m_handlingUndoRedo = false; + } + void redo() override { + m_mainWindow->m_handlingUndoRedo = true; + m_edit->setPlainText(m_newText); + restoreCursor(); + m_mainWindow->m_handlingUndoRedo = false; + } +private: + void restoreCursor() { + QTextCursor cursor = m_edit->textCursor(); + int pos = qMin(m_cursorPosition, m_edit->toPlainText().size()); + cursor.setPosition(pos); + m_edit->setTextCursor(cursor); + } + + QPlainTextEdit* m_edit; + QString m_oldText; + QString m_newText; + MainWindow* m_mainWindow; + int m_cursorPosition; +}; + #endif // UNDO_H diff --git a/mainwindow.cpp b/mainwindow.cpp index def8083..126a23f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -65,6 +65,16 @@ MainWindow::MainWindow(QWidget *parent) } }); + connect(ui->dialogEdit, &QPlainTextEdit::textChanged, this, [this]() { + static QString previousText = ui->dialogEdit->toPlainText(); + if (m_handlingUndoRedo) return; + QString currentText = ui->dialogEdit->toPlainText(); + if (currentText != previousText) { + undoStack->push(new PlainTextEditCommand(ui->dialogEdit, previousText, currentText, this)); + previousText = currentText; + } + }); + connect(ui->actionEditUndo, &QAction::triggered, undoStack, &QUndoStack::undo); connect(ui->actionEditRedo, &QAction::triggered, undoStack, &QUndoStack::redo); currentPath->getStep().append(Step()); diff --git a/mainwindow.h b/mainwindow.h index 1ad0360..8d1f40b 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -52,6 +52,7 @@ public: void saveFile(); void newPath(); void extractDialogue(); + bool m_handlingUndoRedo = false; private slots: void on_pushButton_clicked();