const AbstractProperty * PropertyGroup::findProperty(const std::vector<std::string> & path) const { // [TODO] Use iterative approach rather than recursion // Check if path is valid if (path.size() == 0) { return nullptr; } // Check if first element of the path exists in this group if (!propertyExists(path.front())) { return nullptr; } // Get the respective property AbstractProperty * property = m_propertiesMap.at(path.front()); // If there are no more sub-paths, return the found property if (path.size() == 1) { return property; } // Otherwise, it is an element in the middle of the path, so ensure it is a group if (!property->isGroup()) { return nullptr; } // Call recursively on subgroup return property->asGroup()->findProperty({ path.begin() + 1, path.end() }); }
void PropertyBrowser::expandAllGroups() { QAbstractItemModel * model = this->model(); QModelIndexList indexes = model->match(model->index(0,0), Qt::DisplayRole, "*", -1, Qt::MatchWildcard|Qt::MatchRecursive); for (QModelIndex index : indexes) { if (!index.isValid()) continue; AbstractProperty * property = retrieveProperty(index); if (property->isGroup() && model->hasChildren(index)) expand(index); } }
void PropertyBrowser::onRowsInserted(const QModelIndex & parentIndex, int first, int last) { QAbstractItemModel * model = this->model(); for (int i = first; i <= last; ++i) { QModelIndex index = model->index(i, 0, parentIndex); if (!index.isValid()) continue; AbstractProperty * property = retrieveProperty(index); if (property->isGroup() && model->hasChildren(index)) expand(index); } }
PropertyGroup * PropertyGroup::ensureGroup(const std::vector<std::string> & path) { // [TODO] Use iterative approach rather than recursion // Check if path is valid if (path.size() == 0) { return nullptr; } // Check if group exists PropertyGroup * group = nullptr; if (propertyExists(path.front())) { // Get property AbstractProperty * property = m_propertiesMap.at(path.front()); // Abort if this is not a group if (!property->isGroup()) { return nullptr; } // Get as group group = property->asGroup(); } else { // Add new group group = addGroup(path.front()); } // If there are no more sub-paths, return the group if (path.size() == 1) { return group; } // Otherwise, call recursively on subgroup return group->ensureGroup(std::vector<std::string>(path.begin() + 1, path.end())); }