DataSourceItemMergeHelper.cpp
55 lines
| 1.7 KiB
| text/x-c
|
CppLexer
Alexandre Leroux
|
r1031 | #include "DataSource/DataSourceItemMergeHelper.h" | ||
#include <DataSource/DataSourceItem.h> | ||||
Alexandre Leroux
|
r1032 | namespace { | ||
/** | ||||
* Finds in a tree an item similar to the item passed in parameter | ||||
* @param item the item for which to find a similar item | ||||
* @param root the root item of the tree | ||||
* @return the similar item if found, nullptr otherwise | ||||
*/ | ||||
DataSourceItem *findSimilarItem(const DataSourceItem &item, const DataSourceItem &root) | ||||
{ | ||||
// An item is considered similar to the another item if: | ||||
// - the items are both nodes AND | ||||
// - the names of the items are identical | ||||
if (item.type() != DataSourceItemType::NODE) { | ||||
return nullptr; | ||||
} | ||||
DataSourceItem *result{nullptr}; | ||||
bool found{false}; | ||||
for (auto i = 0, count = root.childCount(); i < count && !found; ++i) { | ||||
auto child = root.child(i); | ||||
found = child->type() == DataSourceItemType::NODE | ||||
&& QString::compare(child->name(), item.name(), Qt::CaseInsensitive) == 0; | ||||
if (found) { | ||||
result = child; | ||||
} | ||||
} | ||||
return result; | ||||
} | ||||
} // namespace | ||||
Alexandre Leroux
|
r1031 | void DataSourceItemMergeHelper::merge(const DataSourceItem &source, DataSourceItem &dest) | ||
{ | ||||
Alexandre Leroux
|
r1032 | // Checks if the source item can be merged into the destination item (i.e. there is a child item | ||
// similar to the source item) | ||||
if (auto subItem = findSimilarItem(source, dest)) { | ||||
// If there is an item similar to the source item, applies the merge recursively | ||||
for (auto i = 0, count = source.childCount(); i < count; ++i) { | ||||
merge(*source.child(i), *subItem); | ||||
} | ||||
} | ||||
else { | ||||
// If no item is similar to the source item, the item is copied as the child of the | ||||
// destination item | ||||
dest.appendChild(source.clone()); | ||||
} | ||||
Alexandre Leroux
|
r1031 | } | ||