qml 0.0.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/.travis.yml +5 -9
  4. data/LICENSE.txt +1 -1
  5. data/README.md +84 -114
  6. data/changes.md +5 -0
  7. data/examples/fizzbuzz/fizzbuzz.rb +3 -4
  8. data/examples/todo_array/todo_array.rb +4 -4
  9. data/examples/todo_sequel/todo_sequel.rb +7 -7
  10. data/examples/twitter/twitter.rb +5 -3
  11. data/ext/qml/application.c +88 -0
  12. data/ext/qml/application.h +9 -0
  13. data/ext/qml/component.c +89 -0
  14. data/ext/qml/component.h +10 -0
  15. data/ext/qml/conversion.c +60 -0
  16. data/ext/qml/conversion.h +8 -0
  17. data/ext/qml/dispatcher.c +31 -0
  18. data/ext/qml/dispatcher.h +7 -0
  19. data/ext/qml/engine.c +135 -0
  20. data/ext/qml/engine.h +10 -0
  21. data/ext/qml/exporter.c +93 -0
  22. data/ext/qml/exporter.h +7 -0
  23. data/ext/qml/extconf.rb +38 -97
  24. data/ext/qml/interface.c +156 -0
  25. data/ext/qml/interface.h +11 -0
  26. data/ext/qml/js_array.c +47 -0
  27. data/ext/qml/js_array.h +7 -0
  28. data/ext/qml/js_function.c +109 -0
  29. data/ext/qml/js_function.h +7 -0
  30. data/ext/qml/js_object.c +284 -0
  31. data/ext/qml/js_object.h +19 -0
  32. data/ext/qml/js_wrapper.c +19 -0
  33. data/ext/qml/js_wrapper.h +7 -0
  34. data/ext/qml/lib/libqmlbind/.gitignore +38 -0
  35. data/ext/qml/lib/libqmlbind/.gitmodules +3 -0
  36. data/ext/qml/lib/libqmlbind/.travis.yml +14 -0
  37. data/ext/qml/lib/libqmlbind/LICENSE.txt +22 -0
  38. data/ext/qml/lib/libqmlbind/libqmlbind.pro +3 -0
  39. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind.h +14 -0
  40. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/application.h +18 -0
  41. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/component.h +21 -0
  42. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/engine.h +34 -0
  43. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/exporter.h +37 -0
  44. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/interface.h +16 -0
  45. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/iterator.h +19 -0
  46. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/metaobject.h +13 -0
  47. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/plugin.h +17 -0
  48. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/qmlbind_global.h +78 -0
  49. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/register.h +17 -0
  50. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/signal_emitter.h +15 -0
  51. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/string.h +15 -0
  52. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/value.h +100 -0
  53. data/ext/qml/lib/libqmlbind/qmlbind/qmlbind.pro +62 -0
  54. data/ext/qml/lib/libqmlbind/qmlbind/src/api_application.cpp +103 -0
  55. data/ext/qml/lib/libqmlbind/qmlbind/src/api_component.cpp +54 -0
  56. data/ext/qml/lib/libqmlbind/qmlbind/src/api_engine.cpp +65 -0
  57. data/ext/qml/lib/libqmlbind/qmlbind/src/api_exporter.cpp +52 -0
  58. data/ext/qml/lib/libqmlbind/qmlbind/src/api_interface.cpp +19 -0
  59. data/ext/qml/lib/libqmlbind/qmlbind/src/api_iterator.cpp +32 -0
  60. data/ext/qml/lib/libqmlbind/qmlbind/src/api_metaobject.cpp +19 -0
  61. data/ext/qml/lib/libqmlbind/qmlbind/src/api_plugin.cpp +27 -0
  62. data/ext/qml/lib/libqmlbind/qmlbind/src/api_register.cpp +17 -0
  63. data/ext/qml/lib/libqmlbind/qmlbind/src/api_signal_emitter.cpp +27 -0
  64. data/ext/qml/lib/libqmlbind/qmlbind/src/api_string.cpp +22 -0
  65. data/ext/qml/lib/libqmlbind/qmlbind/src/api_value.cpp +215 -0
  66. data/ext/qml/lib/libqmlbind/qmlbind/src/backref.cpp +54 -0
  67. data/ext/qml/lib/libqmlbind/qmlbind/src/backref.h +29 -0
  68. data/ext/qml/lib/libqmlbind/qmlbind/src/engine.cpp +32 -0
  69. data/ext/qml/lib/libqmlbind/qmlbind/src/engine.h +27 -0
  70. data/ext/qml/lib/libqmlbind/qmlbind/src/exporter.cpp +73 -0
  71. data/ext/qml/lib/libqmlbind/qmlbind/src/exporter.h +46 -0
  72. data/ext/qml/lib/libqmlbind/qmlbind/src/interface.cpp +75 -0
  73. data/ext/qml/lib/libqmlbind/qmlbind/src/interface.h +37 -0
  74. data/ext/qml/lib/libqmlbind/qmlbind/src/metaobject.cpp +101 -0
  75. data/ext/qml/lib/libqmlbind/qmlbind/src/metaobject.h +29 -0
  76. data/ext/qml/lib/libqmlbind/qmlbind/src/signalemitter.cpp +33 -0
  77. data/ext/qml/lib/libqmlbind/qmlbind/src/signalemitter.h +25 -0
  78. data/ext/qml/lib/libqmlbind/qmlbind/src/ticktimer.cpp +15 -0
  79. data/ext/qml/lib/libqmlbind/qmlbind/src/ticktimer.h +19 -0
  80. data/ext/qml/lib/libqmlbind/qmlbind/src/typeregisterer.cpp +112 -0
  81. data/ext/qml/lib/libqmlbind/qmlbind/src/typeregisterer.h +28 -0
  82. data/ext/qml/lib/libqmlbind/qmlbind/src/util.h +13 -0
  83. data/ext/qml/lib/libqmlbind/qmlbind/src/wrapper.cpp +23 -0
  84. data/ext/qml/lib/libqmlbind/qmlbind/src/wrapper.h +29 -0
  85. data/ext/qml/lib/libqmlbind/readme.md +14 -0
  86. data/ext/qml/lib/libqmlbind/test/api.c +1 -0
  87. data/ext/qml/lib/libqmlbind/test/application_test.cpp +16 -0
  88. data/ext/qml/lib/libqmlbind/test/component_test.cpp +57 -0
  89. data/ext/qml/lib/libqmlbind/test/engine_test.cpp +94 -0
  90. data/ext/qml/lib/libqmlbind/test/exporter_test.cpp +312 -0
  91. data/ext/qml/lib/libqmlbind/test/fixtures/emptyhandlers.cpp +36 -0
  92. data/ext/qml/lib/libqmlbind/test/fixtures/emptyhandlers.h +6 -0
  93. data/ext/qml/lib/libqmlbind/test/fixtures/test.qml +5 -0
  94. data/ext/qml/lib/libqmlbind/test/fixtures/testmodule/qmldir +2 -0
  95. data/ext/qml/lib/libqmlbind/test/fixtures/testmodule/test.qml +5 -0
  96. data/ext/qml/lib/libqmlbind/test/iterator_test.cpp +37 -0
  97. data/ext/qml/lib/libqmlbind/test/main.cpp +11 -0
  98. data/ext/qml/lib/libqmlbind/test/plugin_test.cpp +41 -0
  99. data/ext/qml/lib/libqmlbind/test/test.pro +26 -0
  100. data/ext/qml/lib/libqmlbind/test/test_helper.h +20 -0
  101. data/ext/qml/lib/libqmlbind/test/value_test.cpp +252 -0
  102. data/ext/qml/lib/libqmlbind/testplugin/testplugin.cpp +11 -0
  103. data/ext/qml/lib/libqmlbind/testplugin/testplugin.h +21 -0
  104. data/ext/qml/lib/libqmlbind/testplugin/testplugin.json +3 -0
  105. data/ext/qml/lib/libqmlbind/testplugin/testplugin.pro +21 -0
  106. data/ext/qml/meta_object.c +81 -0
  107. data/ext/qml/meta_object.h +8 -0
  108. data/ext/qml/plugin_loader.c +71 -0
  109. data/ext/qml/plugin_loader.h +7 -0
  110. data/ext/qml/qml.c +95 -0
  111. data/ext/qml/qml.h +10 -0
  112. data/ext/qml/rubyqml-plugin/listmodel.cpp +102 -0
  113. data/ext/qml/rubyqml-plugin/listmodel.h +37 -0
  114. data/ext/qml/rubyqml-plugin/rubyqml-plugin.pro +19 -0
  115. data/ext/qml/rubyqml-plugin/rubyqmlplugin.cpp +25 -0
  116. data/ext/qml/rubyqml-plugin/rubyqmlplugin.h +19 -0
  117. data/ext/qml/signal_emitter.c +71 -0
  118. data/ext/qml/signal_emitter.h +9 -0
  119. data/lib/qml.rb +11 -10
  120. data/lib/qml/access.rb +64 -86
  121. data/lib/qml/application.rb +20 -71
  122. data/lib/qml/component.rb +41 -33
  123. data/lib/qml/core_ext.rb +1 -0
  124. data/lib/qml/core_ext/to_qml.rb +70 -0
  125. data/lib/qml/data.rb +1 -0
  126. data/lib/qml/data/array_model.rb +99 -101
  127. data/lib/qml/data/list_model.rb +107 -131
  128. data/lib/qml/data/list_model_access.rb +44 -0
  129. data/lib/qml/data/query_model.rb +45 -47
  130. data/lib/qml/dispatcher.rb +5 -13
  131. data/lib/qml/engine.rb +9 -58
  132. data/lib/qml/errors.rb +0 -21
  133. data/lib/qml/interface.rb +21 -0
  134. data/lib/qml/js_array.rb +8 -0
  135. data/lib/qml/js_object.rb +69 -0
  136. data/lib/qml/js_util.rb +18 -0
  137. data/lib/qml/plugin_loader.rb +1 -13
  138. data/lib/qml/plugins.rb +3 -17
  139. data/lib/qml/proc_access.rb +28 -0
  140. data/lib/qml/qt.rb +21 -3
  141. data/lib/qml/reactive.rb +147 -8
  142. data/lib/qml/signal.rb +67 -0
  143. data/lib/qml/version.rb +1 -1
  144. data/qml.gemspec +8 -2
  145. data/spec/qml/access_spec.rb +33 -120
  146. data/spec/qml/application_spec.rb +11 -24
  147. data/spec/qml/component_spec.rb +4 -4
  148. data/spec/qml/data/array_model_spec.rb +2 -2
  149. data/spec/qml/data/list_model_spec.rb +2 -2
  150. data/spec/qml/data/query_model_spec.rb +4 -4
  151. data/spec/qml/engine_spec.rb +23 -21
  152. data/spec/qml/interface_spec.rb +20 -0
  153. data/spec/qml/js_array_spec.rb +29 -0
  154. data/spec/qml/js_function_spec.rb +32 -0
  155. data/spec/qml/js_object_spec.rb +113 -0
  156. data/spec/qml/plugin_loader_spec.rb +9 -11
  157. data/spec/qml/qt_spec.rb +9 -0
  158. data/spec/qml/reactive_spec.rb +37 -0
  159. data/spec/qml/signal_connect_spec.rb +27 -0
  160. data/spec/qml/signal_spec.rb +73 -0
  161. data/spec/qml/to_qml_spec.rb +76 -0
  162. data/spec/shared/qml/access_example.rb +21 -0
  163. data/spec/shared/qml/data/list_model.rb +12 -13
  164. data/spec/spec_helper.rb +2 -3
  165. metadata +141 -166
  166. data/examples/imageprovider/imageprovider.rb +0 -57
  167. data/examples/imageprovider/main.qml +0 -51
  168. data/ext/qml/accessclass.cpp +0 -65
  169. data/ext/qml/accessclass.h +0 -19
  170. data/ext/qml/accessobject.cpp +0 -30
  171. data/ext/qml/accessobject.h +0 -22
  172. data/ext/qml/common.h +0 -18
  173. data/ext/qml/conversionerror.h +0 -14
  174. data/ext/qml/ext_accesswrapperfactory.cpp +0 -75
  175. data/ext/qml/ext_accesswrapperfactory.h +0 -39
  176. data/ext/qml/ext_anywrapper.cpp +0 -34
  177. data/ext/qml/ext_anywrapper.h +0 -23
  178. data/ext/qml/ext_kernel.cpp +0 -81
  179. data/ext/qml/ext_kernel.h +0 -9
  180. data/ext/qml/ext_metaobject.cpp +0 -399
  181. data/ext/qml/ext_metaobject.h +0 -60
  182. data/ext/qml/ext_pluginloader.cpp +0 -53
  183. data/ext/qml/ext_pluginloader.h +0 -30
  184. data/ext/qml/ext_pointer.cpp +0 -132
  185. data/ext/qml/ext_pointer.h +0 -41
  186. data/ext/qml/ext_testutil.cpp +0 -40
  187. data/ext/qml/ext_testutil.h +0 -9
  188. data/ext/qml/foreignclass.cpp +0 -72
  189. data/ext/qml/foreignclass.h +0 -88
  190. data/ext/qml/foreignmetaobject.cpp +0 -345
  191. data/ext/qml/foreignmetaobject.h +0 -46
  192. data/ext/qml/foreignobject.cpp +0 -22
  193. data/ext/qml/foreignobject.h +0 -21
  194. data/ext/qml/functioninfo.h +0 -16
  195. data/ext/qml/init.cpp +0 -67
  196. data/ext/qml/kernel.cpp +0 -39
  197. data/ext/qml/kernel.h +0 -32
  198. data/ext/qml/listmodel.cpp +0 -137
  199. data/ext/qml/listmodel.h +0 -45
  200. data/ext/qml/markable.h +0 -12
  201. data/ext/qml/objectdata.cpp +0 -26
  202. data/ext/qml/objectdata.h +0 -20
  203. data/ext/qml/objectgc.cpp +0 -69
  204. data/ext/qml/objectgc.h +0 -28
  205. data/ext/qml/plugins/core/applicationextension.cpp +0 -29
  206. data/ext/qml/plugins/core/applicationextension.h +0 -25
  207. data/ext/qml/plugins/core/componentextension.cpp +0 -41
  208. data/ext/qml/plugins/core/componentextension.h +0 -28
  209. data/ext/qml/plugins/core/contextextension.cpp +0 -39
  210. data/ext/qml/plugins/core/contextextension.h +0 -29
  211. data/ext/qml/plugins/core/core.pro +0 -29
  212. data/ext/qml/plugins/core/coreplugin.cpp +0 -87
  213. data/ext/qml/plugins/core/coreplugin.h +0 -49
  214. data/ext/qml/plugins/core/engineextension.cpp +0 -43
  215. data/ext/qml/plugins/core/engineextension.h +0 -31
  216. data/ext/qml/plugins/core/imageprovider.cpp +0 -38
  217. data/ext/qml/plugins/core/imageprovider.h +0 -18
  218. data/ext/qml/plugins/core/imagerequestpromise.cpp +0 -19
  219. data/ext/qml/plugins/core/imagerequestpromise.h +0 -21
  220. data/ext/qml/plugins/core/qmlexception.cpp +0 -11
  221. data/ext/qml/plugins/core/qmlexception.h +0 -17
  222. data/ext/qml/plugins/testutil/imageprovidertest.cpp +0 -40
  223. data/ext/qml/plugins/testutil/imageprovidertest.h +0 -17
  224. data/ext/qml/plugins/testutil/objectlifechecker.cpp +0 -17
  225. data/ext/qml/plugins/testutil/objectlifechecker.h +0 -24
  226. data/ext/qml/plugins/testutil/ownershiptest.cpp +0 -26
  227. data/ext/qml/plugins/testutil/ownershiptest.h +0 -30
  228. data/ext/qml/plugins/testutil/testobject.cpp +0 -6
  229. data/ext/qml/plugins/testutil/testobject.h +0 -108
  230. data/ext/qml/plugins/testutil/testobjectsubclass.cpp +0 -10
  231. data/ext/qml/plugins/testutil/testobjectsubclass.h +0 -19
  232. data/ext/qml/plugins/testutil/testutil.pro +0 -22
  233. data/ext/qml/plugins/testutil/testutilplugin.cpp +0 -55
  234. data/ext/qml/plugins/testutil/testutilplugin.h +0 -36
  235. data/ext/qml/qmltyperegisterer.cpp +0 -74
  236. data/ext/qml/qmltyperegisterer.h +0 -30
  237. data/ext/qml/rubyclass.cpp +0 -82
  238. data/ext/qml/rubyclass.h +0 -230
  239. data/ext/qml/rubyvalue.cpp +0 -656
  240. data/ext/qml/rubyvalue.h +0 -224
  241. data/ext/qml/signalforwarder.cpp +0 -64
  242. data/ext/qml/signalforwarder.h +0 -29
  243. data/ext/qml/util.cpp +0 -112
  244. data/ext/qml/util.h +0 -82
  245. data/ext/qml/valuereference.cpp +0 -50
  246. data/ext/qml/valuereference.h +0 -22
  247. data/ext/qml/weakvaluereference.cpp +0 -51
  248. data/ext/qml/weakvaluereference.h +0 -21
  249. data/lib/qml/context.rb +0 -71
  250. data/lib/qml/data/error.rb +0 -5
  251. data/lib/qml/dispatchable.rb +0 -34
  252. data/lib/qml/error_converter.rb +0 -16
  253. data/lib/qml/geometry.rb +0 -3
  254. data/lib/qml/geometry/point.rb +0 -5
  255. data/lib/qml/geometry/rectangle.rb +0 -5
  256. data/lib/qml/geometry/size.rb +0 -5
  257. data/lib/qml/image_provider.rb +0 -87
  258. data/lib/qml/init.rb +0 -29
  259. data/lib/qml/meta_object.rb +0 -20
  260. data/lib/qml/models.rb +0 -1
  261. data/lib/qml/qt_classes.rb +0 -9
  262. data/lib/qml/qt_object_base.rb +0 -233
  263. data/lib/qml/reactive/bindable.rb +0 -79
  264. data/lib/qml/reactive/chained_signal.rb +0 -25
  265. data/lib/qml/reactive/error.rb +0 -5
  266. data/lib/qml/reactive/object.rb +0 -293
  267. data/lib/qml/reactive/property.rb +0 -19
  268. data/lib/qml/reactive/signal.rb +0 -115
  269. data/lib/qml/reactive/signal_spy.rb +0 -27
  270. data/lib/qml/reactive/signals/map_signal.rb +0 -21
  271. data/lib/qml/reactive/signals/merge_signal.rb +0 -21
  272. data/lib/qml/reactive/signals/select_signal.rb +0 -21
  273. data/lib/qml/reactive/simple_property.rb +0 -17
  274. data/lib/qml/reactive/unbound_property.rb +0 -42
  275. data/lib/qml/reactive/unbound_signal.rb +0 -51
  276. data/lib/qml/test_util.rb +0 -1
  277. data/lib/qml/test_util/object_life_checker.rb +0 -17
  278. data/lib/qml/wrappable.rb +0 -9
  279. data/spec/qml/context_spec.rb +0 -43
  280. data/spec/qml/conversion_spec.rb +0 -60
  281. data/spec/qml/dispatchable_spec.rb +0 -26
  282. data/spec/qml/dispatcher_spec.rb +0 -71
  283. data/spec/qml/geometry/point_spec.rb +0 -4
  284. data/spec/qml/geometry/rectangle_spec.rb +0 -4
  285. data/spec/qml/geometry/size_spec.rb +0 -4
  286. data/spec/qml/image_provider_spec.rb +0 -33
  287. data/spec/qml/qt_object_base_spec.rb +0 -119
  288. data/spec/qml/reactive/object_spec.rb +0 -249
  289. data/spec/qml/reactive/property_spec.rb +0 -70
  290. data/spec/qml/reactive/signal_spec.rb +0 -191
  291. data/spec/qml/reactive/signal_spy_spec.rb +0 -26
  292. data/spec/qml/reactive/unbound_property_spec.rb +0 -40
  293. data/spec/qml/reactive/unbound_signal_spec.rb +0 -70
  294. data/spec/qml/test_object_spec.rb +0 -186
  295. data/spec/qml/wrappable_spec.rb +0 -10
  296. data/spec/shared/qml/reactive/object.rb +0 -39
