14 changed files with 164 additions and 14 deletions
@ -0,0 +1,46 @@ |
|||
#include "qqmlserviceregistry.h" |
|||
#include <QtQml/QQmlInfo> |
|||
using namespace QtMvvm; |
|||
|
|||
QQmlServiceRegistry::QQmlServiceRegistry(QQmlEngine *parent) : |
|||
QObject{parent}, |
|||
_engine{parent} |
|||
{} |
|||
|
|||
bool QQmlServiceRegistry::isRegistered(const QString &iid) const |
|||
{ |
|||
return ServiceRegistry::instance()->isRegistered(iid.toUtf8()); |
|||
} |
|||
|
|||
void QQmlServiceRegistry::registerObject(const QUrl &componentUrl, bool weak) |
|||
{ |
|||
ServiceRegistry::instance()->registerService(componentUrl.toString().toUtf8(), [this, componentUrl](const QObjectList &) -> QObject* { |
|||
QQmlComponent component{_engine, componentUrl, QQmlComponent::PreferSynchronous}; |
|||
switch(component.status()) { |
|||
case QQmlComponent::Ready: |
|||
{ |
|||
auto object = component.create(); |
|||
QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); |
|||
object->setParent(nullptr); |
|||
return object; |
|||
} |
|||
case QQmlComponent::Null: |
|||
throw ServiceConstructionException{"No component was loaded for URL: " + |
|||
component.url().toString().toUtf8()}; |
|||
case QQmlComponent::Error: |
|||
throw ServiceConstructionException{"Failed to load componentfor URL \"" + component.url().toString().toUtf8() + |
|||
"\" with error: " + component.errorString().trimmed().toUtf8()}; |
|||
case QQmlComponent::Loading: |
|||
throw ServiceConstructionException{"Unable to construct service from asynchronously loaded URL: " + |
|||
component.url().toString().toUtf8()}; |
|||
default: |
|||
Q_UNREACHABLE(); |
|||
return nullptr; |
|||
} |
|||
}, {}, weak, ServiceRegistry::DestroyOnAppQuit); |
|||
} |
|||
|
|||
QObject *QQmlServiceRegistry::service(const QString &iid) |
|||
{ |
|||
return ServiceRegistry::instance()->serviceObj(iid.toUtf8()); |
|||
} |
@ -0,0 +1,41 @@ |
|||
#ifndef QTMVVM_QQMLSERVICEREGISTRY_H |
|||
#define QTMVVM_QQMLSERVICEREGISTRY_H |
|||
|
|||
#include <QtCore/QObject> |
|||
|
|||
#include <QtMvvmCore/ServiceRegistry> |
|||
|
|||
#include <QtQml/QQmlEngine> |
|||
#include <QtQml/QQmlComponent> |
|||
|
|||
namespace QtMvvm { |
|||
|
|||
class QQmlServiceRegistry : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
enum DestructionScope { |
|||
DestroyOnAppQuit = ServiceRegistry::DestroyOnAppQuit, |
|||
DestroyOnAppDestroy = ServiceRegistry::DestroyOnAppDestroy, |
|||
DestroyOnRegistryDestroy = ServiceRegistry::DestroyOnRegistryDestroy, |
|||
|
|||
DestroyNever = ServiceRegistry::DestroyNever |
|||
}; |
|||
Q_ENUM(DestructionScope) |
|||
|
|||
explicit QQmlServiceRegistry(QQmlEngine *parent = nullptr); |
|||
|
|||
Q_INVOKABLE bool isRegistered(const QString &iid) const; |
|||
|
|||
Q_INVOKABLE void registerObject(const QUrl &componentUrl, bool weak = false); |
|||
|
|||
Q_INVOKABLE QObject *service(const QString &iid); |
|||
|
|||
private: |
|||
QQmlEngine *_engine; |
|||
}; |
|||
|
|||
} |
|||
|
|||
#endif // QTMVVM_QQMLSERVICEREGISTRY_H
|
Loading…
Reference in new issue