Fixed undo/redo system
This commit is contained in:
parent
5afd5ec24a
commit
67bd80fba5
2 changed files with 91 additions and 3 deletions
|
@ -16,6 +16,13 @@ void DiffManager::addWatcher(const DefinitionNode *node, DefinitionWatcher *watc
|
|||
|
||||
void DiffManager::addDiff(DefinitionNode *node, const DefinitionDiff *diff)
|
||||
{
|
||||
while (undone > 0)
|
||||
{
|
||||
// truncate diffs ahead
|
||||
diffs.pop_back();
|
||||
undone--;
|
||||
}
|
||||
|
||||
diffs.push_back(diff);
|
||||
|
||||
// TODO Delayed commit (with merge of consecutive diffs)
|
||||
|
@ -29,7 +36,7 @@ void DiffManager::addDiff(DefinitionNode *node, const DefinitionDiff *diff)
|
|||
|
||||
void DiffManager::undo()
|
||||
{
|
||||
if (undone <= (int)diffs.size())
|
||||
if (undone < (int)diffs.size())
|
||||
{
|
||||
undone++;
|
||||
const DefinitionDiff *diff = diffs[diffs.size() - undone];
|
||||
|
|
|
@ -4,12 +4,12 @@
|
|||
#include "DefinitionNode.h"
|
||||
#include "FloatNode.h"
|
||||
|
||||
TEST(DiffManager, undoRedoSimple)
|
||||
TEST(DiffManager, undoRedo)
|
||||
{
|
||||
DefinitionNode root(NULL, "root");
|
||||
FloatNode leaf(&root, "value", 2.6);
|
||||
DiffManager *diffs = root.getDiffManager();
|
||||
|
||||
FloatNode leaf(&root, "value", 2.6);
|
||||
EXPECT_DOUBLE_EQ(2.6, leaf.getValue());
|
||||
|
||||
leaf.setValue(4.3);
|
||||
|
@ -30,3 +30,84 @@ TEST(DiffManager, undoRedoSimple)
|
|||
diffs->redo();
|
||||
EXPECT_DOUBLE_EQ(-2.1, leaf.getValue());
|
||||
}
|
||||
|
||||
TEST(DiffManager, undoTooMuch)
|
||||
{
|
||||
DefinitionNode root(NULL, "root");
|
||||
DiffManager *diffs = root.getDiffManager();
|
||||
|
||||
FloatNode leaf(&root, "value", 1.1);
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
|
||||
leaf.setValue(2.2);
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
diffs->undo();
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
|
||||
diffs->undo();
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
|
||||
diffs->redo();
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
}
|
||||
|
||||
TEST(DiffManager, redoTooMuch)
|
||||
{
|
||||
DefinitionNode root(NULL, "root");
|
||||
DiffManager *diffs = root.getDiffManager();
|
||||
|
||||
FloatNode leaf(&root, "value", 1.1);
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
|
||||
leaf.setValue(2.2);
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
diffs->undo();
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
|
||||
diffs->redo();
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
diffs->redo();
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
diffs->undo();
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
}
|
||||
|
||||
TEST(DiffManager, undoBranch)
|
||||
{
|
||||
DefinitionNode root(NULL, "root");
|
||||
DiffManager *diffs = root.getDiffManager();
|
||||
|
||||
FloatNode leaf(&root, "value", 1.1);
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
|
||||
leaf.setValue(2.2);
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
leaf.setValue(3.3);
|
||||
EXPECT_DOUBLE_EQ(3.3, leaf.getValue());
|
||||
|
||||
diffs->undo();
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
leaf.setValue(4.4);
|
||||
EXPECT_DOUBLE_EQ(4.4, leaf.getValue());
|
||||
|
||||
diffs->undo();
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
diffs->undo();
|
||||
EXPECT_DOUBLE_EQ(1.1, leaf.getValue());
|
||||
|
||||
diffs->redo();
|
||||
EXPECT_DOUBLE_EQ(2.2, leaf.getValue());
|
||||
|
||||
diffs->redo();
|
||||
EXPECT_DOUBLE_EQ(4.4, leaf.getValue());
|
||||
|
||||
diffs->redo();
|
||||
EXPECT_DOUBLE_EQ(4.4, leaf.getValue());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue