diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index ffdd105d39b..7e7b650da82 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -304,24 +304,28 @@ Qt::ItemFlags NavigatorTreeModel::flags(const QModelIndex &index) const void static appendForcedNodes(const NodeListProperty &property, QList &list) { - const QStringList visibleProperties = NodeHints::fromModelNode(property.parentModelNode()).visibleNonDefaultProperties(); + const QSet set = QSet(list.constBegin(), list.constEnd()); for (const ModelNode &node : property.parentModelNode().directSubModelNodes()) { - if (!list.contains(node) && visibleProperties.contains(QString::fromUtf8(node.parentProperty().name()))) - list.append(node); + if (!set.contains(node)) { + const QStringList visibleProperties = NodeHints::fromModelNode(property.parentModelNode()).visibleNonDefaultProperties(); + if (visibleProperties.contains(QString::fromUtf8(node.parentProperty().name()))) + list.append(node); + } } } -QList filteredList(const NodeListProperty &property, bool filter, bool reverseOrder) +QList NavigatorTreeModel::filteredList(const NodeListProperty &property, bool filter, bool reverseOrder) const { + auto it = m_rowCache.find(property.parentModelNode()); + + if (it != m_rowCache.end()) + return it.value(); + QList list; if (filter) { list.append(Utils::filtered(property.toModelNodeList(), [] (const ModelNode &arg) { - const char auxProp[] = "showInNavigator@Internal"; - if (arg.hasAuxiliaryData(auxProp)) - return arg.auxiliaryData(auxProp).toBool(); const bool value = QmlItemNode::isValidQmlItemNode(arg) || NodeHints::fromModelNode(arg).visibleInNavigator(); - arg.setAuxiliaryDataWithoutLock(auxProp, value); return value; })); } else { @@ -333,6 +337,7 @@ QList filteredList(const NodeListProperty &property, bool filter, boo if (reverseOrder) std::reverse(list.begin(), list.end()); + m_rowCache.insert(property.parentModelNode(), list); return list; } @@ -1137,6 +1142,7 @@ QList NavigatorTreeModel::nodesToPersistentIndex(const QL void NavigatorTreeModel::notifyModelNodesRemoved(const QList &modelNodes) { + m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); emit layoutAboutToBeChanged(indexes); emit layoutChanged(indexes); @@ -1144,6 +1150,7 @@ void NavigatorTreeModel::notifyModelNodesRemoved(const QList &modelNo void NavigatorTreeModel::notifyModelNodesInserted(const QList &modelNodes) { + m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); emit layoutAboutToBeChanged(indexes); emit layoutChanged(indexes); @@ -1151,6 +1158,7 @@ void NavigatorTreeModel::notifyModelNodesInserted(const QList &modelN void NavigatorTreeModel::notifyModelNodesMoved(const QList &modelNodes) { + m_rowCache.clear(); QList indexes = nodesToPersistentIndex(collectParents(modelNodes)); emit layoutAboutToBeChanged(indexes); emit layoutChanged(indexes); @@ -1164,18 +1172,21 @@ void NavigatorTreeModel::notifyIconsChanged() void NavigatorTreeModel::setFilter(bool showOnlyVisibleItems) { m_showOnlyVisibleItems = showOnlyVisibleItems; + m_rowCache.clear(); resetModel(); } void NavigatorTreeModel::setOrder(bool reverseItemOrder) { m_reverseItemOrder = reverseItemOrder; + m_rowCache.clear(); resetModel(); } void NavigatorTreeModel::resetModel() { beginResetModel(); + m_rowCache.clear(); m_nodeIndexHash.clear(); endResetModel(); } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h index cb2d9451b42..ab7cd60b931 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h @@ -129,9 +129,11 @@ private: ModelNode createTextureNode(const NodeAbstractProperty &targetProp, const QString &imagePath); QList nodesToPersistentIndex(const QList &modelNodes); void addImport(const QString &importName); + QList filteredList(const NodeListProperty &property, bool filter, bool reverseOrder) const; QPointer m_view; mutable QHash m_nodeIndexHash; + mutable QHash > m_rowCache; bool m_showOnlyVisibleItems = true; bool m_reverseItemOrder = false; DesignerActionManager *m_actionManager = nullptr;