paysages3d/src/definition/DiffManager.cpp

63 lines
1.3 KiB
C++
Raw Normal View History

#include "DiffManager.h"
#include "DefinitionNode.h"
#include "DefinitionDiff.h"
DiffManager::DiffManager(DefinitionNode *tree):
tree(tree)
{
undone = 0;
}
void DiffManager::addWatcher(const DefinitionNode *node, DefinitionWatcher *watcher)
{
watchers[node].push_back(watcher);
}
void DiffManager::addDiff(DefinitionNode *node, const DefinitionDiff *diff)
{
2015-08-17 16:18:31 +00:00
while (undone > 0)
{
// truncate diffs ahead
diffs.pop_back();
undone--;
}
diffs.push_back(diff);
// TODO Delayed commit (with merge of consecutive diffs)
node->applyDiff(diff);
for (auto &watcher: watchers[node])
{
// TODO
}
}
void DiffManager::undo()
{
2015-08-17 16:18:31 +00:00
if (undone < (int)diffs.size())
{
undone++;
const DefinitionDiff *diff = diffs[diffs.size() - undone];
// Obtain the node by path and reverse apply diff on it
DefinitionNode *node = tree->findByPath(diff->getPath());
node->applyDiff(diff, true);
}
}
void DiffManager::redo()
{
if (undone > 0)
{
const DefinitionDiff *diff = diffs[diffs.size() - undone];
undone--;
// Obtain the node by path and re-apply diff on it
DefinitionNode *node = tree->findByPath(diff->getPath());
node->applyDiff(diff);
}
}