@@ -1,67 +0,0 @@
1
- #include "ext_metaobject.h"
2
- #include "ext_pointer.h"
3
- #include "ext_pluginloader.h"
4
- #include "ext_anywrapper.h"
5
- #include "ext_accesswrapperfactory.h"
6
- #include "ext_testutil.h"
7
- #include "ext_kernel.h"
8
- #include "kernel.h"
9
- #include "signalforwarder.h"
10
- #include "valuereference.h"
11
- #include "objectgc.h"
12
- #include "listmodel.h"
13
- #include <QtCore/QSet>
14
-
15
- using namespace RubyQml;
16
-
17
- namespace {
18
-
19
- void defineMetaTypes()
20
- {
21
- qRegisterMetaType<const QMetaObject *>();
22
- }
23
-
24
- void defineClasses()
25
- {
26
- Ext_MetaObject::defineClass();
27
- Ext_Pointer::defineClass();
28
- Ext_PluginLoader::defineClass();
29
- Ext_AnyWrapper::defineClass();
30
- Ext_AccessWrapperFactory::defineClass();
31
- Ext_TestUtil::defineModule();
32
- Ext_Kernel::defineModule();
33
- ListModel::defineUtilMethods();
34
- }
35
-
36
- void setupGlobalGCMarking()
37
- {
38
- auto marker = Ext_AnyWrapper::create(QVariant(), [](const QVariant &) {
39
- ValueReference::markAllReferences();
40
- ObjectGC::instance()->markNonOwnedObjects();
41
- });
42
- rb_gc_register_mark_object(marker);
43
- }
44
-
45
- void cleanup()
46
- {
47
- }
48
-
49
- void setupEndProc()
50
- {
51
- rb_set_end_proc([](VALUE) { cleanup(); }, Qnil);
52
- }
53
-
54
- }
55
-
56
- extern "C"
57
- void Init_qml()
58
- {
59
- rb_require("date");
60
- rb_require("qml/errors");
61
- rb_require("qml/error_converter");
62
-
63
- defineMetaTypes();
64
- defineClasses();
65
- setupGlobalGCMarking();
66
- setupEndProc();
67
- }
@@ -1,39 +0,0 @@
1
- #include "kernel.h"
2
- #include "util.h"
3
- #include <QTimer>
4
-
5
- namespace RubyQml {
6
-
7
- Kernel *Kernel::instance()
8
- {
9
- if (!mInstance) {
10
- fail("QML::UninitializedError", "ruby-qml not yet initialized");
11
- }
12
- return mInstance;
13
- }
14
-
15
- void Kernel::init(const QList<QByteArray> &args)
16
- {
17
- if (mInstance) {
18
- fail("QML::AlreadyInitializedErryr", "ruby-qml already initialized");
19
- }
20
- mInstance = new Kernel(args);
21
- }
22
-
23
- Kernel::Kernel(const QList<QByteArray> &args)
24
- {
25
- mArgc = args.size();
26
- mArgData = args;
27
- mArgv = new char*[mArgc];
28
- std::transform(mArgData.begin(), mArgData.end(), mArgv, [](QByteArray &ba) { return ba.data(); });
29
-
30
- mApplication = new QApplication(mArgc, mArgv);
31
- mEngine = new QQmlEngine();
32
- mEventLoopHookTimer = new QTimer();
33
- mEventLoopHookTimer->setInterval(0);
34
- mEventLoopHookTimer->setSingleShot(false);
35
- }
36
-
37
- Kernel *Kernel::mInstance = nullptr;
38
-
39
- } // namespace RubyQml
@@ -1,32 +0,0 @@
1
- #pragma once
2
-
3
- #include <QList>
4
- #include <QApplication>
5
- #include <QQmlEngine>
6
-
7
- namespace RubyQml {
8
-
9
- class Kernel
10
- {
11
- public:
12
- QApplication *application() { return mApplication; }
13
- QQmlEngine *engine() { return mEngine; }
14
- QTimer *eventLoopHookTimer() { return mEventLoopHookTimer; }
15
-
16
- static bool initialized() { return mInstance; }
17
- static void init(const QList<QByteArray> &args);
18
- static Kernel *instance();
19
-
20
- private:
21
- Kernel(const QList<QByteArray> &args);
22
- static Kernel *mInstance;
23
-
24
- QList<QByteArray> mArgData;
25
- int mArgc;
26
- char **mArgv;
27
- QApplication *mApplication = nullptr;
28
- QQmlEngine *mEngine = nullptr;
29
- QTimer *mEventLoopHookTimer = nullptr;
30
- };
31
-
32
- } // namespace RubyQml
@@ -1,137 +0,0 @@
1
- #include "listmodel.h"
2
- #include "rubyclass.h"
3
- #include <QMetaObject>
4
- #include <QMetaMethod>
5
-
6
- namespace RubyQml {
7
-
8
- ListModel::ListModel(RubyValue rubyModel, QObject *parent) :
9
- QAbstractListModel(parent),
10
- mRubyModel(rubyModel)
11
- {
12
- auto columns = rubyModel.send("columns").to<QList<QByteArray>>();
13
- for (int i = 0; i < columns.size(); ++i) {
14
- auto role = Qt::UserRole + i;
15
- mColumnNames[role] = columns[i];
16
- mColumnIDs[role] = rb_intern(columns[i]);
17
- }
18
- rubyModel.send("qt_models").send("push", RubyValue::fromQObject(this, false));
19
- }
20
-
21
- ListModel::~ListModel()
22
- {
23
- mRubyModel.send("qt_models").send("delete", RubyValue::fromQObject(this, false));
24
- }
25
-
26
- QHash<int, QByteArray> ListModel::roleNames() const
27
- {
28
- return mColumnNames;
29
- }
30
-
31
- QVariant ListModel::data(const QModelIndex &index, int role) const
32
- {
33
- if (!index.isValid()) {
34
- return QVariant();
35
- }
36
-
37
- QVariant result;
38
- withGvl([&] {
39
- RubyValue value;
40
- rescueNotify([&] {
41
- auto subscribe = RUBYQML_INTERN("[]");
42
- auto record = rb_funcall(mRubyModel, subscribe, 1, INT2NUM(index.row()));
43
- value = rb_funcall(record, subscribe, 1, ID2SYM(mColumnIDs[role]));
44
- });
45
- result = value.toVariant();
46
- });
47
- return result;
48
- }
49
-
50
- int ListModel::rowCount(const QModelIndex &parent) const
51
- {
52
- if (parent.isValid()) {
53
- return 0;
54
- }
55
- int count;
56
- withGvl([&] {
57
- rescueNotify([&] {
58
- count = NUM2INT(rb_funcall(mRubyModel, RUBYQML_INTERN("count"), 0));
59
- });
60
- });
61
- return count;
62
- }
63
-
64
- QModelIndex ListModel::index(int row, int column, const QModelIndex &parent) const
65
- {
66
- if (parent.isValid()) {
67
- return QModelIndex();
68
- }
69
- return createIndex(row, column);
70
- }
71
-
72
- void ListModel::beginMove(int first, int last, int destination)
73
- {
74
- beginMoveRows(QModelIndex(), first, last ,QModelIndex(), destination);
75
- }
76
-
77
- void ListModel::endMove()
78
- {
79
- endMoveRows();
80
- }
81
-
82
- void ListModel::beginInsert(int first, int last)
83
- {
84
- beginInsertRows(QModelIndex(), first, last);
85
- }
86
-
87
- void ListModel::endInsert()
88
- {
89
- endInsertRows();
90
- }
91
-
92
- void ListModel::beginRemove(int first, int last)
93
- {
94
- beginRemoveRows(QModelIndex(), first, last);
95
- }
96
-
97
- void ListModel::endRemove()
98
- {
99
- endRemoveRows();
100
- }
101
-
102
- void ListModel::beginReset()
103
- {
104
- beginResetModel();
105
- }
106
-
107
- void ListModel::endReset()
108
- {
109
- endResetModel();
110
- }
111
-
112
- void ListModel::update(int first, int last)
113
- {
114
- emit dataChanged(index(first), index(last));
115
- }
116
-
117
- void ListModel::gc_mark()
118
- {
119
- rb_gc_mark(mRubyModel);
120
- }
121
-
122
- namespace {
123
-
124
- RubyValue createWrapper(RubyValue self)
125
- {
126
- return RubyValue::fromQObject(new ListModel(self), false);
127
- }
128
-
129
- }
130
-
131
- void ListModel::defineUtilMethods()
132
- {
133
- auto klass = RubyClass(RubyModule(RubyModule("QML"), "Data"), "ListModel");
134
- klass.defineMethod("create_wrapper", RUBYQML_FUNCTION_INFO(&createWrapper));
135
- }
136
-
137
- } // namespace RubyQml
@@ -1,45 +0,0 @@
1
- #pragma once
2
-
3
- #include "markable.h"
4
- #include "rubyvalue.h"
5
- #include <QAbstractListModel>
6
-
7
- namespace RubyQml {
8
-
9
- class ListModel : public QAbstractListModel, public Markable
10
- {
11
- Q_OBJECT
12
- public:
13
- explicit ListModel(RubyValue rubyModel, QObject *parent = 0);
14
- ~ListModel();
15
-
16
- RubyValue rubyModel() { return mRubyModel; }
17
-
18
- QHash<int, QByteArray> roleNames() const override;
19
-
20
- QVariant data(const QModelIndex &index, int role) const override;
21
- int rowCount(const QModelIndex &parent) const override;
22
- QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override;
23
-
24
- void gc_mark() override;
25
-
26
- static void defineUtilMethods();
27
-
28
- public slots:
29
- void beginMove(int first, int last, int destination);
30
- void endMove();
31
- void beginInsert(int first, int last);
32
- void endInsert();
33
- void beginRemove(int first, int last);
34
- void endRemove();
35
- void beginReset();
36
- void endReset();
37
- void update(int first, int last);
38
-
39
- private:
40
- RubyValue mRubyModel;
41
- QHash<int, QByteArray> mColumnNames;
42
- QHash<int, ID> mColumnIDs;
43
- };
44
-
45
- } // namespace RubyQml
@@ -1,12 +0,0 @@
1
- #pragma once
2
-
3
- namespace RubyQml {
4
-
5
- class Markable
6
- {
7
- public:
8
- virtual ~Markable() {}
9
- virtual void gc_mark() = 0;
10
- };
11
-
12
- } // namespace RubyQml
@@ -1,26 +0,0 @@
1
- #include "objectdata.h"
2
-
3
- namespace RubyQml {
4
-
5
- ObjectData::ObjectData(QObject *target) :
6
- QObject(target)
7
- {
8
- }
9
-
10
- ObjectData *ObjectData::getOrCreate(QObject *target)
11
- {
12
- for (auto child : target->children()) {
13
- auto data = dynamic_cast<ObjectData *>(child);
14
- if (data) {
15
- return data;
16
- }
17
- }
18
- return new ObjectData(target);
19
- }
20
-
21
- void ObjectData::gc_mark()
22
- {
23
- rb_gc_mark(rubyObject);
24
- }
25
-
26
- } // namespace RubyQml
@@ -1,20 +0,0 @@
1
- #pragma once
2
- #include <QObject>
3
- #include "rubyvalue.h"
4
- #include "markable.h"
5
-
6
- namespace RubyQml {
7
-
8
- class ObjectData : public QObject, public Markable
9
- {
10
- public:
11
- ObjectData(QObject *target);
12
- RubyValue rubyObject;
13
- bool owned = false;
14
-
15
- void gc_mark() override;
16
-
17
- static ObjectData *getOrCreate(QObject *target);
18
- };
19
-
20
- } // namespace RubyQml
@@ -1,69 +0,0 @@
1
- #include "objectgc.h"
2
- #include "markable.h"
3
- #include "objectdata.h"
4
- #include <QObject>
5
- #include <QDebug>
6
- #include <QBuffer>
7
-
8
- namespace RubyQml {
9
-
10
- void ObjectGC::addObject(QObject *obj)
11
- {
12
- mObjects << obj;
13
- connect(obj, &QObject::destroyed, this, [this](QObject *obj) {
14
- mObjects.remove(obj);
15
- });
16
- }
17
-
18
- void ObjectGC::mark(QObject *obj, bool markOwned)
19
- {
20
- auto objData = dynamic_cast<ObjectData *>(obj);
21
- if (!markOwned) {
22
- if (objData && objData->owned) {
23
- return;
24
- }
25
- }
26
-
27
- auto markable = dynamic_cast<Markable *>(obj);
28
- if (markable) {
29
- debug() << "\u270F\uFE0F marking object:" << obj << "parent:" << obj->parent();
30
- markable->gc_mark();
31
- }
32
- for (auto child : obj->children()) {
33
- mark(child, markOwned);
34
- }
35
- }
36
-
37
- void ObjectGC::markOwnedObject(QObject *obj)
38
- {
39
- mark(obj, true);
40
- }
41
-
42
- void ObjectGC::markNonOwnedObjects()
43
- {
44
- for (auto obj : mObjects) {
45
- mark(obj, false);
46
- }
47
- }
48
-
49
- QDebug ObjectGC::debug()
50
- {
51
- static auto emptyBuffer = [] {
52
- auto buf = new QBuffer();
53
- buf->open(QIODevice::WriteOnly);
54
- return buf;
55
- }();
56
- if (mDebugMessageEnabled) {
57
- return qDebug();
58
- } else {
59
- return QDebug(emptyBuffer);
60
- }
61
- }
62
-
63
- ObjectGC *ObjectGC::instance()
64
- {
65
- static auto gc = new ObjectGC();
66
- return gc;
67
- }
68
-
69
- } // namespace RubyQml