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