summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Stottlemyer <bstottle@ford.com>2017-05-15 23:01:01 -0400
committerBrett Stottlemyer <bstottle@ford.com>2017-05-16 13:27:39 +0000
commiteb1854b58d802a46405f68cef61a5b4450d01f4b (patch)
tree088d24bbcc33eb02b828088c9d50e91f711cd039
parente8885167458935b760eca751c5cc70509bad5292 (diff)
Provide static method for registering metatypes
This provides an entry point (before a type is instantiated) to register the needed types (for instance, enums used by a type). It also makes it easier to guard against attempting to register a replica's types multiple times. Change-Id: Ic01c70586eab618afeb90c98df042b1ae7a9eed9 Reviewed-by: Michael Brasser <michael.brasser@live.com>
-rw-r--r--src/remoteobjects/qremoteobjectabstractitemmodelreplica.cpp6
-rw-r--r--src/remoteobjects/qremoteobjectabstractitemmodelreplica_p.h2
-rw-r--r--src/remoteobjects/qremoteobjectregistry.cpp11
-rw-r--r--src/remoteobjects/qremoteobjectregistry.h5
-rw-r--r--tools/repc/repcodegenerator.cpp46
5 files changed, 44 insertions, 26 deletions
diff --git a/src/remoteobjects/qremoteobjectabstractitemmodelreplica.cpp b/src/remoteobjects/qremoteobjectabstractitemmodelreplica.cpp
index b474887..06e131a 100644
--- a/src/remoteobjects/qremoteobjectabstractitemmodelreplica.cpp
+++ b/src/remoteobjects/qremoteobjectabstractitemmodelreplica.cpp
@@ -79,7 +79,7 @@ QAbstractItemModelReplicaPrivate::QAbstractItemModelReplicaPrivate()
, m_lastRequested(-1)
{
m_rootItem.children.setCacheSize(DefaultRootCacheSize);
- registerTypes();
+ QAbstractItemModelReplicaPrivate::registerMetatypes();
initializeModelConnections();
connect(this, &QAbstractItemModelReplicaPrivate::availableRolesChanged, this, [this]{
m_availableRoles.clear();
@@ -93,7 +93,7 @@ QAbstractItemModelReplicaPrivate::QAbstractItemModelReplicaPrivate(QRemoteObject
, m_lastRequested(-1)
{
m_rootItem.children.setCacheSize(DefaultRootCacheSize);
- registerTypes();
+ QAbstractItemModelReplicaPrivate::registerMetatypes();
initializeModelConnections();
initializeNode(node, name);
connect(this, &QAbstractItemModelReplicaPrivate::availableRolesChanged, this, [this]{
@@ -115,7 +115,7 @@ void QAbstractItemModelReplicaPrivate::initialize()
setProperties(properties);
}
-void QAbstractItemModelReplicaPrivate::registerTypes()
+void QAbstractItemModelReplicaPrivate::registerMetatypes()
{
static bool alreadyRegistered = false;
if (!alreadyRegistered) {
diff --git a/src/remoteobjects/qremoteobjectabstractitemmodelreplica_p.h b/src/remoteobjects/qremoteobjectabstractitemmodelreplica_p.h
index 0e42a31..0c8ea9d 100644
--- a/src/remoteobjects/qremoteobjectabstractitemmodelreplica_p.h
+++ b/src/remoteobjects/qremoteobjectabstractitemmodelreplica_p.h
@@ -332,7 +332,7 @@ public:
QAbstractItemModelReplicaPrivate(QRemoteObjectNode *node, const QString &name);
~QAbstractItemModelReplicaPrivate();
void initialize();
- void registerTypes();
+ static void registerMetatypes();
inline const QVector<int> &availableRoles() const
{
diff --git a/src/remoteobjects/qremoteobjectregistry.cpp b/src/remoteobjects/qremoteobjectregistry.cpp
index b9298db..4a5272a 100644
--- a/src/remoteobjects/qremoteobjectregistry.cpp
+++ b/src/remoteobjects/qremoteobjectregistry.cpp
@@ -101,12 +101,21 @@ QRemoteObjectRegistry::QRemoteObjectRegistry(QRemoteObjectNode *node, const QStr
QRemoteObjectRegistry::~QRemoteObjectRegistry()
{}
-void QRemoteObjectRegistry::initialize()
+void QRemoteObjectRegistry::registerMetatypes()
{
+ static bool initialized = false;
+ if (initialized)
+ return;
+ initialized = true;
qRegisterMetaType<QRemoteObjectSourceLocation>();
qRegisterMetaTypeStreamOperators<QRemoteObjectSourceLocation>();
qRegisterMetaType<QRemoteObjectSourceLocations>();
qRegisterMetaTypeStreamOperators<QRemoteObjectSourceLocations>();
+}
+
+void QRemoteObjectRegistry::initialize()
+{
+ QRemoteObjectRegistry::registerMetatypes();
QVariantList properties;
properties.reserve(3);
properties << QVariant::fromValue(QRemoteObjectSourceLocations());
diff --git a/src/remoteobjects/qremoteobjectregistry.h b/src/remoteobjects/qremoteobjectregistry.h
index 8fb6dac..cac2542 100644
--- a/src/remoteobjects/qremoteobjectregistry.h
+++ b/src/remoteobjects/qremoteobjectregistry.h
@@ -51,10 +51,9 @@ class Q_REMOTEOBJECTS_EXPORT QRemoteObjectRegistry : public QRemoteObjectReplica
Q_PROPERTY(QRemoteObjectSourceLocations sourceLocations READ sourceLocations)
- friend class QRemoteObjectNode;
-
public:
~QRemoteObjectRegistry();
+ static void registerMetatypes();
QRemoteObjectSourceLocations sourceLocations() const;
@@ -72,7 +71,7 @@ private:
explicit QRemoteObjectRegistry();
explicit QRemoteObjectRegistry(QRemoteObjectNode *node, const QString &name);
QRemoteObjectSourceLocations hostedSources;
- friend class QRemoteObjectNodePrivate;
+ friend class QT_PREPEND_NAMESPACE(QRemoteObjectNode);
};
QT_END_NAMESPACE
diff --git a/tools/repc/repcodegenerator.cpp b/tools/repc/repcodegenerator.cpp
index 969eff6..73bc532 100644
--- a/tools/repc/repcodegenerator.cpp
+++ b/tools/repc/repcodegenerator.cpp
@@ -574,6 +574,17 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
if (mode == REPLICA) {
out << " " << className << "() : QRemoteObjectReplica() { initialize(); }" << endl;
+ out << " static void registerMetatypes()" << endl;
+ out << " {" << endl;
+ out << " static bool initialized = false;" << endl;
+ out << " if (initialized)" << endl;
+ out << " return;" << endl;
+ out << " initialized = true;" << endl;
+
+ if (!metaTypeRegistrationCode.isEmpty())
+ out << metaTypeRegistrationCode << endl;
+
+ out << " }" << endl;
out << "" << endl;
out << "private:" << endl;
@@ -582,23 +593,10 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
out << " { initializeNode(node, name); }" << endl;
out << "" << endl;
- out << " void initialize()" << endl;
- } else {
- out << " explicit " << className << "(QObject *parent = nullptr) : QObject(parent)" << endl;
-
- if (mode == SIMPLE_SOURCE) {
- Q_FOREACH (const ASTProperty &property, astClass.properties) {
- out << " , _" << property.name << "(" << property.defaultValue << ")" << endl;
- }
- }
- }
-
- out << " {" << endl;
-
- if (!metaTypeRegistrationCode.isEmpty())
- out << metaTypeRegistrationCode << endl;
- if (mode == REPLICA) {
+ out << " void initialize()" << endl;
+ out << " {" << endl;
+ out << " " << className << "::registerMetatypes();" << endl;
out << " QVariantList properties;" << endl;
out << " properties.reserve(" << astClass.properties.size() << ");" << endl;
Q_FOREACH (const ASTProperty &property, astClass.properties) {
@@ -617,9 +615,21 @@ void RepCodeGenerator::generateClass(Mode mode, QTextStream &out, const ASTClass
out << " }" << endl;
}
out << " setProperties(properties);" << endl;
- }
+ out << " }" << endl;
+ } else {
+ out << " explicit " << className << "(QObject *parent = nullptr) : QObject(parent)" << endl;
+
+ if (mode == SIMPLE_SOURCE) {
+ Q_FOREACH (const ASTProperty &property, astClass.properties) {
+ out << " , _" << property.name << "(" << property.defaultValue << ")" << endl;
+ }
+ }
- out << " }" << endl;
+ out << " {" << endl;
+ if (!metaTypeRegistrationCode.isEmpty())
+ out << metaTypeRegistrationCode << endl;
+ out << " }" << endl;
+ }
out << "" << endl;
out << "public:" << endl;