diff options
author | Brett Stottlemyer <bstottle@ford.com> | 2017-05-15 23:01:01 -0400 |
---|---|---|
committer | Brett Stottlemyer <bstottle@ford.com> | 2017-05-16 13:27:39 +0000 |
commit | eb1854b58d802a46405f68cef61a5b4450d01f4b (patch) | |
tree | 088d24bbcc33eb02b828088c9d50e91f711cd039 | |
parent | e8885167458935b760eca751c5cc70509bad5292 (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.cpp | 6 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectabstractitemmodelreplica_p.h | 2 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectregistry.cpp | 11 | ||||
-rw-r--r-- | src/remoteobjects/qremoteobjectregistry.h | 5 | ||||
-rw-r--r-- | tools/repc/repcodegenerator.cpp | 46 |
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; |