/
MergeOperation.cpp
88 lines (69 loc) · 2.04 KB
/
MergeOperation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "MergeOperation.h"
#include "MergeAction.h"
#include "SelectionGroupMerger.h"
#include "LayerMerger.h"
namespace scene
{
namespace merge
{
MergeOperation::~MergeOperation()
{
clearActions();
}
void MergeOperation::createActionsForEntity(const ComparisonResult::EntityDifference& difference, const IMapRootNodePtr& targetRoot)
{
switch (difference.type)
{
case ComparisonResult::EntityDifference::Type::EntityMissingInSource:
addAction(std::make_shared<RemoveEntityAction>(difference.baseNode));
break;
case ComparisonResult::EntityDifference::Type::EntityMissingInBase:
addAction(std::make_shared<AddEntityAction>(difference.sourceNode, targetRoot));
break;
case ComparisonResult::EntityDifference::Type::EntityPresentButDifferent:
{
for (const auto& keyValueDiff : difference.differingKeyValues)
{
addActionForKeyValueDiff(keyValueDiff, difference.baseNode);
}
for (const auto& primitiveDiff : difference.differingChildren)
{
addActionsForPrimitiveDiff(primitiveDiff, difference.baseNode);
}
break;
}
};
}
MergeOperation::Ptr MergeOperation::CreateFromComparisonResult(const ComparisonResult& result)
{
auto operation = std::make_shared<MergeOperation>(result.getSourceRootNode(), result.getBaseRootNode());
for (const auto& difference : result.differingEntities)
{
operation->createActionsForEntity(difference, result.getBaseRootNode());
}
return operation;
}
void MergeOperation::applyActions()
{
MergeOperationBase::applyActions();
if (_mergeSelectionGroups)
{
SelectionGroupMerger merger(_sourceRoot, _baseRoot);
merger.adjustBaseGroups();
}
if (_mergeLayers)
{
LayerMerger merger(_sourceRoot, _baseRoot);
merger.adjustBaseLayers();
}
}
void MergeOperation::setMergeSelectionGroups(bool enabled)
{
_mergeSelectionGroups = enabled;
}
void MergeOperation::setMergeLayers(bool enabled)
{
_mergeLayers = enabled;
}
}
}