File indexing completed on 2024-12-08 07:28:35

0001 /*
0002     SPDX-FileCopyrightText: 2017 Nicolas Carion
0003     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 #pragma once
0007 
0008 #include <functional>
0009 
0010 using Fun = std::function<bool(void)>;
0011 
0012 /** @brief this macro executes an operation after a given lambda
0013  */
0014 #define PUSH_LAMBDA(operation, lambda)                                                                                                                         \
0015     lambda = [lambda, operation]() {                                                                                                                           \
0016         bool v = lambda();                                                                                                                                     \
0017         return v && operation();                                                                                                                               \
0018     };
0019 
0020 /** @brief this macro executes an operation before a given lambda
0021  */
0022 #define PUSH_FRONT_LAMBDA(operation, lambda)                                                                                                                   \
0023     lambda = [lambda, operation]() {                                                                                                                           \
0024         bool v = operation();                                                                                                                                  \
0025         return v && lambda();                                                                                                                                  \
0026     };
0027 
0028 #include <QUndoCommand>
0029 
0030 /** @brief this is a generic class that takes fonctors as undo and redo actions. It just executes them when required by Qt
0031   Note that QUndoStack actually executes redo() when we push the undoCommand to the stack
0032   This is bad for us because we execute the command as we construct the undo Function. So to prevent it to be executed twice, there is a small hack in this
0033   command that prevent redoing if it has not been undone before.
0034  */
0035 class FunctionalUndoCommand : public QUndoCommand
0036 {
0037 public:
0038     FunctionalUndoCommand(Fun undo, Fun redo, const QString &text, QUndoCommand *parent = nullptr);
0039     void undo() override;
0040     void redo() override;
0041 
0042 private:
0043     Fun m_undo, m_redo;
0044     bool m_undone;
0045 };