@@ -2,7 +2,54 | |||||
2 |
|
2 | |||
3 | #include <DataSource/DataSourceItem.h> |
|
3 | #include <DataSource/DataSourceItem.h> | |
4 |
|
4 | |||
|
5 | namespace { | |||
|
6 | ||||
|
7 | /** | |||
|
8 | * Finds in a tree an item similar to the item passed in parameter | |||
|
9 | * @param item the item for which to find a similar item | |||
|
10 | * @param root the root item of the tree | |||
|
11 | * @return the similar item if found, nullptr otherwise | |||
|
12 | */ | |||
|
13 | DataSourceItem *findSimilarItem(const DataSourceItem &item, const DataSourceItem &root) | |||
|
14 | { | |||
|
15 | // An item is considered similar to the another item if: | |||
|
16 | // - the items are both nodes AND | |||
|
17 | // - the names of the items are identical | |||
|
18 | ||||
|
19 | if (item.type() != DataSourceItemType::NODE) { | |||
|
20 | return nullptr; | |||
|
21 | } | |||
|
22 | ||||
|
23 | DataSourceItem *result{nullptr}; | |||
|
24 | bool found{false}; | |||
|
25 | for (auto i = 0, count = root.childCount(); i < count && !found; ++i) { | |||
|
26 | auto child = root.child(i); | |||
|
27 | ||||
|
28 | found = child->type() == DataSourceItemType::NODE | |||
|
29 | && QString::compare(child->name(), item.name(), Qt::CaseInsensitive) == 0; | |||
|
30 | if (found) { | |||
|
31 | result = child; | |||
|
32 | } | |||
|
33 | } | |||
|
34 | ||||
|
35 | return result; | |||
|
36 | } | |||
|
37 | ||||
|
38 | } // namespace | |||
|
39 | ||||
5 | void DataSourceItemMergeHelper::merge(const DataSourceItem &source, DataSourceItem &dest) |
|
40 | void DataSourceItemMergeHelper::merge(const DataSourceItem &source, DataSourceItem &dest) | |
6 | { |
|
41 | { | |
7 | /// @todo ALX |
|
42 | // Checks if the source item can be merged into the destination item (i.e. there is a child item | |
|
43 | // similar to the source item) | |||
|
44 | if (auto subItem = findSimilarItem(source, dest)) { | |||
|
45 | // If there is an item similar to the source item, applies the merge recursively | |||
|
46 | for (auto i = 0, count = source.childCount(); i < count; ++i) { | |||
|
47 | merge(*source.child(i), *subItem); | |||
|
48 | } | |||
|
49 | } | |||
|
50 | else { | |||
|
51 | // If no item is similar to the source item, the item is copied as the child of the | |||
|
52 | // destination item | |||
|
53 | dest.appendChild(source.clone()); | |||
|
54 | } | |||
8 | } |
|
55 | } |
General Comments 0
You need to be logged in to leave comments.
Login now