You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
1.9KB

  1. #pragma once
  2. #include "common.hpp"
  3. #include "math.hpp"
  4. #include "color.hpp"
  5. #include "plugin/Model.hpp"
  6. #include <vector>
  7. #include <jansson.h>
  8. namespace rack {
  9. struct CableWidget;
  10. namespace history {
  11. struct Action {
  12. virtual ~Action() {}
  13. virtual void undo() {}
  14. virtual void redo() {}
  15. };
  16. template <class TAction>
  17. struct InverseAction : TAction {
  18. void undo() override {
  19. TAction::redo();
  20. }
  21. void redo() override {
  22. TAction::undo();
  23. }
  24. };
  25. /** Batches multiple actions into one */
  26. struct ComplexAction : Action {
  27. /** Ordered by time occurred. Undoing will replay them backwards. */
  28. std::vector<Action*> actions;
  29. ~ComplexAction();
  30. void undo() override;
  31. void redo() override;
  32. void push(Action *action);
  33. };
  34. /** An action operating on a module
  35. Subclass this to create your own custom actions for your module.
  36. */
  37. struct ModuleAction : Action {
  38. int moduleId;
  39. };
  40. struct ModuleAdd : ModuleAction {
  41. Model *model;
  42. math::Vec pos;
  43. void undo() override;
  44. void redo() override;
  45. };
  46. struct ModuleRemove : ModuleAction {
  47. Model *model;
  48. math::Vec pos;
  49. json_t *moduleJ;
  50. ~ModuleRemove();
  51. void undo() override;
  52. void redo() override;
  53. };
  54. struct ModuleMove : ModuleAction {
  55. math::Vec oldPos;
  56. math::Vec newPos;
  57. void undo() override;
  58. void redo() override;
  59. };
  60. struct ModuleBypass : ModuleAction {
  61. bool bypass;
  62. void undo() override;
  63. void redo() override;
  64. };
  65. struct ParamChange : ModuleAction {
  66. int paramId;
  67. float oldValue;
  68. float newValue;
  69. void undo() override;
  70. void redo() override;
  71. };
  72. struct CableAdd : Action {
  73. int cableId;
  74. int outputModuleId;
  75. int outputId;
  76. int inputModuleId;
  77. int inputId;
  78. NVGcolor color;
  79. void setCable(CableWidget *cw);
  80. void undo() override;
  81. void redo() override;
  82. };
  83. struct CableRemove : InverseAction<CableAdd> {};
  84. struct State {
  85. std::vector<Action*> actions;
  86. int actionIndex = 0;
  87. ~State();
  88. void push(Action *action);
  89. void undo();
  90. void redo();
  91. };
  92. } // namespace history
  93. } // namespace rack