aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2020-10-13 16:52:48 +0200
committerTim Jenssen <tim.jenssen@qt.io>2020-10-14 17:00:31 +0000
commit60567d385ad54d9eb958b8e6635487d2a4b19a78 (patch)
tree7cce76fe2d1dd266dcb79ce8bb1d61576a6e574a /src/plugins/qmldesigner
parent3e9e768b35e4742d8c802f952ea6bfb33aa4ad0a (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')
-rw-r--r--src/plugins/qmldesigner/components/integration/designdocument.cpp2
-rw-r--r--src/plugins/qmldesigner/designercore/include/model.h4
-rw-r--r--src/plugins/qmldesigner/designercore/include/nodemetainfo.h2
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp27
-rw-r--r--src/plugins/qmldesigner/designercore/model/model.cpp7
-rw-r--r--src/plugins/qmldesigner/designercore/model/model_p.h2
-rw-r--r--src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp2
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();