| @@ -1,5 +1,8 @@ | |||||
| #pragma once | #pragma once | ||||
| #include "common.hpp" | #include "common.hpp" | ||||
| #include "math.hpp" | |||||
| #include "plugin/Model.hpp" | |||||
| #include <vector> | |||||
| namespace rack { | namespace rack { | ||||
| @@ -8,13 +11,26 @@ namespace history { | |||||
| struct Action { | struct Action { | ||||
| virtual ~Action() {} | virtual ~Action() {} | ||||
| virtual void commit() {} | |||||
| virtual void commitInverse() {} | |||||
| virtual void undo() {} | |||||
| virtual void redo() {} | |||||
| }; | |||||
| struct ModuleAdd : Action { | |||||
| Model *model; | |||||
| int moduleId; | |||||
| math::Vec pos; | |||||
| void undo() override; | |||||
| void redo() override; | |||||
| }; | }; | ||||
| struct State { | struct State { | ||||
| std::vector<Action*> actions; | |||||
| int actionIndex = 0; | |||||
| ~State(); | |||||
| void push(Action *action); | void push(Action *action); | ||||
| void undo(); | void undo(); | ||||
| void redo(); | void redo(); | ||||
| @@ -5,16 +5,33 @@ namespace rack { | |||||
| namespace history { | namespace history { | ||||
| void State::push(Action *action) { | |||||
| State::~State() { | |||||
| for (Action *action : actions) { | |||||
| delete action; | |||||
| } | |||||
| } | |||||
| void State::push(Action *action) { | |||||
| for (int i = actionIndex; i < (int) actions.size(); i++) { | |||||
| delete actions[i]; | |||||
| } | |||||
| actions.resize(actionIndex); | |||||
| actions.push_back(action); | |||||
| actionIndex++; | |||||
| } | } | ||||
| void State::undo() { | void State::undo() { | ||||
| DEBUG("undo"); | |||||
| if (actionIndex > 0) { | |||||
| actionIndex--; | |||||
| actions[actionIndex]->undo(); | |||||
| } | |||||
| } | } | ||||
| void State::redo() { | void State::redo() { | ||||
| DEBUG("redo"); | |||||
| if ((int) actions.size() > actionIndex) { | |||||
| actions[actionIndex]->redo(); | |||||
| actionIndex++; | |||||
| } | |||||
| } | } | ||||