UndoCommands.hpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #pragma once
  2. #include "Definitions.hpp"
  3. #include <QUndoCommand>
  4. #include <QtCore/QJsonObject>
  5. #include <QtCore/QPointF>
  6. #include <unordered_set>
  7. namespace QtNodes {
  8. class BasicGraphicsScene;
  9. class CreateCommand : public QUndoCommand
  10. {
  11. public:
  12. CreateCommand(BasicGraphicsScene *scene, QString const name, QPointF const &mouseScenePos);
  13. void undo() override;
  14. void redo() override;
  15. private:
  16. BasicGraphicsScene *_scene;
  17. NodeId _nodeId;
  18. QJsonObject _sceneJson;
  19. };
  20. /**
  21. * Selected scene objects are serialized and then removed from the scene.
  22. * The deleted elements could be restored in `undo`.
  23. */
  24. class DeleteCommand : public QUndoCommand
  25. {
  26. public:
  27. DeleteCommand(BasicGraphicsScene *scene);
  28. void undo() override;
  29. void redo() override;
  30. private:
  31. BasicGraphicsScene *_scene;
  32. QJsonObject _sceneJson;
  33. };
  34. class CopyCommand : public QUndoCommand
  35. {
  36. public:
  37. CopyCommand(BasicGraphicsScene *scene);
  38. };
  39. class PasteCommand : public QUndoCommand
  40. {
  41. public:
  42. PasteCommand(BasicGraphicsScene *scene, QPointF const &mouseScenePos);
  43. void undo() override;
  44. void redo() override;
  45. private:
  46. QJsonObject takeSceneJsonFromClipboard();
  47. QJsonObject makeNewNodeIdsInScene(QJsonObject const &sceneJson);
  48. private:
  49. BasicGraphicsScene *_scene;
  50. QPointF const &_mouseScenePos;
  51. QJsonObject _newSceneJson;
  52. };
  53. class DisconnectCommand : public QUndoCommand
  54. {
  55. public:
  56. DisconnectCommand(BasicGraphicsScene *scene, ConnectionId const);
  57. void undo() override;
  58. void redo() override;
  59. private:
  60. BasicGraphicsScene *_scene;
  61. ConnectionId _connId;
  62. };
  63. class ConnectCommand : public QUndoCommand
  64. {
  65. public:
  66. ConnectCommand(BasicGraphicsScene *scene, ConnectionId const);
  67. void undo() override;
  68. void redo() override;
  69. private:
  70. BasicGraphicsScene *_scene;
  71. ConnectionId _connId;
  72. };
  73. class MoveNodeCommand : public QUndoCommand
  74. {
  75. public:
  76. MoveNodeCommand(BasicGraphicsScene *scene, QPointF const &diff);
  77. void undo() override;
  78. void redo() override;
  79. /**
  80. * A command ID is used in command compression. It must be an integer unique to
  81. * this command's class, or -1 if the command doesn't support compression.
  82. */
  83. int id() const override;
  84. /**
  85. * Several sequential movements could be merged into one command.
  86. */
  87. bool mergeWith(QUndoCommand const *c) override;
  88. private:
  89. BasicGraphicsScene *_scene;
  90. std::unordered_set<NodeId> _selectedNodes;
  91. QPointF _diff;
  92. };
  93. } // namespace QtNodes