diff options
author | Marco Bubke <marco.bubke@qt.io> | 2020-10-13 16:52:48 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2020-10-14 17:00:31 +0000 |
commit | 60567d385ad54d9eb958b8e6635487d2a4b19a78 (patch) | |
tree | 7cce76fe2d1dd266dcb79ce8bb1d61576a6e574a /src/plugins/qmldesigner | |
parent | 3e9e768b35e4742d8c802f952ea6bfb33aa4ad0a (diff) |
QmlDesigner: Bind meta info cache to model
A global variable is not helping for multithreading and the cache has
anyway a 1:1 relationshit to the model.
Change-Id: Ic05f32744b70ef63aa5ae7d475afc0b5b17f2f09
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/plugins/qmldesigner')
7 files changed, 18 insertions, 28 deletions
diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index ae5c2fbcc2f..b572d55f0b4 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -579,7 +579,7 @@ void DesignDocument::paste() } view.setSelectedModelNodes({pastedNode}); }); - NodeMetaInfo::clearCache(); + view.model()->clearMetaInfoCache(); } } diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 4d97eb8694e..20611736e90 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -43,6 +43,7 @@ namespace QmlDesigner { namespace Internal { class ModelPrivate; class WriteLocker; +class NodeMetaInfoPrivate; } //Internal class AnchorLine; @@ -68,6 +69,7 @@ class QMLDESIGNERCORE_EXPORT Model : public QObject friend class QmlDesigner::AbstractView; friend class Internal::ModelPrivate; friend class Internal::WriteLocker; + friend class QmlDesigner::Internal::NodeMetaInfoPrivate; Q_OBJECT @@ -118,6 +120,8 @@ public: QList<ModelNode> selectedNodes(AbstractView *view) const; + void clearMetaInfoCache(); + protected: Model(); diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index b5e2e7626ca..869d327f5f2 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -107,8 +107,6 @@ public: QString importDirectoryPath() const; - static void clearCache(); - private: QSharedPointer<Internal::NodeMetaInfoPrivate> m_privateData; }; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index afd2aaa9a59..e6a61800e67 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -25,6 +25,7 @@ #include "nodemetainfo.h" #include "model.h" +#include "model/model_p.h" #include "metainfo.h" #include <enumeration.h> @@ -620,8 +621,6 @@ public: QSet<QByteArray> &prototypeCachePositives(); QSet<QByteArray> &prototypeCacheNegatives(); - static void clearCache(); - private: NodeMetaInfoPrivate(Model *model, TypeName type, int maj = -1, int min = -1); @@ -657,13 +656,10 @@ private: const Document *document() const; QPointer<Model> m_model; - static QHash<TypeName, Pointer> m_nodeMetaInfoCache; const ObjectValue *m_objectValue = nullptr; bool m_propertiesSetup = false; }; -QHash<TypeName, NodeMetaInfoPrivate::Pointer> NodeMetaInfoPrivate::m_nodeMetaInfoCache; - bool NodeMetaInfoPrivate::isFileComponent() const { return m_isFileComponent; @@ -705,11 +701,6 @@ QSet<QByteArray> &NodeMetaInfoPrivate::prototypeCacheNegatives() return m_prototypeCacheNegatives; } -void NodeMetaInfoPrivate::clearCache() -{ - m_nodeMetaInfoCache.clear(); -} - PropertyName NodeMetaInfoPrivate::defaultPropertyName() const { if (!m_defaultPropertyName.isEmpty()) @@ -724,17 +715,12 @@ static inline TypeName stringIdentifier( const TypeName &type, int maj, int min) NodeMetaInfoPrivate::Pointer NodeMetaInfoPrivate::create(Model *model, const TypeName &type, int major, int minor) { - if (m_nodeMetaInfoCache.contains(stringIdentifier(type, major, minor))) { - const Pointer &info = m_nodeMetaInfoCache.value(stringIdentifier(type, major, minor)); - if (info->model() == model) - return info; - else - m_nodeMetaInfoCache.clear(); - } + if (model->d->m_nodeMetaInfoCache.contains(stringIdentifier(type, major, minor))) + return model->d->m_nodeMetaInfoCache.value(stringIdentifier(type, major, minor)); Pointer newData(new NodeMetaInfoPrivate(model, type, major, minor)); if (newData->isValid()) - m_nodeMetaInfoCache.insert(stringIdentifier(type, major, minor), newData); + model->d->m_nodeMetaInfoCache.insert(stringIdentifier(type, major, minor), newData); return newData; } @@ -1671,11 +1657,6 @@ bool NodeMetaInfo::isQmlItem() const || isSubclassOf("QtQml.QtObject"); } -void NodeMetaInfo::clearCache() -{ - Internal::NodeMetaInfoPrivate::clearCache(); -} - bool NodeMetaInfo::isLayoutable() const { if (isSubclassOf("<cpp>.QDeclarativeBasePositioner")) diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index f31aaeecdcf..aed9ae788c4 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -161,7 +161,7 @@ void ModelPrivate::notifyImportsChanged(const QList<Import> &addedImports, const resetModel = true; } - NodeMetaInfo::clearCache(); + m_nodeMetaInfoCache.clear(); if (nodeInstanceView()) nodeInstanceView()->importsChanged(addedImports, removedImports); @@ -2080,6 +2080,11 @@ QList<ModelNode> Model::selectedNodes(AbstractView *view) const return d->toModelNodeList(d->selectedNodes(), view); } +void Model::clearMetaInfoCache() +{ + d->m_nodeMetaInfoCache.clear(); +} + /*! \brief Returns the URL against which relative URLs within the model should be resolved. \return The base URL. diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 5a8dced5127..4874959759b 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -85,6 +85,7 @@ class ModelPrivate : public QObject { friend class QmlDesigner::Model; friend class QmlDesigner::Internal::WriteLocker; + friend class QmlDesigner::Internal::NodeMetaInfoPrivate; public: ModelPrivate(Model *model); @@ -268,6 +269,7 @@ private: QPointer<NodeInstanceView> m_nodeInstanceView; QPointer<TextModifier> m_textModifier; QPointer<Model> m_metaInfoProxyModel; + QHash<TypeName, QSharedPointer<NodeMetaInfoPrivate>> m_nodeMetaInfoCache; bool m_writeLock; qint32 m_internalIdCounter; }; diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 6c795f1d064..358720f5e7f 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -989,7 +989,7 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH m_rewriterView->setIncompleteTypeInformation(false); // maybe the project environment (kit, ...) changed, so we need to clean old caches - NodeMetaInfo::clearCache(); + m_rewriterView->model()->clearMetaInfoCache(); try { Snapshot snapshot = m_rewriterView->textModifier()->qmljsSnapshot(); |