From 4e02f295fedcb2d5e6fad56f2aa9f4dded502a6f Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 21 Feb 2025 14:49:46 +0100 Subject: [PATCH] QmlDesigner: Lazy initialization of node hints Very often they are not need, so they can be lazy initialized. Change-Id: I65f758c70f25517a29da87e3c42dec02c84049d2 Reviewed-by: Miikka Heikkinen --- .../libs/designercore/include/nodehints.h | 4 ++-- .../libs/designercore/metainfo/nodehints.cpp | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/include/nodehints.h b/src/plugins/qmldesigner/libs/designercore/include/nodehints.h index f55bbfb8eff..a1b62251e41 100644 --- a/src/plugins/qmldesigner/libs/designercore/include/nodehints.h +++ b/src/plugins/qmldesigner/libs/designercore/include/nodehints.h @@ -54,7 +54,6 @@ public: QPair setParentProperty() const; QString bindParentToProperty() const; - QHash hints() const; static NodeHints fromModelNode(const ModelNode &modelNode); static NodeHints fromItemLibraryEntry(const ItemLibraryEntry &entry, Model *model); @@ -62,6 +61,7 @@ private: explicit NodeHints(const ModelNode &modelNode); explicit NodeHints(const NodeMetaInfo &metaInfo); explicit NodeHints(const ItemLibraryEntry &entry, Model *model); + QHash hints() const; const ModelNode &modelNode() const; bool isValid() const; Model *model() const; @@ -69,7 +69,7 @@ private: ModelNode m_modelNode; NodeMetaInfo m_metaInfo; - QHash m_hints; + mutable QHash m_hints; }; namespace Internal { diff --git a/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp index 48ba12078ca..f7f43670200 100644 --- a/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/libs/designercore/metainfo/nodehints.cpp @@ -107,8 +107,6 @@ QmlDesigner::NodeHints::NodeHints(const ModelNode &node) NodeHints::NodeHints(const NodeMetaInfo &metaInfo) : m_metaInfo{metaInfo} { - for (const auto &[name, expression] : metaInfo.typeHints()) - m_hints.insert(name.toQString(), expression.toQString()); } NodeHints::NodeHints(const ItemLibraryEntry &entry, [[maybe_unused]] Model *model) @@ -273,7 +271,7 @@ QString NodeHints::indexPropertyForStackedContainer() const if (!isValid()) return QString(); - const QString expression = m_hints.value("indexPropertyForStackedContainer"); + const QString expression = hints().value("indexPropertyForStackedContainer"); if (expression.isEmpty()) return QString(); @@ -286,7 +284,7 @@ QStringList NodeHints::visibleNonDefaultProperties() const if (!isValid()) return {}; - const QString expression = m_hints.value("visibleNonDefaultProperties"); + const QString expression = hints().value("visibleNonDefaultProperties"); if (expression.isEmpty()) return {}; @@ -345,7 +343,7 @@ bool NodeHints::visibleInLibrary() const QString NodeHints::forceNonDefaultProperty() const { - const QString expression = m_hints.value("forceNonDefaultProperty"); + const QString expression = hints().value("forceNonDefaultProperty"); if (expression.isEmpty()) return {}; @@ -369,7 +367,7 @@ QVariant parseValue(const QString &string) QPair NodeHints::setParentProperty() const { - const QString expression = m_hints.value("setParentProperty"); + const QString expression = hints().value("setParentProperty"); if (expression.isEmpty()) return {}; @@ -386,7 +384,7 @@ QPair NodeHints::setParentProperty() const QString NodeHints::bindParentToProperty() const { - const QString expression = m_hints.value("bindParentToProperty"); + const QString expression = hints().value("bindParentToProperty"); if (expression.isEmpty()) return {}; @@ -396,6 +394,13 @@ QString NodeHints::bindParentToProperty() const QHash NodeHints::hints() const { +#ifdef QDS_USE_PROJECTSTORAGE + if (m_hints.empty()) { + for (const auto &[name, expression] : m_metaInfo.typeHints()) + m_hints.insert(name.toQString(), expression.toQString()); + } +#endif + return m_hints; } @@ -426,7 +431,7 @@ Model *NodeHints::model() const bool NodeHints::evaluateBooleanExpression(const QString &hintName, bool defaultValue, const ModelNode otherNode) const { - const QString expression = m_hints.value(hintName); + const QString expression = hints().value(hintName); if (expression.isEmpty()) return defaultValue;