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.

138 lines
2.1KB

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