@@ -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++; | |||||
} | |||||
} | } | ||||