aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@theqtcompany.com>2016-06-29 14:56:18 +0200
committerThomas Hartmann <Thomas.Hartmann@theqtcompany.com>2016-06-29 13:14:48 +0000
commite6be4484a66a0aad38f7b609d9e5ac7e89d56f02 (patch)
treec462a2a76e7f7a58ccd0ff83146acabdde035d54 /src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
parent334273be84c0b71c57a472075d337c705ad3f7cf (diff)
QmlDesigner.MetaInfo: Initiliase property info lazily
There exists cases where collecting the properties is very slow. We only have to do this on demand for the property editor. Change-Id: I92d7270481db94655c95ab8d69f373488d841b4e Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
Diffstat (limited to 'src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp')
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp53
1 files changed, 47 insertions, 6 deletions
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
index 67a6840d13..426f1560bc 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
@@ -40,6 +40,8 @@
#include <qmljs/qmljsvalueowner.h>
#include <languageutils/fakemetaobject.h>
+#include <utils/qtcassert.h>
+
namespace QmlDesigner {
namespace Internal {
@@ -565,6 +567,9 @@ private:
const CppComponentValue *getNearestCppComponentValue() const;
QString fullQualifiedImportAliasType() const;
+ void ensureProperties() const;
+ void initialiseProperties();
+
TypeName m_qualfiedTypeName;
int m_majorVersion;
int m_minorVersion;
@@ -585,6 +590,8 @@ private:
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;
@@ -596,16 +603,21 @@ bool NodeMetaInfoPrivate::isFileComponent() const
PropertyNameList NodeMetaInfoPrivate::properties() const
{
+ ensureProperties();
+
return m_properties;
}
PropertyNameList NodeMetaInfoPrivate::localProperties() const
{
+ ensureProperties();
+
return m_localProperties;
}
PropertyNameList NodeMetaInfoPrivate::signalNames() const
{
+ ensureProperties();
return m_signals;
}
@@ -670,12 +682,10 @@ NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, i
m_majorVersion = cppObjectValue->componentVersion().majorVersion();
m_minorVersion = cppObjectValue->componentVersion().minorVersion();
}
- setupPropertyInfo(getTypes(cppObjectValue, context()));
- setupLocalPropertyInfo(getTypes(cppObjectValue, context(), true));
+ m_objectValue = cppObjectValue;
m_defaultPropertyName = cppObjectValue->defaultPropertyName().toUtf8();
m_isValid = true;
setupPrototypes();
- m_signals = getSignals(cppObjectValue, context());
} else {
const ObjectValue *objectValue = getObjectValue();
if (objectValue) {
@@ -699,12 +709,10 @@ NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, i
m_minorVersion = importInfo.version().minorVersion();
}
}
- setupPropertyInfo(getTypes(objectValue, context()));
- setupLocalPropertyInfo(getTypes(objectValue, context(), true));
+ m_objectValue = objectValue;
m_defaultPropertyName = context()->defaultPropertyName(objectValue).toUtf8();
m_isValid = true;
setupPrototypes();
- m_signals = getSignals(objectValue, context());
}
}
}
@@ -803,6 +811,8 @@ bool NodeMetaInfoPrivate::isPropertyWritable(const PropertyName &propertyName) c
if (!isValid())
return false;
+ ensureProperties();
+
if (propertyName.contains('.')) {
const PropertyNameList parts = propertyName.split('.');
const PropertyName objectName = parts.first();
@@ -834,6 +844,8 @@ bool NodeMetaInfoPrivate::isPropertyList(const PropertyName &propertyName) const
if (!isValid())
return false;
+ ensureProperties();
+
if (propertyName.contains('.')) {
const PropertyNameList parts = propertyName.split('.');
const PropertyName objectName = parts.first();
@@ -861,6 +873,8 @@ bool NodeMetaInfoPrivate::isPropertyPointer(const PropertyName &propertyName) co
if (!isValid())
return false;
+ ensureProperties();
+
if (propertyName.contains('.')) {
const PropertyNameList parts = propertyName.split('.');
const PropertyName objectName = parts.first();
@@ -888,6 +902,8 @@ bool NodeMetaInfoPrivate::isPropertyEnum(const PropertyName &propertyName) const
if (!isValid())
return false;
+ ensureProperties();
+
if (propertyType(propertyName).contains("Qt::"))
return true;
@@ -918,6 +934,8 @@ QString NodeMetaInfoPrivate::propertyEnumScope(const PropertyName &propertyName)
if (!isValid())
return QString();
+ ensureProperties();
+
if (propertyType(propertyName).contains("Qt::"))
return QStringLiteral("Qt");
@@ -1262,6 +1280,29 @@ QString NodeMetaInfoPrivate::fullQualifiedImportAliasType() const
return QString::fromUtf8(m_qualfiedTypeName);
}
+void NodeMetaInfoPrivate::ensureProperties() const
+{
+ if (m_propertiesSetup)
+ return;
+
+ const_cast<NodeMetaInfoPrivate*>(this)->initialiseProperties();
+}
+
+void NodeMetaInfoPrivate::initialiseProperties()
+{
+ if (!isValid())
+ return;
+
+ m_propertiesSetup = true;
+
+ QTC_ASSERT(m_objectValue, qDebug() << qualfiedTypeName(); return);
+
+ setupPropertyInfo(getTypes(m_objectValue, context()));
+ setupLocalPropertyInfo(getTypes(m_objectValue, context(), true));
+
+ m_signals = getSignals(m_objectValue, context());
+}
+
} //namespace Internal
NodeMetaInfo::NodeMetaInfo() : m_privateData(new Internal::NodeMetaInfoPrivate())