qml 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +46 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +15 -0
  5. data/.yardopts +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +351 -0
  9. data/Rakefile +6 -0
  10. data/examples/assets/fonts/fontawesome-webfont.ttf +0 -0
  11. data/examples/fizzbuzz/fizzbuzz.rb +43 -0
  12. data/examples/fizzbuzz/main.qml +38 -0
  13. data/examples/imageprovider/imageprovider.rb +57 -0
  14. data/examples/imageprovider/main.qml +51 -0
  15. data/examples/todo/main.qml +70 -0
  16. data/examples/todo/todo.rb +36 -0
  17. data/examples/twitter/main.qml +36 -0
  18. data/examples/twitter/twitter.rb +55 -0
  19. data/ext/qml/accessclass.cpp +71 -0
  20. data/ext/qml/accessclass.h +19 -0
  21. data/ext/qml/accessobject.cpp +30 -0
  22. data/ext/qml/accessobject.h +22 -0
  23. data/ext/qml/application.cpp +54 -0
  24. data/ext/qml/application.h +17 -0
  25. data/ext/qml/common.h +18 -0
  26. data/ext/qml/ext_accesssupport.cpp +77 -0
  27. data/ext/qml/ext_accesssupport.h +42 -0
  28. data/ext/qml/ext_gcmarker.cpp +39 -0
  29. data/ext/qml/ext_gcmarker.h +27 -0
  30. data/ext/qml/ext_kernel.cpp +62 -0
  31. data/ext/qml/ext_kernel.h +11 -0
  32. data/ext/qml/ext_metaobject.cpp +410 -0
  33. data/ext/qml/ext_metaobject.h +62 -0
  34. data/ext/qml/ext_pluginloader.cpp +55 -0
  35. data/ext/qml/ext_pluginloader.h +32 -0
  36. data/ext/qml/ext_pointer.cpp +134 -0
  37. data/ext/qml/ext_pointer.h +43 -0
  38. data/ext/qml/ext_testutil.cpp +42 -0
  39. data/ext/qml/ext_testutil.h +11 -0
  40. data/ext/qml/extconf.rb +84 -0
  41. data/ext/qml/foreignclass.cpp +72 -0
  42. data/ext/qml/foreignclass.h +88 -0
  43. data/ext/qml/foreignmetaobject.cpp +345 -0
  44. data/ext/qml/foreignmetaobject.h +46 -0
  45. data/ext/qml/foreignobject.cpp +22 -0
  46. data/ext/qml/foreignobject.h +21 -0
  47. data/ext/qml/functioninfo.h +16 -0
  48. data/ext/qml/init.cpp +69 -0
  49. data/ext/qml/listmodel.cpp +112 -0
  50. data/ext/qml/listmodel.h +43 -0
  51. data/ext/qml/markable.h +12 -0
  52. data/ext/qml/objectdata.cpp +26 -0
  53. data/ext/qml/objectdata.h +20 -0
  54. data/ext/qml/objectgc.cpp +69 -0
  55. data/ext/qml/objectgc.h +28 -0
  56. data/ext/qml/plugins/core/applicationextension.cpp +34 -0
  57. data/ext/qml/plugins/core/applicationextension.h +28 -0
  58. data/ext/qml/plugins/core/componentextension.cpp +41 -0
  59. data/ext/qml/plugins/core/componentextension.h +28 -0
  60. data/ext/qml/plugins/core/contextextension.cpp +39 -0
  61. data/ext/qml/plugins/core/contextextension.h +29 -0
  62. data/ext/qml/plugins/core/core.pro +29 -0
  63. data/ext/qml/plugins/core/coreplugin.cpp +87 -0
  64. data/ext/qml/plugins/core/coreplugin.h +49 -0
  65. data/ext/qml/plugins/core/engineextension.cpp +27 -0
  66. data/ext/qml/plugins/core/engineextension.h +28 -0
  67. data/ext/qml/plugins/core/imageprovider.cpp +38 -0
  68. data/ext/qml/plugins/core/imageprovider.h +18 -0
  69. data/ext/qml/plugins/core/imagerequestpromise.cpp +19 -0
  70. data/ext/qml/plugins/core/imagerequestpromise.h +21 -0
  71. data/ext/qml/plugins/core/qmlexception.cpp +11 -0
  72. data/ext/qml/plugins/core/qmlexception.h +17 -0
  73. data/ext/qml/plugins/testutil/objectlifechecker.cpp +17 -0
  74. data/ext/qml/plugins/testutil/objectlifechecker.h +24 -0
  75. data/ext/qml/plugins/testutil/ownershiptest.cpp +26 -0
  76. data/ext/qml/plugins/testutil/ownershiptest.h +30 -0
  77. data/ext/qml/plugins/testutil/testobject.cpp +6 -0
  78. data/ext/qml/plugins/testutil/testobject.h +108 -0
  79. data/ext/qml/plugins/testutil/testobjectsubclass.cpp +10 -0
  80. data/ext/qml/plugins/testutil/testobjectsubclass.h +19 -0
  81. data/ext/qml/plugins/testutil/testutil.pro +20 -0
  82. data/ext/qml/plugins/testutil/testutilplugin.cpp +47 -0
  83. data/ext/qml/plugins/testutil/testutilplugin.h +32 -0
  84. data/ext/qml/qmltyperegisterer.cpp +74 -0
  85. data/ext/qml/qmltyperegisterer.h +30 -0
  86. data/ext/qml/rubyclass.cpp +94 -0
  87. data/ext/qml/rubyclass.h +234 -0
  88. data/ext/qml/rubyvalue.cpp +690 -0
  89. data/ext/qml/rubyvalue.h +256 -0
  90. data/ext/qml/signalforwarder.cpp +66 -0
  91. data/ext/qml/signalforwarder.h +29 -0
  92. data/ext/qml/util.cpp +120 -0
  93. data/ext/qml/util.h +101 -0
  94. data/ext/qml/valuereference.cpp +50 -0
  95. data/ext/qml/valuereference.h +22 -0
  96. data/ext/qml/weakvaluereference.cpp +27 -0
  97. data/ext/qml/weakvaluereference.h +19 -0
  98. data/lib/qml.rb +41 -0
  99. data/lib/qml/access.rb +137 -0
  100. data/lib/qml/application.rb +139 -0
  101. data/lib/qml/class_builder.rb +126 -0
  102. data/lib/qml/component.rb +53 -0
  103. data/lib/qml/context.rb +71 -0
  104. data/lib/qml/data.rb +2 -0
  105. data/lib/qml/data/array_model.rb +103 -0
  106. data/lib/qml/data/error.rb +5 -0
  107. data/lib/qml/data/list_model.rb +146 -0
  108. data/lib/qml/dispatchable.rb +34 -0
  109. data/lib/qml/dispatcher.rb +61 -0
  110. data/lib/qml/engine.rb +54 -0
  111. data/lib/qml/error_converter.rb +15 -0
  112. data/lib/qml/errors.rb +26 -0
  113. data/lib/qml/geometry.rb +3 -0
  114. data/lib/qml/geometry/point.rb +5 -0
  115. data/lib/qml/geometry/rectangle.rb +5 -0
  116. data/lib/qml/geometry/size.rb +5 -0
  117. data/lib/qml/image_provider.rb +87 -0
  118. data/lib/qml/meta_object.rb +20 -0
  119. data/lib/qml/models.rb +1 -0
  120. data/lib/qml/name_helper.rb +12 -0
  121. data/lib/qml/platform.rb +15 -0
  122. data/lib/qml/plugin_loader.rb +46 -0
  123. data/lib/qml/plugins.rb +26 -0
  124. data/lib/qml/qml.rb +1 -0
  125. data/lib/qml/qt.rb +6 -0
  126. data/lib/qml/qt_classes.rb +9 -0
  127. data/lib/qml/qt_object_base.rb +108 -0
  128. data/lib/qml/reactive.rb +8 -0
  129. data/lib/qml/reactive/bindable.rb +79 -0
  130. data/lib/qml/reactive/chained_signal.rb +25 -0
  131. data/lib/qml/reactive/error.rb +5 -0
  132. data/lib/qml/reactive/object.rb +278 -0
  133. data/lib/qml/reactive/property.rb +19 -0
  134. data/lib/qml/reactive/signal.rb +116 -0
  135. data/lib/qml/reactive/signal_spy.rb +27 -0
  136. data/lib/qml/reactive/signals/map_signal.rb +21 -0
  137. data/lib/qml/reactive/signals/merge_signal.rb +21 -0
  138. data/lib/qml/reactive/signals/select_signal.rb +21 -0
  139. data/lib/qml/reactive/simple_property.rb +17 -0
  140. data/lib/qml/reactive/unbound_property.rb +42 -0
  141. data/lib/qml/reactive/unbound_signal.rb +51 -0
  142. data/lib/qml/root_path.rb +3 -0
  143. data/lib/qml/test_util.rb +1 -0
  144. data/lib/qml/test_util/object_life_checker.rb +17 -0
  145. data/lib/qml/version.rb +3 -0
  146. data/lib/qml/wrappable.rb +9 -0
  147. data/qml.gemspec +28 -0
  148. data/spec/assets/testobj.qml +5 -0
  149. data/spec/qml/.access_spec.rb.swp +0 -0
  150. data/spec/qml/access_spec.rb +162 -0
  151. data/spec/qml/application_spec.rb +43 -0
  152. data/spec/qml/component_spec.rb +44 -0
  153. data/spec/qml/context_spec.rb +43 -0
  154. data/spec/qml/conversion_spec.rb +59 -0
  155. data/spec/qml/data/array_model_spec.rb +215 -0
  156. data/spec/qml/dispatchable_spec.rb +26 -0
  157. data/spec/qml/dispatcher_spec.rb +48 -0
  158. data/spec/qml/geometry/point_spec.rb +4 -0
  159. data/spec/qml/geometry/rectangle_spec.rb +4 -0
  160. data/spec/qml/geometry/size_spec.rb +4 -0
  161. data/spec/qml/plugin_loader_spec.rb +33 -0
  162. data/spec/qml/qt_object_base_spec.rb +119 -0
  163. data/spec/qml/reactive/object_spec.rb +273 -0
  164. data/spec/qml/reactive/property_spec.rb +70 -0
  165. data/spec/qml/reactive/signal_spec.rb +191 -0
  166. data/spec/qml/reactive/signal_spy_spec.rb +26 -0
  167. data/spec/qml/test_object_spec.rb +186 -0
  168. data/spec/qml_spec.rb +7 -0
  169. data/spec/spec_helper.rb +5 -0
  170. metadata +321 -0
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+ #include <QSet>
3
+ #include <QObject>
4
+
5
+ namespace RubyQml {
6
+
7
+ class ObjectGC : public QObject {
8
+ public:
9
+
10
+ void addObject(QObject *obj);
11
+ void markOwnedObject(QObject *obj);
12
+ void markNonOwnedObjects();
13
+
14
+ void setDebugMessageEnabled(bool enabled) { mDebugMessageEnabled = enabled; }
15
+ bool debugMessageEnabled() { return mDebugMessageEnabled; }
16
+ QDebug debug();
17
+
18
+ static ObjectGC *instance();
19
+
20
+ private:
21
+ ObjectGC() {}
22
+ void mark(QObject *obj, bool markOwned);
23
+
24
+ bool mDebugMessageEnabled = false;
25
+ QSet<QObject *> mObjects;
26
+ };
27
+
28
+ } // namespace RubyQml
@@ -0,0 +1,34 @@
1
+ #include "applicationextension.h"
2
+ #include <QApplication>
3
+ #include <QTimer>
4
+ #include <QDebug>
5
+
6
+ namespace RubyQml {
7
+
8
+ ApplicationExtension::ApplicationExtension(QApplication *app) :
9
+ mApp(app)
10
+ {
11
+ auto timer = new QTimer(this);
12
+ timer->setInterval(0);
13
+ timer->setSingleShot(false);
14
+ timer->start();
15
+ connect(timer, &QTimer::timeout, this, &ApplicationExtension::eventsProcessed);
16
+ }
17
+
18
+ void ApplicationExtension::exec()
19
+ {
20
+ mApp->exec();
21
+ }
22
+
23
+ void ApplicationExtension::processEvents()
24
+ {
25
+ QCoreApplication::processEvents();
26
+ forceDeferredDeletes();
27
+ }
28
+
29
+ void ApplicationExtension::forceDeferredDeletes()
30
+ {
31
+ QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
32
+ }
33
+
34
+ } // namespace RubyQml
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+
3
+ #include <QObject>
4
+ #include <QGuiApplication>
5
+
6
+ class QGuiApplication;
7
+
8
+ namespace RubyQml {
9
+
10
+ class ApplicationExtension : public QObject
11
+ {
12
+ Q_OBJECT
13
+ public:
14
+ explicit ApplicationExtension(QApplication *app);
15
+
16
+ signals:
17
+ void eventsProcessed();
18
+
19
+ public slots:
20
+ void exec();
21
+ void processEvents();
22
+ void forceDeferredDeletes();
23
+
24
+ private:
25
+ QApplication *mApp;
26
+ };
27
+
28
+ } // namespace RubyQml
@@ -0,0 +1,41 @@
1
+ #include "componentextension.h"
2
+ #include "qmlexception.h"
3
+ #include <QQmlComponent>
4
+ #include <QQmlEngine>
5
+ #include <QDebug>
6
+
7
+ namespace RubyQml {
8
+
9
+ ComponentExtension::ComponentExtension(QQmlComponent *component) :
10
+ mComponent(component)
11
+ {
12
+ }
13
+
14
+ void ComponentExtension::loadString(const QString &data, const QString &path)
15
+ {
16
+ mComponent->setData(data.toUtf8(), QUrl::fromLocalFile(path));
17
+ throwIfError();
18
+ }
19
+
20
+ void ComponentExtension::loadFile(const QString &filePath)
21
+ {
22
+ mComponent->loadUrl(QUrl::fromLocalFile(filePath));
23
+ throwIfError();
24
+ }
25
+
26
+ QObject *ComponentExtension::create(QQmlContext *context)
27
+ {
28
+ auto created = mComponent->create(context);
29
+ throwIfError();
30
+ QQmlEngine::setObjectOwnership(created, QQmlEngine::JavaScriptOwnership);
31
+ return created;
32
+ }
33
+
34
+ void ComponentExtension::throwIfError()
35
+ {
36
+ if (mComponent->status() == QQmlComponent::Error) {
37
+ throw QmlException(mComponent->errorString());
38
+ }
39
+ }
40
+
41
+ } // namespace RubyQml
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+
3
+ #include <QObject>
4
+ #include <QQmlComponent>
5
+
6
+ class QQmlComponent;
7
+
8
+ namespace RubyQml {
9
+
10
+ class ComponentExtension : public QObject
11
+ {
12
+ Q_OBJECT
13
+ public:
14
+ explicit ComponentExtension(QQmlComponent *component);
15
+
16
+ public slots:
17
+
18
+ void loadString(const QString &data, const QString &path);
19
+ void loadFile(const QString &filePath);
20
+ QObject *create(QQmlContext *context);
21
+
22
+ private:
23
+ void throwIfError();
24
+
25
+ QQmlComponent *mComponent;
26
+ };
27
+
28
+ } // namespace RubyQml
@@ -0,0 +1,39 @@
1
+ #include "contextextension.h"
2
+ #include "qmlexception.h"
3
+ #include <QQmlContext>
4
+ #include <QQmlExpression>
5
+
6
+ namespace RubyQml {
7
+
8
+ ContextExtension::ContextExtension(QQmlContext *context) :
9
+ mContext(context)
10
+ {
11
+ }
12
+
13
+ QQmlEngine *ContextExtension::engine()
14
+ {
15
+ return mContext->engine();
16
+ }
17
+
18
+ QVariant ContextExtension::evaluate(QObject *obj, const QString &str)
19
+ {
20
+ QQmlExpression expression(mContext, obj, str);
21
+ auto result = expression.evaluate();
22
+ if (expression.hasError()) {
23
+ throw QmlException(expression.error().toString());
24
+ }
25
+ return result;
26
+ }
27
+
28
+ void ContextExtension::setContextProperty(const QString &key, const QVariant &value)
29
+ {
30
+ mContext->setContextProperty(key, value);
31
+ }
32
+
33
+ QVariant ContextExtension::contextProperty(const QString &key)
34
+ {
35
+ return mContext->contextProperty(key);
36
+ }
37
+
38
+
39
+ } // namespace RubyQml
@@ -0,0 +1,29 @@
1
+ #pragma once
2
+
3
+ #include <QObject>
4
+ #include <QVariant>
5
+
6
+ class QQmlContext;
7
+ class QQmlEngine;
8
+
9
+ namespace RubyQml {
10
+
11
+ class ContextExtension : public QObject
12
+ {
13
+ Q_OBJECT
14
+ Q_PROPERTY(QQmlEngine* engine READ engine)
15
+ public:
16
+ explicit ContextExtension(QQmlContext *context);
17
+ QQmlEngine *engine();
18
+
19
+ public slots:
20
+
21
+ QVariant evaluate(QObject *obj, const QString &str);
22
+ void setContextProperty(const QString &key, const QVariant &value);
23
+ QVariant contextProperty(const QString &key);
24
+
25
+ private:
26
+ QQmlContext *mContext;
27
+ };
28
+
29
+ } // namespace RubyQml
@@ -0,0 +1,29 @@
1
+ #-------------------------------------------------
2
+ #
3
+ # Project created by QtCreator 2014-05-12T21:03:35
4
+ #
5
+ #-------------------------------------------------
6
+
7
+ QT += core gui qml quick widgets
8
+
9
+ TARGET = rubyqml-core
10
+ TEMPLATE = lib
11
+ CONFIG += plugin c++11
12
+
13
+ SOURCES += coreplugin.cpp \
14
+ qmlexception.cpp \
15
+ applicationextension.cpp \
16
+ componentextension.cpp \
17
+ contextextension.cpp \
18
+ engineextension.cpp \
19
+ imageprovider.cpp \
20
+ imagerequestpromise.cpp
21
+
22
+ HEADERS += coreplugin.h \
23
+ qmlexception.h \
24
+ applicationextension.h \
25
+ componentextension.h \
26
+ contextextension.h \
27
+ engineextension.h \
28
+ imageprovider.h \
29
+ imagerequestpromise.h
@@ -0,0 +1,87 @@
1
+ #include "coreplugin.h"
2
+ #include "applicationextension.h"
3
+ #include "engineextension.h"
4
+ #include "componentextension.h"
5
+ #include "contextextension.h"
6
+ #include "imageprovider.h"
7
+ #include <QApplication>
8
+ #include <QQmlEngine>
9
+ #include <QQmlComponent>
10
+ #include <QQmlContext>
11
+ #include <stdexcept>
12
+
13
+ Q_DECLARE_METATYPE(const QMetaObject*)
14
+
15
+ namespace RubyQml {
16
+
17
+ CorePlugin::CorePlugin(QObject *parent) :
18
+ QObject(parent)
19
+ {
20
+ qRegisterMetaType<ApplicationExtension *>();
21
+ qRegisterMetaType<EngineExtension *>();
22
+ qRegisterMetaType<ComponentExtension *>();
23
+ qRegisterMetaType<ContextExtension *>();
24
+ qRegisterMetaType<ImageProvider *>();
25
+ qRegisterMetaType<QApplication *>();
26
+ qRegisterMetaType<QCoreApplication *>();
27
+ qRegisterMetaType<QQmlEngine *>();
28
+ qRegisterMetaType<QQmlComponent *>();
29
+ qRegisterMetaType<QQmlContext *>();
30
+
31
+ const QMetaObject *metaObjects[] = {
32
+ &staticQtMetaObject,
33
+ &QApplication::staticMetaObject,
34
+ &QQmlEngine::staticMetaObject,
35
+ &QQmlComponent::staticMetaObject,
36
+ &QQmlContext::staticMetaObject};
37
+ for (auto metaobj : metaObjects) {
38
+ mMetaObjects[metaobj->className()] = QVariant::fromValue(metaobj);
39
+ }
40
+ }
41
+
42
+ QApplication *CorePlugin::applicationInstance()
43
+ {
44
+ return qApp;
45
+ }
46
+
47
+ QQmlComponent *CorePlugin::createComponent(QQmlEngine *e)
48
+ {
49
+ return new QQmlComponent(e);
50
+ }
51
+
52
+ QQmlContext *CorePlugin::createContext(QQmlEngine *engine)
53
+ {
54
+ return new QQmlContext(engine);
55
+ }
56
+
57
+ ApplicationExtension *CorePlugin::createApplicationExtension(QApplication *app)
58
+ {
59
+ return new ApplicationExtension(app);
60
+ }
61
+
62
+ EngineExtension *CorePlugin::createEngineExtension(QQmlEngine *engine)
63
+ {
64
+ return new EngineExtension(engine);
65
+ }
66
+
67
+ ComponentExtension *CorePlugin::createComponentExtension(QQmlComponent *component)
68
+ {
69
+ return new ComponentExtension(component);
70
+ }
71
+
72
+ ContextExtension *CorePlugin::createContextExtension(QQmlContext *context)
73
+ {
74
+ return new ContextExtension(context);
75
+ }
76
+
77
+ QQmlContext *CorePlugin::contextForObject(QObject *object)
78
+ {
79
+ return QQmlEngine::contextForObject(object);
80
+ }
81
+
82
+ ImageProvider *CorePlugin::createImageProvider(QObject *rubyCallback)
83
+ {
84
+ return new ImageProvider(rubyCallback);
85
+ }
86
+
87
+ } // namespace RubyQml
@@ -0,0 +1,49 @@
1
+ #pragma once
2
+
3
+ #include <QObject>
4
+ #include <QVariant>
5
+
6
+ class QApplication;
7
+ class QQmlEngine;
8
+ class QQmlComponent;
9
+ class QQmlContext;
10
+
11
+ namespace RubyQml {
12
+
13
+ class ApplicationExtension;
14
+ class ComponentExtension;
15
+ class EngineExtension;
16
+ class ContextExtension;
17
+ class ImageProvider;
18
+
19
+ class CorePlugin : public QObject
20
+ {
21
+ Q_OBJECT
22
+ Q_PLUGIN_METADATA(IID "org.ruby-qml.RubyQml.Core")
23
+
24
+ public:
25
+ CorePlugin(QObject *parent = 0);
26
+
27
+ public slots:
28
+ QVariantHash metaObjects() { return mMetaObjects; }
29
+
30
+ QApplication *applicationInstance();
31
+
32
+ QQmlComponent *createComponent(QQmlEngine *engine);
33
+ QQmlContext *createContext(QQmlEngine *engine);
34
+
35
+ RubyQml::ApplicationExtension *createApplicationExtension(QApplication *app);
36
+ RubyQml::EngineExtension *createEngineExtension(QQmlEngine *engine);
37
+ RubyQml::ComponentExtension *createComponentExtension(QQmlComponent *component);
38
+ RubyQml::ContextExtension *createContextExtension(QQmlContext *context);
39
+
40
+ QQmlContext *contextForObject(QObject *object);
41
+
42
+ RubyQml::ImageProvider *createImageProvider(QObject *rubyCallback);
43
+
44
+ private:
45
+ QVariantHash mMetaObjects;
46
+ };
47
+
48
+
49
+ } // namespace RubyQml
@@ -0,0 +1,27 @@
1
+ #include "engineextension.h"
2
+ #include "imageprovider.h"
3
+ #include <QQmlEngine>
4
+
5
+ namespace RubyQml {
6
+
7
+ EngineExtension::EngineExtension(QQmlEngine *engine) :
8
+ mEngine(engine)
9
+ {
10
+ }
11
+
12
+ QQmlContext *EngineExtension::rootContext()
13
+ {
14
+ return mEngine->rootContext();
15
+ }
16
+
17
+ void EngineExtension::addImageProvider(const QString &id, ImageProvider *provider)
18
+ {
19
+ mEngine->addImageProvider(id, provider);
20
+ }
21
+
22
+ void EngineExtension::collectGarbage()
23
+ {
24
+ mEngine->collectGarbage();
25
+ }
26
+
27
+ } // namespace RubyQml
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+
3
+ #include <QObject>
4
+
5
+ class QQmlEngine;
6
+ class QQmlContext;
7
+
8
+ namespace RubyQml {
9
+
10
+ class ImageProvider;
11
+
12
+ class EngineExtension : public QObject
13
+ {
14
+ Q_OBJECT
15
+ Q_PROPERTY(QQmlContext* rootContext READ rootContext)
16
+ public:
17
+ explicit EngineExtension(QQmlEngine *engine);
18
+ QQmlContext *rootContext();
19
+
20
+ public slots:
21
+ void addImageProvider(const QString &id, RubyQml::ImageProvider *provider);
22
+ void collectGarbage();
23
+
24
+ private:
25
+ QQmlEngine *mEngine;
26
+ };
27
+
28
+ } // namespace RubyQml